Сообщить об ошибке.

Модуль crypt в Python, хеширование паролей

Функции для хеширования и проверки хешированных паролей

Модуль 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("Хешированная версия не совпадает с оригиналом")