Spec-Zone.ru › Python 3.5

crypt — Функция проверки паролей Unix

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

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

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

1. Методы хеширования

Новое в версии 3.3.

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

crypt.METHOD_SHA512

Метод формата модулярного шифрования с солью из 16 символов и хешем из 86 символов. Это самый надежный метод.

crypt.METHOD_SHA256

Другой метод модулярного формата шифрования с солью из 16 символов и хешем из 43 символов.

crypt.METHOD_MD5

Еще один метод модулярного формата шифрования с солью из 8 символов и хешем из 22 символов.

crypt.METHOD_CRYPT

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

2. Атрибуты модуля

Новое в версии 3.3.

crypt.methods

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

3. Функции модуля

Модуль crypt определяет следующие функции:

crypt.crypt(word, salt=None)

word обычно является паролем пользователя, введённым в приглашении или графическом интерфейсе. Необязательная salt — это строка, возвращаемая функцией mksalt(), одно из значений crypt.METHOD_* (хотя не все могут быть доступны на всех платформах) или полный зашифрованный пароль, включая соль, возвращаемый этой функцией. Если salt не указан, используется самый надёжный метод (как возвращается methods().

Проверка пароля обычно выполняется путём передачи простого пароля как word и полных результатов предыдущего вызова crypt(), которые должны быть такими же, как результаты этого вызова.

salt (либо случайная строка из 2 или 16 символов, возможно, с префиксом $digit$, чтобы указать метод), которая используется для нарушения алгоритма шифрования. Символы в salt должны принадлежать набору [./a-zA-Z0-9], за исключением формата модулярного шифрования, где используется префикс $digit$.

Возвращает хешированный пароль в виде строки, который будет состоять из символов из того же алфавита, что и соль.

Поскольку некоторые расширения crypt(3) допускают разные значения, с разными размерами в salt, рекомендуется использовать полный зашифрованный пароль в качестве соли при проверке пароля.

Изменено в версии 3.3: Принимает значения crypt.METHOD_* в дополнение к строкам для salt.

crypt.mksalt(method=None)

Возвращает случайно сгенерированную соль указанного метода. Если method не указан, используется самый надёжный доступный метод, возвращаемый methods().

Возвращаемое значение — это строка длиной либо 2 символа для crypt.METHOD_CRYPT, либо 19 символов, начинающаяся с $digit$, и 16 случайных символов из набора [./a-zA-Z0-9], подходящая для передачи в качестве аргумента salt функции crypt().

Новое в версии 3.3.

4. Примеры

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

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/crypt.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API