hashlib.md
1> **Источник:** https://python-all.ru/3.2/library/hashlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 14.1. [`hashlib`](https://python-all.ru/3.2/library/hashlib.html#module-hashlib) – Безопасные хеши и дайджесты сообщений89**Исходный код:** [Lib/hashlib.py](https://python-all.ru/src/3.2/Lib/hashlib.py)1011---1213Этот модуль реализует общий интерфейс для множества различных алгоритмов безопасного хеширования и дайджестов сообщений. Включены алгоритмы безопасного хеширования FIPS: SHA1, SHA224, SHA256, SHA384 и SHA512 (определены в FIPS 180-2), а также алгоритм MD5 от RSA (определён в [**RFC 1321**](https://python-all.ru/3.2/library/hashlib.html)). Термины «безопасный хеш» и «дайджест сообщения» взаимозаменяемы. Старые алгоритмы назывались дайджестами сообщений. Современный термин – безопасный хеш.1415> **Примечание**16>17> Если нужны хеш-функции adler32 или crc32, они доступны в модуле [`zlib`](https://python-all.ru/3.2/library/zlib.html#module-zlib).1819> **Предупреждение**20>21> Некоторые алгоритмы имеют известные уязвимости к коллизиям хешей; см. FAQ в конце.2223Для каждого типа *хеша* существует один метод-конструктор. Все они возвращают объект хеша с одинаковым простым интерфейсом. Например: используйте `sha1()` для создания объекта хеша SHA1. Затем можно передавать этому объекту объекты, поддерживающие буферный интерфейс (обычно объекты [`bytes`](https://python-all.ru/3.2/library/functions.html#bytes)), с помощью метода `update()`. В любой момент можно запросить *дайджест* конкатенации всех переданных на данный момент данных, используя методы `digest()` или `hexdigest()`.2425> **Примечание**26>27> Для повышения производительности в многопоточных приложениях GIL Python освобождается для строк длиннее 2047 байт при создании объекта или при вызове update.2829> **Примечание**30>31> Передача строковых объектов в `update()` не поддерживается, так как хеши работают с байтами, а не с символами.3233Конструкторы хеш-алгоритмов, которые всегда присутствуют в этом модуле: `md5()`, `sha1()`, `sha224()`, `sha256()`, `sha384()` и `sha512()`. Дополнительные алгоритмы могут быть доступны в зависимости от библиотеки OpenSSL, которую Python использует на вашей платформе.3435Например, чтобы получить дайджест байтовой строки `b'Nobody inspects the spammish repetition'`:3637```python38>>> import hashlib39>>> m = hashlib.md5()40>>> m.update(b"Nobody inspects")41>>> m.update(b" the spammish repetition")42>>> m.digest()43b'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'44>>> m.digest_size451646>>> m.block_size476448```4950Более компактно:5152```python53>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()54'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'55```5657#### `hashlib.new(name[, data])`5859Это универсальный конструктор, который принимает строковое имя нужного алгоритма в качестве первого параметра. Он также существует для обеспечения доступа к перечисленным выше хешам, а также к любым другим алгоритмам, которые может предложить ваша библиотека OpenSSL. Именованные конструкторы работают намного быстрее, чем [`new()`](https://python-all.ru/3.2/library/hashlib.html#hashlib.new), и их следует предпочитать.6061Использование [`new()`](https://python-all.ru/3.2/library/hashlib.html#hashlib.new) с алгоритмом, предоставленным OpenSSL:6263```python64>>> h = hashlib.new('ripemd160')65>>> h.update(b"Nobody inspects the spammish repetition")66>>> h.hexdigest()67'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'68```6970Hashlib предоставляет следующие константные атрибуты:7172#### `hashlib.algorithms_guaranteed`7374Содержит имена хеш-алгоритмов, которые гарантированно поддерживаются этим модулем на всех платформах.7576Новое в версии 3.2.7778#### `hashlib.algorithms_available`7980Содержит имена хеш-алгоритмов, доступных в работающем интерпретаторе Python. Эти имена будут распознаны при передаче в [`new()`](https://python-all.ru/3.2/library/hashlib.html#hashlib.new). [`algorithms_guaranteed`](https://python-all.ru/3.2/library/hashlib.html#hashlib.algorithms_guaranteed) всегда будет подмножеством. В этом наборе могут появляться дублирующиеся алгоритмы с разными форматами имён (благодаря OpenSSL).8182Новое в версии 3.2.8384Следующие значения предоставляются в качестве константных атрибутов хеш-объектов, возвращаемых конструкторами:8586#### `hash.digest_size`8788Размер результирующего хеша в байтах.8990#### `hash.block_size`9192Внутренний размер блока хэш-алгоритма в байтах.9394Хеш-объект имеет следующие методы:9596#### `hash.update(arg)`9798Обновляет хеш-объект с помощью объекта *arg*, который должен интерпретироваться как буфер байтов. Многократные вызовы эквивалентны одному вызову с конкатенацией всех аргументов: `m.update(a); m.update(b)` эквивалентно `m.update(a+b)`.99100Изменено в версии 3.1: GIL Python освобождается, чтобы другие потоки могли выполняться во время обновления хеша на данных размером более 2048 байт при использовании хеш-алгоритмов, предоставленных OpenSSL.101102#### `hash.digest()`103104Возвращает дайджест данных, переданных методу [`update()`](https://python-all.ru/3.2/library/hashlib.html#hashlib.hash.update) на данный момент. Это объект bytes размером [`digest_size`](https://python-all.ru/3.2/library/hashlib.html#hashlib.hash.digest_size), который может содержать байты во всём диапазоне от 0 до 255.105106#### `hash.hexdigest()`107108Как и [`digest()`](https://python-all.ru/3.2/library/hashlib.html#hashlib.hash.digest), за исключением того, что дайджест возвращается в виде строкового объекта двойной длины, содержащего только шестнадцатеричные цифры. Это можно использовать для безопасного обмена значением в электронной почте или других недвоичных средах.109110#### `hash.copy()`111112Возвращает копию («клон») хеш-объекта. Это можно использовать для эффективного вычисления дайджестов данных, имеющих общую начальную подстроку.113114> **См. также**115>116> **Модуль [`hmac`](https://python-all.ru/3.2/library/hmac.html#module-hmac)**117>118> Модуль для генерации кодов аутентификации сообщений с использованием хешей.119>120> **Модуль [`base64`](https://python-all.ru/3.2/library/base64.html#module-base64)**121>122> Другой способ кодирования двоичных хешей для сред, не предназначенных для работы с двоичными данными.123>124> **[http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf](https://python-all.ru/3.2/library/hashlib.html)**125>126> Публикация FIPS 180-2, описывающая безопасные хэш-алгоритмы.127>128> **[http://en.wikipedia.org/wiki/Cryptographic\_hash\_function#Cryptographic\_hash\_algorithms](https://python-all.ru/3.2/library/hashlib.html)**129>130> Статья в Википедии с информацией о том, в каких алгоритмах известны проблемы и что это означает для их использования.131