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

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

Не рекомендуется, начиная с версии 3.11: Модуль crypt является устаревшим (подробности и альтернативы см. в PEP 594). Модуль hashlib является потенциальной заменой для некоторых случаев использования.


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

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

Availability: Unix. Недоступно на VxWorks.

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

Добавлено в версии 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 символов. Это самый слабый метод.

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

Добавлено в версии 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)

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