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")