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

15.1. hashlib – Безопасные хеши и дайджесты сообщенийhashlib – Secure hashes and message digests

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


Этот модуль реализует общий интерфейс для множества различных алгоритмов безопасного хеширования и дайджестов сообщений. Включены алгоритмы безопасного хеширования FIPS: SHA1, SHA224, SHA256, SHA384 и SHA512 (определены в FIPS 180-2), а также алгоритм MD5 от RSA (определён в RFC 1321). Термины «безопасный хеш» и «дайджест сообщения» взаимозаменяемы. Старые алгоритмы назывались дайджестами сообщений. Современный термин – безопасный хеш.

Примечание

Если вам нужны хеш-функции adler32 или crc32, они доступны в модуле zlib.

Предупреждение

Некоторые алгоритмы имеют известные уязвимости к коллизиям хешей; обратитесь к разделу «См. также» в конце.

15.1.1. Алгоритмы хешированияHash algorithms

Для каждого типа хеша существует один метод-конструктор. Все они возвращают объект хеша с одинаковым простым интерфейсом. Например: используйте sha1() для создания объекта хеша SHA1. Теперь можно передавать этому объекту байтоподобные объекты (обычно bytes) с помощью метода update(). В любой момент можно запросить у него дайджест всех переданных на данный момент данных, используя методы digest() или hexdigest().

Примечание

Для повышения производительности в многопоточных приложениях GIL Python освобождается для данных размером более 2047 байт при создании объекта или обновлении.

Примечание

Передача строковых объектов в update() не поддерживается, поскольку хеши работают с байтами, а не с символами.

Конструкторы алгоритмов хеширования, которые всегда присутствуют в этом модуле: md5(), sha1(), sha224(), sha256(), sha384(), и sha512(). Дополнительные алгоритмы могут быть доступны в зависимости от библиотеки OpenSSL, которую Python использует на платформе.

Например, чтобы получить дайджест байтовой строки b'Nobody inspects the spammish repetition':

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.digest_size
16
>>> m.block_size
64

Более компактно:

>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
hashlib.new(name[, data])

Это универсальный конструктор, который принимает строковое имя желаемого алгоритма в качестве первого параметра. Он также существует для обеспечения доступа к перечисленным выше хешам, а также к любым другим алгоритмам, которые может предложить ваша библиотека OpenSSL. Именованные конструкторы намного быстрее, чем new(), и их следует предпочитать.

Использование new() с алгоритмом, предоставляемым OpenSSL:

>>> h = hashlib.new('ripemd160')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'

Hashlib предоставляет следующие константные атрибуты:

hashlib.algorithms_guaranteed

Множество, содержащее имена алгоритмов хеширования, которые гарантированно поддерживаются этим модулем на всех платформах.

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

hashlib.algorithms_available

Множество, содержащее имена хеш-алгоритмов, доступных в работающем интерпретаторе Python. Эти имена будут распознаны при передаче в new(). algorithms_guaranteed всегда будет подмножеством. Один и тот же алгоритм может появляться в этом множестве несколько раз под разными именами (благодаря OpenSSL).

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

Следующие значения предоставляются в качестве константных атрибутов хеш-объектов, возвращаемых конструкторами:

hash.digest_size

Размер результирующего хеша в байтах.

hash.block_size

Внутренний размер блока хэш-алгоритма в байтах.

Хэш-объект имеет следующие атрибуты:

hash.name

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

Изменено в версии 3.4: Атрибут name присутствует в CPython с самого начала, но до Python 3.4 не был формально определён, поэтому может отсутствовать на некоторых платформах.

Хеш-объект имеет следующие методы:

hash.update(arg)

Обновляет объект хеша с помощью объекта arg, который должен быть интерпретируемым как буфер байтов. Повторные вызовы эквивалентны одному вызову с конкатенацией всех аргументов: m.update(a); m.update(b) эквивалентно m.update(a+b).

Изменено в версии 3.1: GIL Python освобождается, чтобы другие потоки могли выполняться, пока происходит обновление хеша для данных размером более 2047 байт при использовании алгоритмов хеширования, предоставляемых OpenSSL.

hash.digest()

Возвращает дайджест данных, переданных методу update() на данный момент. Это байтовый объект размером digest_size, который может содержать байты во всём диапазоне от 0 до 255.

hash.hexdigest()

Как digest(), за исключением того, что дайджест возвращается в виде строкового объекта двойной длины, содержащего только шестнадцатеричные цифры. Это можно использовать для безопасного обмена значением в электронной почте или других недвоичных средах.

hash.copy()

Возвращает копию («клон») хеш-объекта. Это можно использовать для эффективного вычисления дайджестов данных, имеющих общую начальную подстроку.

15.1.2. Выработка ключейKey derivation

Алгоритмы вывода ключей и растяжения ключей предназначены для безопасного хэширования паролей. Простые алгоритмы, такие как sha1(password), не устойчивы к атакам полным перебором. Хорошая функция хэширования паролей должна быть настраиваемой, медленной и включать соль.

hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)

Функция реализует функцию вывода ключей на основе пароля PKCS#5 версии 2. Она использует HMAC в качестве псевдослучайной функции.

Строка hash_name – это желаемое имя алгоритма хэширования для HMAC, например 'sha1' или 'sha256'. password и salt интерпретируются как буферы байтов. Приложениям и библиотекам следует ограничивать password разумной длиной (например, 1024). salt должна содержать около 16 или более байтов из надёжного источника, например os.urandom().

Количество итераций должно выбираться на основе алгоритма хеширования и вычислительной мощности. По состоянию на 2013 год рекомендуется не менее 100 000 итераций SHA-256.

dklen – это длина производного ключа. Если dklen равен None, то используется размер дайджеста алгоритма хеширования hash_name, например, 64 для SHA-512.

>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)
b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'

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

Примечание

Быстрая реализация pbkdf2_hmac доступна в OpenSSL. Реализация на Python использует встроенную версию hmac. Она примерно в три раза медленнее и не освобождает GIL.

См. также

Модуль hmac
Модуль для генерации кодов аутентификации сообщений с использованием хешей.
Модуль base64
Другой способ кодирования двоичных хешей для сред, не предназначенных для работы с двоичными данными.
http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
Публикация FIPS 180-2, описывающая безопасные хэш-алгоритмы.
https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms
Статья в Википедии с информацией о том, в каких алгоритмах известны проблемы и что это означает для их использования.
https://www.ietf.org/rfc/rfc2898.txt
PKCS #5: Спецификация криптографии на основе пароля, версия 2.0