crypt
— Функция для проверки паролей Unix¶
Исходный код: Lib/crypt.py
Утратил актуальность с версии 3.11, будет удален в версии 3.13: Модуль crypt
устарел (подробности и альтернативные варианты см. в разделе PEP 594). Модуль hashlib
может быть заменен в некоторых случаях использования. Пакет passlib может заменить все варианты использования этого модуля.
Этот модуль реализует интерфейс к процедуре crypt(3), которая представляет собой одностороннюю хэш-функцию, основанную на модифицированном алгоритме DES; более подробную информацию смотрите на странице руководства Unix. Возможные варианты использования включают хранение хэшированных паролей, чтобы вы могли проверять пароли, не сохраняя фактический пароль, или попытки взлома паролей Unix с помощью словаря.
Обратите внимание, что поведение этого модуля зависит от фактической реализации процедуры crypt(3) в запущенной системе. Таким образом, любые расширения, доступные в текущей реализации, также будут доступны в этом модуле.
Availability: Unix, а не VxWorks.
Availability: это не Emscripten, это был не я.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten
и wasm32-wasi
. Дополнительную информацию смотрите в разделе Платформы веб-сборки.
Методы хэширования¶
Добавлено в версии 3.3.
Модуль crypt
определяет список методов хэширования (не все методы доступны на всех платформах).:
- crypt.METHOD_SHA512¶
Метод модульного криптографического формата с 16-символьной солью и 86-символьным хэшем, основанный на хэш-функции SHA512. Это самый надежный метод.
- 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]
, за исключением формата Modular Crypt, который имеет префикс$digit$
.Возвращает хэшированный пароль в виде строки, которая будет состоять из символов того же алфавита, что и соль.
Поскольку несколько расширений crypt(3) допускают разные значения с разными размерами в salt, рекомендуется использовать полный зашифрованный пароль в качестве соли при проверке пароля.
Изменено в версии 3.3: Принимайте значения
crypt.METHOD_*
в дополнение к строкам для salt.
- crypt.mksalt(method=None, *, rounds=None)¶
Возвращает случайно сгенерированную соль указанного метода. Если метод не указан, используется самый надежный метод, доступный в
methods
.Возвращаемое значение представляет собой строку, подходящую для передачи в качестве аргумента salt в
crypt()
.раунды указывает количество раундов для
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: Добавлен параметр округления.
Примеры¶
Простой пример, иллюстрирующий типичное использование (операция сравнения с постоянным временем необходима для ограничения подверженности атакам по времени. 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")