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