Документация 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.

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

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

Для каждого типа хеша существует один метод-конструктор. Все они возвращают хеш-объект с одним и тем же простым интерфейсом. Например: используйте 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.update(arg)

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

Изменено в версии 3.1: GIL Python освобождается, чтобы другие потоки могли выполняться, пока происходит обновление хеша для данных размером более 2047 байт при использовании алгоритмов хеширования, предоставляемых 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
Статья в Википедии с информацией о том, в каких алгоритмах известны проблемы и что это означает для их использования.