hashlib.md
1> **Источник:** https://python-all.ru/3.4/library/hashlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 15.1. [`hashlib`](https://python-all.ru/3.4/library/hashlib.html#module-hashlib) – Безопасные хеши и дайджесты сообщений89**Исходный код:** [Lib/hashlib.py](https://python-all.ru/src/3.4/Lib/hashlib.py)1011---1213Этот модуль реализует общий интерфейс для множества различных алгоритмов безопасного хеширования и дайджестов сообщений. Включены алгоритмы безопасного хеширования FIPS: SHA1, SHA224, SHA256, SHA384 и SHA512 (определены в FIPS 180-2), а также алгоритм MD5 от RSA (определён в [**RFC 1321**](https://python-all.ru/3.4/library/hashlib.html)). Термины «безопасный хеш» и «дайджест сообщения» взаимозаменяемы. Старые алгоритмы назывались дайджестами сообщений. Современный термин – безопасный хеш.1415> **Примечание**16>17> Если вам нужны хеш-функции adler32 или crc32, они доступны в модуле [`zlib`](https://python-all.ru/3.4/library/zlib.html#module-zlib).1819> **Предупреждение**20>21> Некоторые алгоритмы имеют известные уязвимости к коллизиям хешей; обратитесь к разделу «См. также» в конце.2223## 15.1.1. Алгоритмы хеширования2425Для каждого типа *хеша* существует один метод-конструктор. Все они возвращают хеш-объект с одним и тем же простым интерфейсом. Например: используйте `sha1()` для создания хеш-объекта SHA1. Теперь вы можете передавать этому объекту [*объекты, подобные байтовым*](https://python-all.ru/3.4/glossary.html#term-bytes-like-object) (обычно [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes)) с помощью метода `update()`. В любой момент вы можете запросить *дайджест* всех переданных на данный момент данных, используя методы `digest()` или `hexdigest()`.2627> **Примечание**28>29> Для повышения производительности в многопоточных приложениях [*GIL*](https://python-all.ru/3.4/glossary.html#term-gil) Python освобождается для данных размером более 2047 байт при создании объекта или обновлении.3031> **Примечание**32>33> Передача строковых объектов в `update()` не поддерживается, так как хеши работают с байтами, а не с символами.3435Конструкторы для алгоритмов хеширования, которые всегда присутствуют в этом модуле: `md5()`, `sha1()`, `sha224()`, `sha256()`, `sha384()`, и `sha512()`. Другие алгоритмы также могут быть доступны в зависимости от библиотеки OpenSSL, которую использует Python на вашей платформе.3637Например, чтобы получить дайджест байтовой строки `b'Nobody inspects the spammish repetition'`:3839```python40>>> import hashlib41>>> m = hashlib.md5()42>>> m.update(b"Nobody inspects")43>>> m.update(b" the spammish repetition")44>>> m.digest()45b'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'46>>> m.digest_size471648>>> m.block_size496450```5152Более компактно:5354```python55>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()56'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'57```5859#### `hashlib.new(name[, data])`6061Это универсальный конструктор, который принимает строковое имя нужного алгоритма в качестве первого параметра. Он также существует для обеспечения доступа к перечисленным выше хешам, а также к любым другим алгоритмам, которые может предложить ваша библиотека OpenSSL. Именованные конструкторы работают намного быстрее, чем [`new()`](https://python-all.ru/3.4/library/hashlib.html#hashlib.new), и их следует предпочитать.6263Использование [`new()`](https://python-all.ru/3.4/library/hashlib.html#hashlib.new) с алгоритмом, предоставленным OpenSSL:6465```python66>>> h = hashlib.new('ripemd160')67>>> h.update(b"Nobody inspects the spammish repetition")68>>> h.hexdigest()69'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'70```7172Hashlib предоставляет следующие константные атрибуты:7374#### `hashlib.algorithms_guaranteed`7576Множество, содержащее имена алгоритмов хеширования, которые гарантированно поддерживаются этим модулем на всех платформах.7778Новое в версии 3.2.7980#### `hashlib.algorithms_available`8182Набор, содержащий имена алгоритмов хеширования, доступных в запущенном интерпретаторе Python. Эти имена будут распознаны при передаче в [`new()`](https://python-all.ru/3.4/library/hashlib.html#hashlib.new). [`algorithms_guaranteed`](https://python-all.ru/3.4/library/hashlib.html#hashlib.algorithms_guaranteed) всегда будет подмножеством. Один и тот же алгоритм может появляться в этом наборе несколько раз под разными именами (благодаря OpenSSL).8384Новое в версии 3.2.8586Следующие значения предоставляются в качестве константных атрибутов хеш-объектов, возвращаемых конструкторами:8788#### `hash.digest_size`8990Размер результирующего хеша в байтах.9192#### `hash.block_size`9394Внутренний размер блока хэш-алгоритма в байтах.9596Хэш-объект имеет следующие атрибуты:9798#### `hash.name`99100Каноническое имя этого хеша, всегда в нижнем регистре и всегда подходящее в качестве параметра для [`new()`](https://python-all.ru/3.4/library/hashlib.html#hashlib.new) для создания другого хеша этого типа.101102Изменено в версии 3.4: Атрибут name присутствует в CPython с самого начала, но до Python 3.4 не был формально определён, поэтому может отсутствовать на некоторых платформах.103104Хеш-объект имеет следующие методы:105106#### `hash.update(arg)`107108Обновляет хеш-объект с помощью объекта *arg*, который должен интерпретироваться как буфер байтов. Многократные вызовы эквивалентны одному вызову с конкатенацией всех аргументов: `m.update(a); m.update(b)` эквивалентно `m.update(a+b)`.109110Изменено в версии 3.1: GIL Python освобождается, чтобы другие потоки могли выполняться, пока происходит обновление хеша для данных размером более 2047 байт при использовании алгоритмов хеширования, предоставляемых OpenSSL.111112#### `hash.digest()`113114Возвращает дайджест данных, переданных методу [`update()`](https://python-all.ru/3.4/library/hashlib.html#hashlib.hash.update) на данный момент. Это объект bytes размером [`digest_size`](https://python-all.ru/3.4/library/hashlib.html#hashlib.hash.digest_size), который может содержать байты во всём диапазоне от 0 до 255.115116#### `hash.hexdigest()`117118Как и [`digest()`](https://python-all.ru/3.4/library/hashlib.html#hashlib.hash.digest), за исключением того, что дайджест возвращается в виде строкового объекта двойной длины, содержащего только шестнадцатеричные цифры. Это можно использовать для безопасного обмена значением в электронной почте или других недвоичных средах.119120#### `hash.copy()`121122Возвращает копию («клон») хеш-объекта. Это можно использовать для эффективного вычисления дайджестов данных, имеющих общую начальную подстроку.123124## 15.1.2. Выработка ключей125126Алгоритмы вывода ключей и растяжения ключа предназначены для безопасного хеширования паролей. Наивные алгоритмы, такие как `sha1(password)`, не устойчивы к атакам полным перебором. Хорошая функция хеширования паролей должна быть настраиваемой, медленной и включать [соль](https://python-all.ru/3.4/library/hashlib.html).127128#### `hashlib.pbkdf2_hmac(name, password, salt, rounds, dklen=None)`129130Функция реализует функцию вывода ключей на основе пароля PKCS#5 версии 2. Она использует HMAC в качестве псевдослучайной функции.131132Строка *name* – это желаемое имя алгоритма хеш-дайджеста для HMAC, например 'sha1' или 'sha256'. *password* и *salt* интерпретируются как буферы байтов. Приложения и библиотеки должны ограничивать *password* разумным значением (например, 1024). *salt* должен содержать около 16 или более байтов из надлежащего источника, например [`os.urandom()`](https://python-all.ru/3.4/library/os.html#os.urandom).133134Количество *раундов* следует выбирать исходя из алгоритма хеширования и вычислительной мощности. По состоянию на 2013 год рекомендуется не менее 100 000 раундов SHA-256.135136*dklen* – это длина производного ключа. Если *dklen* равно `None`, то используется размер дайджеста алгоритма хеширования *name*, например, 64 для SHA-512.137138```python139>>> import hashlib, binascii140>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)141>>> binascii.hexlify(dk)142b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'143```144145Новое в версии 3.4.146147> **Примечание**148>149> Быстрая реализация *pbkdf2\_hmac* доступна с OpenSSL. Реализация на Python использует встроенную версию [`hmac`](https://python-all.ru/3.4/library/hmac.html#module-hmac). Она примерно в три раза медленнее и не освобождает GIL.150151> **См. также**152>153> **Модуль [`hmac`](https://python-all.ru/3.4/library/hmac.html#module-hmac)**154>155> Модуль для генерации кодов аутентификации сообщений с использованием хешей.156>157> **Модуль [`base64`](https://python-all.ru/3.4/library/base64.html#module-base64)**158>159> Другой способ кодирования двоичных хешей для сред, не предназначенных для работы с двоичными данными.160>161> **[http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf](https://python-all.ru/3.4/library/hashlib.html)**162>163> Публикация FIPS 180-2, описывающая безопасные хэш-алгоритмы.164>165> **[https://en.wikipedia.org/wiki/Cryptographic\_hash\_function#Cryptographic\_hash\_algorithms](https://python-all.ru/3.4/library/hashlib.html)**166>167> Статья в Википедии с информацией о том, в каких алгоритмах известны проблемы и что это означает для их использования.168>169> **[http://www.ietf.org/rfc/rfc2898.txt](https://python-all.ru/3.4/library/hashlib.html)**170>171> PKCS #5: Спецификация криптографии на основе пароля, версия 2.0172