crypt — Функция проверки паролей Unix
Исходный код: Lib/crypt.py
Этот модуль реализует интерфейс к функции crypt(3), которая представляет собой одностороннюю хеш-функцию, основанную на модифицированном алгоритме DES; см. страницу Unix man для получения дополнительных сведений. Возможные применения включают хранение хешированных паролей, чтобы вы могли проверять пароли, не храня фактический пароль, или попытки взлома паролей Unix с помощью словаря.
Обратите внимание, что поведение этого модуля зависит от фактической реализации функции crypt(3) в рабочей системе. Поэтому все расширения, доступные в текущей реализации, также будут доступны в этом модуле.
Доступность: Unix. Недоступно в VxWorks.
Методы хеширования
Новое в версии 3.3.
Модуль crypt определяет список методов хеширования (не все методы доступны на всех платформах):
-
crypt.METHOD_SHA512 -
Метод формата Modular Crypt с солью из 16 символов и хешем из 86 символов, основанный на функции хеширования SHA-512. Это самый надежный метод.
-
crypt.METHOD_SHA256 -
Другой метод формата Modular Crypt с солью из 16 символов и хешем из 43 символов, основанный на функции хеширования SHA-256.
-
crypt.METHOD_BLOWFISH -
Еще один метод формата Modular Crypt с солью из 22 символов и хешем из 31 символа, основанный на шифре Blowfish.
Новое в версии 3.7.
-
crypt.METHOD_MD5 -
Еще один метод формата Modular Crypt с солью из 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) -
Возвращает случайную соль заданного метода. Если 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.
Примеры
Простой пример, иллюстрирующий типичное использование (необходима операция сравнения с постоянным временем для ограничения воздействия атак на основе времени. 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")
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/crypt.html