Содержание страницы
14.1. hashlib – Безопасные хеши и дайджесты сообщений¶hashlib – Secure hashes and message digests
Новое в версии 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 Python освобождается, чтобы позволить другим потокам выполняться во время обновления хэша на данных размером более 2048 байт при использовании алгоритмов хэширования, предоставляемых OpenSSL.
-
hash.digest()¶ Возвращает дайджест строк, переданных методу
update()на данный момент. Это строка изdigest_sizeбайт, которая может содержать символы, отличные от ASCII, включая нулевые байты.
-
hash.hexdigest()¶ Как
digest(), за исключением того, что дайджест возвращается в виде строки двойной длины, содержащей только шестнадцатеричные цифры. Это может использоваться для безопасного обмена значением по электронной почте или в других недвоичных средах.
-
hash.copy()¶ Возвращает копию («клон») хэш-объекта. Это может быть использовано для эффективного вычисления дайджестов строк, имеющих общую начальную подстроку.
14.1.1. Вывод ключа¶Key derivation
Алгоритмы вывода ключей и растяжения ключей предназначены для безопасного хэширования паролей. Простые алгоритмы, такие как 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().Количество раундов следует выбирать исходя из алгоритма хеширования и вычислительной мощности. По состоянию на 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.
См. также
- Модуль
hmac Модуль для генерации кодов аутентификации сообщений с использованием хешей.
- Модуль
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
Статья в Википедии с информацией о том, в каких алгоритмах известны проблемы и что это означает для их использования.