Документация Python неофициальный перевод
Содержание страницы

crypt – Функция для проверки паролей Unixcrypt – Function to check Unix passwords

Исходный код: Lib/crypt.py

Устарело с версии 3.11, будет удалено в версии 3.13: Модуль crypt устарел (см. PEP 594 для подробностей и альтернатив). Модуль hashlib является потенциальной заменой для некоторых вариантов использования. Пакет passlib может заменить все варианты использования этого модуля.


Этот модуль реализует интерфейс к функции crypt(3), которая представляет собой одностороннюю хеш-функцию, основанную на модифицированном алгоритме DES; подробнее см. в man-странице Unix. Возможные применения включают хранение хешированных паролей, чтобы можно было проверять пароли без хранения фактического пароля, или попытки взлома паролей Unix с помощью словаря.

Обратите внимание, что поведение этого модуля зависит от фактической реализации функции crypt(3) в работающей системе. Поэтому любые расширения, доступные в текущей реализации, также будут доступны в этом модуле.

Доступность: Unix, не VxWorks.

Доступность: not Emscripten, not WASI.

Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. См. платформы WebAssembly для получения дополнительной информации.

Методы хешированияHashing Methods

Добавлено в версии 3.3.

Модуль crypt определяет список методов хеширования (не все методы доступны на всех платформах):

crypt.METHOD_SHA512

Метод формата Modular Crypt Format с солью из 16 символов и хешем из 86 символов, основанный на хеш-функции SHA-512. Это самый надежный метод.

crypt.METHOD_SHA256

Другой метод формата Modular Crypt Format с солью из 16 символов и хешем из 43 символов, основанный на хеш-функции SHA-256.

crypt.METHOD_BLOWFISH

Другой метод формата Modular Crypt Format с солью из 22 символов и хешем из 31 символа, основанный на шифре Blowfish.

Добавлено в версии 3.7.

crypt.METHOD_MD5

Другой метод формата Modular Crypt Format с солью из 8 символов и хешем из 22 символов, основанный на хеш-функции MD5.

crypt.METHOD_CRYPT

Традиционный метод с солью из 2 символов и хешем из 13 символов. Это самый слабый метод.

Атрибуты модуляModule Attributes

Добавлено в версии 3.3.

crypt.methods

Список доступных алгоритмов хеширования паролей в виде объектов crypt.METHOD_*. Этот список отсортирован от самого надежного к самому слабому.

Функции модуляModule Functions

Модуль 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 Format, который добавляет префикс $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.

ПримерыExamples

Простой пример, иллюстрирующий типовое использование (сравнение за постоянное время необходимо для ограничения подверженности атакам по времени. 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")