Документация Python неофициальный перевод
Содержание страницы

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

Статья в Википедии с информацией о том, в каких алгоритмах известны проблемы и что это означает для их использования.