hashlib — Безопасные хеши и дайджесты сообщений
Новая в версии 2.5.
Исходный код: Lib/hashlib.py
Этот модуль реализует общий интерфейс для многих различных алгоритмов безопасных хешей и дайджестов сообщений. Включаются алгоритмы FIPS безопасных хешей SHA1, SHA224, SHA256, SHA384 и SHA512 (определены в FIPS 180-2), а также алгоритм MD5 RSA (определён в RFC 1321). Термины «безопасный хеш» и «дайджест сообщения» взаимозаменяемы. Более старые алгоритмы назывались дайджестами сообщений. Современный термин — безопасный хеш.
Примечание
Если вам нужны функции хеширования adler32 или crc32, они доступны в модуле zlib.
Предупреждение
У некоторых алгоритмов известны слабые места в коллизиях хешей, см. раздел «См. также» в конце.
Существует один конструктор для каждого типа хеша. Все они возвращают объект хеша с одинаковым простым интерфейсом. Например: используйте sha1() для создания объекта хеша SHA1. Теперь вы можете передавать в этот объект произвольные строки, используя метод update(). В любой момент вы можете запросить дайджест конкатенации строк, переданных ему до сих пор, используя методы digest() или hexdigest().
Конструкторы алгоритмов хеширования, которые всегда присутствуют в этом модуле, — это md5(), sha1(), sha224(), sha256(), sha384(), и sha512(). Дополнительные алгоритмы также могут быть доступны в зависимости от библиотеки OpenSSL, которую использует Python на вашей платформе.
Например, чтобы получить дайджест строки 'Nobody inspects the spammish
repetition':
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("Nobody inspects")
>>> m.update(" the spammish repetition")
>>> m.digest()
'\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("Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
Также существует универсальный конструктор new(), который принимает имя желаемого алгоритма в качестве первого параметра, что позволяет получить доступ к вышеперечисленным хешам, а также к любым другим алгоритмам, которые может предложить ваша библиотека OpenSSL. Именные конструкторы намного быстрее, чем new() и должны быть предпочтительнее.
Использование new() с алгоритмом, предоставленным OpenSSL:
>>> h = hashlib.new('ripemd160')
>>> h.update("Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'
Этот модуль предоставляет следующие постоянные атрибуты:
-
hashlib.algorithms -
Кортеж, предоставляющий имена алгоритмов хеширования, гарантированно поддерживаемые этим модулем.
Новая в версии 2.7.
-
hashlib.algorithms_guaranteed -
Множество, содержащее имена алгоритмов хеширования, гарантированно поддерживаемые этим модулем на всех платформах.
Новая в версии 2.7.9.
-
hashlib.algorithms_available -
Множество, содержащее имена алгоритмов хеширования, доступных в работающем интерпретаторе Python. Эти имена будут распознаны при передаче в
new().algorithms_guaranteedвсегда будет подмножеством. Один и тот же алгоритм может появляться несколько раз в этом множестве под разными именами (благодаря OpenSSL).Новая в версии 2.7.9.
Следующие значения предоставляются в качестве постоянных атрибутов объектов хешей, возвращаемых конструкторами:
-
hash.digest_size -
Размер результирующего хеша в байтах.
-
hash.block_size -
Внутренний размер блока алгоритма хеширования в байтах.
Объект хеша имеет следующие методы:
-
hash.update(arg) -
Обновить объект хеша строкой arg. Повторные вызовы эквивалентны одному вызову с конкатенацией всех аргументов:
m.update(a); m.update(b)эквивалентноm.update(a+b).Изменено в версии 2.7: GIL освобождается для выполнения других потоков во время обновления хеша на данных размером более 2048 байт, когда используются алгоритмы хеширования, предоставленные OpenSSL.
-
hash.digest() -
Возвращает дайджест строк, переданных методу
update()до сих пор. Это строка изdigest_sizeбайтов, которая может содержать не-ASCII символы, включая нулевые байты.
-
hash.hexdigest() -
Подобно
digest(), за исключением того, что дайджест возвращается как строка двойной длины, содержащая только шестнадцатеричные цифры. Это может быть использовано для безопасного обмена значениями по электронной почте или в других небинарных средах.
-
hash.copy() -
Возвращает копию («клон») объекта хеша. Это можно использовать для эффективного вычисления дайджестов строк, которые имеют общую начальную подстроку.
1. Вывод ключа
Алгоритмы вывода ключа и растяжения ключа предназначены для безопасного хеширования паролей. Примитивные алгоритмы, такие как sha1(password), не устойчивы к атакам методом перебора. Хорошая функция хеширования паролей должна быть настраиваемой, медленной и включать соль.
-
hashlib.pbkdf2_hmac(name, password, salt, rounds, dklen=None) -
Функция предоставляет функцию вывода ключа PKCS#5 на основе пароля 2. Она использует HMAC как псевдослучайную функцию.
Строка name — желаемое имя алгоритма хеширования дайджеста для HMAC, например, 'sha1' или 'sha256'. password и salt интерпретируются как буферы байтов. Приложения и библиотеки должны ограничить password разумным значением (например, 1024). salt должен быть примерно 16 или более байтов из надёжного источника, например,
os.urandom().Количество rounds должно быть выбрано на основе алгоритма хеширования и вычислительной мощности. По состоянию на 2013 год рекомендуется по крайней мере 100 000 раундов SHA-256.
dklen — длина выводимого ключа. Если dklen
None, используется размер дайджеста алгоритма хеширования name, например, 64 для SHA-512.>>> import hashlib, binascii >>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000) >>> binascii.hexlify(dk) b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'Новая в версии 2.7.8.
Примечание
Быстрая реализация 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
-
Статья Википедии с информацией о том, какие алгоритмы имеют известные проблемы и что это означает в отношении их использования.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/hashlib.html