hashlib — Безопасные хэши и дайджесты сообщений
Исходный код: Lib/hashlib.py
Этот модуль реализует общий интерфейс для многих различных алгоритмов безопасных хэшей и дайджестов сообщений. Включаются алгоритмы FIPS для безопасных хэшей SHA1, SHA224, SHA256, SHA384 и SHA512 (определенные в FIPS 180-2), а также алгоритм MD5 RSA (определенный в Интернет RFC 1321). Термины «безопасный хэш» и «дайджест сообщения» взаимозаменяемы. Более старые алгоритмы назывались дайджестами сообщений. Современный термин — безопасный хэш.
Примечание
Если вам нужны функции хэширования adler32 или crc32, они доступны в модуле zlib.
Предупреждение
У некоторых алгоритмов известны слабые места в коллизиях хэшей, см. раздел «См. также» в конце.
1. Алгоритмы хэширования
Существует один метод конструктора, названный для каждого типа хэша. Все возвращают объект хэша с тем же простым интерфейсом. Например: используйте sha1() для создания объекта хэша SHA1. Теперь вы можете передавать этому объекту объекты типа байты (обычно bytes) с помощью метода update(). В любой момент вы можете запросить дайджест конкатенации данных, переданных ему до сих пор, используя методы digest() или hexdigest().
Примечание
Для лучшей производительности в многопоточных приложениях, интерпретатор Python GIL освобождается для данных размером более 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, чтобы разрешить другим потокам выполняться во время обновления хэшей для данных объемом более 2047 байт при использовании алгоритмов хэширования, предоставленных OpenSSL.
-
hash.digest() -
Возвращает дайджест данных, переданных методу
update()до сих пор. Это объект типа bytes размеромdigest_size, который может содержать байты в полном диапазоне от 0 до 255.
-
hash.hexdigest() -
Аналогично
digest(), за исключением того, что дайджест возвращается как строковый объект двойной длины, содержащий только шестнадцатеричные цифры. Это может быть использовано для безопасного обмена значениями по электронной почте или в других небинарных средах.
-
hash.copy() -
Возвращает копию («клон») объекта хэша. Это можно использовать для эффективного вычисления дайджестов данных, имеющих общую начальную подстроку.
2. Вывод ключей
Алгоритмы вывода ключей и расширения ключей предназначены для безопасного хэширования паролей. Примитивные алгоритмы, такие как 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().Количество iterations должно быть выбрано в зависимости от алгоритма хэширования и вычислительной мощности. По состоянию на 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.
См. также
-
Modulehmac - Модуль для генерации кодов проверки подлинности сообщений с использованием хэшей.
-
Modulebase64 - Другой способ кодирования бинарных хэшей для небинарных сред.
- 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
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/hashlib.html