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

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

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

Некоторые алгоритмы имеют известные уязвимости к коллизиям хешей; см. FAQ в конце.

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

Примечание

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

Примечание

Передача строковых объектов в 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.update(arg)

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

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

hash.digest()

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

hash.hexdigest()

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

hash.copy()

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

См. также

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