Spec-Zone.ru › Python 3.6

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

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

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

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

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

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

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

crypt.METHOD_SHA512

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

crypt.METHOD_SHA256

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

crypt.METHOD_MD5

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

crypt.METHOD_CRYPT

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

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

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

crypt.methods

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

35.5.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.

35.5.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.6/library/crypt.html

Spec-Zone.ru

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