14.1. hashlib – Безопасные хеши и дайджесты сообщений¶hashlib – Secure hashes and message digests
Этот модуль реализует общий интерфейс для множества различных алгоритмов безопасного хеширования и дайджестов сообщений. Включены алгоритмы безопасного хеширования 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'
A generic new() constructor that takes the string name of the desired algorithm as its first parameter also exists to allow access to the above listed hashes as well as any other algorithms that your OpenSSL library may offer. The named constructors are much faster than new() and should be preferred.
Использование new() с алгоритмом из OpenSSL:
>>> h = hashlib.new('ripemd160')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'
Следующие значения предоставляются в качестве константных атрибутов хеш-объектов, возвращаемых конструкторами:
- hash.digest_size¶
- Размер результирующего хеша в байтах.
- hash.block_size¶
- Внутренний размер блока хэш-алгоритма в байтах.
Хеш-объект имеет следующие методы:
- hash.update(arg)¶
Обновляет хеш-объект с помощью объекта arg, который должен интерпретироваться как буфер байтов. Многократные вызовы эквивалентны одному вызову с конкатенацией всех аргументов: m.update(a); m.update(b) эквивалентно m.update(a+b).
Изменено в версии 3.1: Глобальная блокировка интерпретатора (GIL) Python освобождается, чтобы другие потоки могли выполняться во время обновлений хеша\nданных размером более 2048 байт при использовании алгоритмов\nхеширования, предоставленных 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
- Статья в Википедии с информацией о том, в каких алгоритмах известны проблемы и что это означает для их использования.