Spec-Zone.ru › Python 2.7

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.

См. также

Module hmac

Модуль для генерации кодов аутентификации сообщений с использованием хешей.

Module base64

Другой способ кодирования двоичных хешей для небинарных сред.

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API