Модуль crypt
реализует хеширование паролей на основе функции crypt(3)
, которая является односторонней хеш-функцией, основанной на модифицированном алгоритме DES
. Возможное использование включает хранение хешированных паролей, чтобы вы могли проверять пароли, не сохраняя действительный пароль или пытаться взломать пароли Unix с помощью словаря.
ВНИМАНИЕ! Модуль
crypt
будет удален из стандартной библиотеки с версии Python 3.13. С версии Python 3.11 будет выдаваться предупреждение об устаревании.Причина удаления: Модуль
crypt
реализует хеширование паролей, в основном, старыми, некачественными и небезопасными алгоритмами. Пользователям не рекомендуется их использовать.
- Модуль недоступен в Windows. Кроссплатформенные приложения в любом случае нуждаются в альтернативной реализации.
- Доступно только шифрование DES. DES имеет крайне ограниченное пространство ключей 2**56.
- MD5, SHA256 с солью, SHA512 с солью и Blowfish являются необязательными расширениями. SSHA256 и SSHA512 являются расширениями
glibc
. Blowfish (bcrypt
) - единственный безопасный алгоритм. Однако он находится вglibc
и поэтому обычно не доступен в Linux.- В зависимости от платформы, модуль
crypt
не является потокобезопасным. Только реализации сcrypt_r(3)
являются потокобезопасными.- Модуль никогда не был полезен для взаимодействия с системными базами данных пользователей и паролей. В BSD, macOS и Linux все операции аутентификации пользователя и изменения пароля должны проходить через PAM (подключаемый модуль аутентификации).
Чем можно заменить: модулем стандартной библиотеки
hashlib
.
Обратите внимание, что поведение модуля crypt
зависит от фактической реализации подпрограммы crypt(3)
в работающей системе. Поэтому любые расширения, доступные в текущей реализации, также будут доступны в этом модуле.
Доступность: Unix. Недоступно на VxWorks и Windows.
Простой пример, иллюстрирующий типичное использование. Операция сравнения с постоянным временем необходима для ограничения подверженности атакам времени. Для этой цели подходит 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("Хешированная версия не совпадает с оригиналом")