Документация Python неофициальный перевод
Содержание страницы

crypt – Функция для проверки паролей Unixcrypt – Function to check Unix passwords

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


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

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

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

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

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

crypt.METHOD_SHA512

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

crypt.METHOD_SHA256

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

crypt.METHOD_BLOWFISH

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

Добавлено в версии 3.7.

crypt.METHOD_MD5

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

crypt.METHOD_CRYPT

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

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

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

crypt.methods

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

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

Модуль 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.

ПримерыExamples

Простой пример, иллюстрирующий типовое использование (сравнение за постоянное время необходимо для ограничения подверженности атакам по времени. 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")