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