Spec-Zone.ru › Python 3.5

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.

См. также

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
Статья Википедии с информацией о том, какие алгоритмы имеют известные проблемы и что это означает в отношении их использования.
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

Spec-Zone.ru

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