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")
Вернуться на верх