crypt — Функция проверки паролей Unix
Исходный код: Lib/crypt.py
Этот модуль реализует интерфейс к функции crypt(3), которая является односторонней хеш-функцией, основанной на модифицированном алгоритме DES; для получения дополнительных сведений см. страницу руководства Unix. Возможные применения включают хранение хешированных паролей, чтобы вы могли проверять пароли, не храня фактический пароль, или попытки взлома паролей Unix с помощью словаря.
Обратите внимание, что поведение этого модуля зависит от фактической реализации функции crypt(3) в работающей системе. Поэтому все расширения, доступные в текущей реализации, также будут доступны в этом модуле.
1. Методы хеширования
Новое в версии 3.3.
Модуль crypt определяет список методов хеширования (не все методы доступны на всех платформах):
-
crypt.METHOD_SHA512 -
Метод формата модулярного шифрования с солью из 16 символов и хешем из 86 символов. Это самый надежный метод.
-
crypt.METHOD_SHA256 -
Другой метод модулярного формата шифрования с солью из 16 символов и хешем из 43 символов.
-
crypt.METHOD_MD5 -
Еще один метод модулярного формата шифрования с солью из 8 символов и хешем из 22 символов.
-
crypt.METHOD_CRYPT -
Традиционный метод с солью из 2 символов и 13 символов хеша. Это наименее надежный метод.
2. Атрибуты модуля
Новое в версии 3.3.
-
crypt.methods -
Список доступных алгоритмов хеширования паролей, представленных как объекты
crypt.METHOD_*. Этот список отсортирован от наиболее к наименее надежным и гарантированно содержит как минимумcrypt.METHOD_CRYPT.
3. Функции модуля
Модуль 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) -
Возвращает случайно сгенерированную соль указанного метода. Если method не указан, используется самый надёжный доступный метод, возвращаемый
methods().Возвращаемое значение — это строка длиной либо 2 символа для
crypt.METHOD_CRYPT, либо 19 символов, начинающаяся с$digit$, и 16 случайных символов из набора[./a-zA-Z0-9], подходящая для передачи в качестве аргумента salt функцииcrypt().Новое в версии 3.3.
4. Примеры
Простой пример, иллюстрирующий типичное использование (для ограничения воздействия атак на время требуется операция сравнения с постоянным временем. 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.5/library/crypt.html