Содержание страницы
crypt – Функция для проверки паролей Unix¶crypt – Function to check Unix passwords
Исходный код: Lib/crypt.py
Устарело с версии 3.11:Модуль crypt устарел
(см. PEP 594 для подробностей и альтернатив).
Модуль hashlib – потенциальная замена для некоторых вариантов использования.
Этот модуль реализует интерфейс к функции crypt(3), которая представляет собой одностороннюю хеш-функцию, основанную на модифицированном алгоритме DES; подробнее см. в man-странице Unix. Возможные применения включают хранение хешированных паролей, чтобы можно было проверять пароли без хранения фактического пароля, или попытки взлома паролей Unix с помощью словаря.
Обратите внимание, что поведение этого модуля зависит от фактической реализации функции crypt(3) в работающей системе. Поэтому любые расширения, доступные в текущей реализации, также будут доступны в этом модуле.
Доступность: Unix. Недоступна на VxWorks.
Методы хеширования¶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")