Spec-Zone.ru › Python 3.8

crypt — Функция проверки паролей Unix

Исходный код: Lib/crypt.py

Этот модуль реализует интерфейс к функции crypt(3), которая представляет собой одностороннюю хеш-функцию, основанную на модифицированном алгоритме DES; см. страницу Unix man для получения дополнительных сведений. Возможные применения включают хранение хешированных паролей, чтобы вы могли проверять пароли, не храня фактический пароль, или попытки взлома паролей Unix с помощью словаря.

Обратите внимание, что поведение этого модуля зависит от фактической реализации функции crypt(3) в рабочей системе. Поэтому все расширения, доступные в текущей реализации, также будут доступны в этом модуле.

Доступность: Unix. Недоступно в VxWorks.

Методы хеширования

Новое в версии 3.3.

Модуль crypt определяет список методов хеширования (не все методы доступны на всех платформах):

crypt.METHOD_SHA512

Метод формата Modular Crypt с солью из 16 символов и хешем из 86 символов, основанный на функции хеширования SHA-512. Это самый надежный метод.

crypt.METHOD_SHA256

Другой метод формата Modular Crypt с солью из 16 символов и хешем из 43 символов, основанный на функции хеширования SHA-256.

crypt.METHOD_BLOWFISH

Еще один метод формата Modular Crypt с солью из 22 символов и хешем из 31 символа, основанный на шифре Blowfish.

Новое в версии 3.7.

crypt.METHOD_MD5

Еще один метод формата Modular Crypt с солью из 8 символов и хешем из 22 символов, основанный на функции хеширования MD5.

crypt.METHOD_CRYPT

Традиционный метод с солью из 2 символов и 13 символов хеша. Это наименее надежный метод.

Атрибуты модуля

Новое в версии 3.3.

crypt.methods

Список доступных алгоритмов хеширования паролей в виде объектов crypt.METHOD_*. Этот список отсортирован от самого надежного к наименее надежному.

Функции модуля

Модуль crypt определяет следующие функции:

crypt.crypt(word, salt=None)

word обычно представляет собой пароль пользователя, введенный в командной строке или графическом интерфейсе. Необязательная salt — это строка, возвращаемая из mksalt(), одно из значений crypt.METHOD_* (хотя не все могут быть доступны на всех платформах) или полный зашифрованный пароль, включая соль, возвращаемый этой функцией. Если salt не указан, будет использован самый надежный метод (как возвращает methods()).

Проверка пароля обычно выполняется путем передачи простого текста пароля как word и полного результата предыдущего вызова crypt(), который должен быть таким же, как результаты этого вызова.

salt (либо случайная строка из 2 или 16 символов, возможно, с префиксом $digit$ для указания метода), которая будет использоваться для возмущения алгоритма шифрования. Символы в salt должны принадлежать набору [./a-zA-Z0-9], за исключением формата Modular Crypt Format, который добавляет префикс $digit$.

Возвращает хешированный пароль в виде строки, состоящей из символов из того же алфавита, что и соль.

Поскольку некоторые расширения crypt(3) позволяют использовать различные значения с разными размерами в salt, рекомендуется использовать полный зашифрованный пароль в качестве соли при проверке пароля.

Изменено в версии 3.3: Принимает значения crypt.METHOD_* в дополнение к строкам для salt.

crypt.mksalt(method=None, *, rounds=None)

Возвращает случайную соль заданного метода. Если method не указан, используется самый надежный доступный метод, возвращаемый methods().

Возвращаемое значение — строка, подходящая для передачи в качестве аргумента salt к crypt().

rounds указывает количество раундов для METHOD_SHA256, METHOD_SHA512 и METHOD_BLOWFISH. Для METHOD_SHA256 и METHOD_SHA512 оно должно быть целым числом от 1000 до 999_999_999, по умолчанию 5000. Для METHOD_BLOWFISH оно должно быть степенью двойки от 16 (24) до 2_147_483_648 (231), по умолчанию 4096 (212).

Новое в версии 3.3.

Изменено в версии 3.7: Добавлен параметр rounds.

Примеры

Простой пример, иллюстрирующий типичное использование (необходима операция сравнения с постоянным временем для ограничения воздействия атак на основе времени. hmac.compare_digest() подходит для этой цели):

import pwd
import crypt
import getpass
from hmac import compare_digest as compare_hash

def login():
    username = input('Python login: ')
    cryptedpasswd = pwd.getpwnam(username)[1]
    if cryptedpasswd:
        if cryptedpasswd == 'x' or cryptedpasswd == '*':
            raise ValueError('no support for shadow passwords')
        cleartext = getpass.getpass()
        return compare_hash(crypt.crypt(cleartext, cryptedpasswd), cryptedpasswd)
    else:
        return True

Чтобы сгенерировать хеш пароля, используя самый надежный доступный метод, и проверить его на соответствие оригинальному:

import crypt
from hmac import compare_digest as compare_hash

hashed = crypt.crypt(plaintext)
if not compare_hash(hashed, crypt.crypt(plaintext, hashed)):
    raise ValueError("hashed version doesn't validate against original")

© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/crypt.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API