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

hashlib.md

156 строк · 12.3 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/hashlib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 14.1. [`hashlib`](https://python-all.ru/2.7/library/hashlib.html#module-hashlib) – Безопасные хеши и дайджесты сообщений89Новое в версии 2.5.1011**Исходный код:** [Lib/hashlib.py](https://python-all.ru/src/2.7/Lib/hashlib.py)1213---1415Этот модуль реализует общий интерфейс для множества различных алгоритмов безопасного хэширования и дайджестов сообщений. Включены алгоритмы безопасного хэширования FIPS SHA1, SHA224, SHA256, SHA384 и SHA512 (определены в FIPS 180-2), а также алгоритм MD5 от RSA (определён в Интернете [**RFC 1321**](https://python-all.ru/2.7/library/hashlib.html)). Термины «безопасный хэш» и «дайджест сообщения» взаимозаменяемы. Старые алгоритмы назывались дайджестами сообщений. Современный термин – безопасный хэш.1617> **Примечание**18>19> Если вам нужны хеш-функции adler32 или crc32, они доступны в модуле [`zlib`](https://python-all.ru/2.7/library/zlib.html#module-zlib).2021> **Предупреждение**22>23> Некоторые алгоритмы имеют известные уязвимости к коллизиям хешей; обратитесь к разделу «См. также» в конце.2425Для каждого типа *хэша* существует один метод-конструктор. Все они возвращают хэш-объект с одинаковым простым интерфейсом. Например, используйте `sha1()` для создания хэш-объекта SHA1. Теперь можно передавать этому объекту произвольные строки с помощью метода `update()`. В любой момент можно запросить *дайджест* конкатенации всех переданных до сих пор строк с помощью методов `digest()` или `hexdigest()`.2627Конструкторы алгоритмов хэширования, которые всегда присутствуют в этом модуле: [`md5()`](https://python-all.ru/2.7/library/md5.html#module-md5), `sha1()`, `sha224()`, `sha256()`, `sha384()` и `sha512()`. Дополнительные алгоритмы могут быть доступны в зависимости от библиотеки OpenSSL, которую использует Python на вашей платформе.2829Например, чтобы получить дайджест строки `'Nobody inspects the spammish repetition'`:3031```python32>>> import hashlib33>>> m = hashlib.md5()34>>> m.update("Nobody inspects")35>>> m.update(" the spammish repetition")36>>> m.digest()37'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'38>>> m.digest_size391640>>> m.block_size416442```4344Более компактно:4546```python47>>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()48'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'49```5051Существует также универсальный конструктор [`new()`](https://python-all.ru/2.7/library/new.html#module-new), который принимает строковое имя желаемого алгоритма в качестве первого параметра, чтобы обеспечить доступ к перечисленным выше хэшам, а также к любым другим алгоритмам, которые может предложить ваша библиотека OpenSSL. Именованные конструкторы намного быстрее, чем [`new()`](https://python-all.ru/2.7/library/new.html#module-new), и их следует предпочитать.5253Использование [`new()`](https://python-all.ru/2.7/library/new.html#module-new) с алгоритмом, предоставляемым OpenSSL:5455```python56>>> h = hashlib.new('ripemd160')57>>> h.update("Nobody inspects the spammish repetition")58>>> h.hexdigest()59'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'60```6162Этот модуль предоставляет следующий атрибут-константу:6364#### `hashlib.algorithms`6566Кортеж, содержащий названия алгоритмов хэширования, которые гарантированно поддерживаются этим модулем.6768Новое в версии 2.7.6970#### `hashlib.algorithms_guaranteed`7172Множество, содержащее имена алгоритмов хеширования, которые гарантированно поддерживаются этим модулем на всех платформах.7374Новое в версии 2.7.9.7576#### `hashlib.algorithms_available`7778Множество, содержащее имена хеш-алгоритмов, доступных в работающем интерпретаторе Python. Эти имена будут распознаны при передаче в [`new()`](https://python-all.ru/2.7/library/new.html#module-new). [`algorithms_guaranteed`](https://python-all.ru/2.7/library/hashlib.html#hashlib.algorithms_guaranteed) всегда будет подмножеством. Один и тот же алгоритм может появляться в этом множестве несколько раз под разными именами (благодаря OpenSSL).7980Новое в версии 2.7.9.8182Следующие значения предоставляются в качестве константных атрибутов хеш-объектов, возвращаемых конструкторами:8384#### `hash.digest_size`8586Размер результирующего хеша в байтах.8788#### `hash.block_size`8990Внутренний размер блока хэш-алгоритма в байтах.9192Хеш-объект имеет следующие методы:9394#### `hash.update(arg)`9596Обновляет хэш-объект строкой *arg*. Повторные вызовы эквивалентны одному вызову с конкатенацией всех аргументов: `m.update(a); m.update(b)` эквивалентно `m.update(a+b)`.9798Изменено в версии 2.7: GIL Python освобождается, чтобы позволить другим потокам выполняться во время обновления хэша на данных размером более 2048 байт при использовании алгоритмов хэширования, предоставляемых OpenSSL.99100#### `hash.digest()`101102Возвращает дайджест строк, переданных методу [`update()`](https://python-all.ru/2.7/library/hashlib.html#hashlib.hash.update) на данный момент. Это строка из [`digest_size`](https://python-all.ru/2.7/library/hashlib.html#hashlib.hash.digest_size) байт, которая может содержать символы, отличные от ASCII, включая нулевые байты.103104#### `hash.hexdigest()`105106Как [`digest()`](https://python-all.ru/2.7/library/hashlib.html#hashlib.hash.digest), за исключением того, что дайджест возвращается в виде строки двойной длины, содержащей только шестнадцатеричные цифры. Это может использоваться для безопасного обмена значением по электронной почте или в других недвоичных средах.107108#### `hash.copy()`109110Возвращает копию («клон») хэш-объекта. Это может быть использовано для эффективного вычисления дайджестов строк, имеющих общую начальную подстроку.111112## 14.1.1. Вывод ключа113114Алгоритмы вывода ключей и растяжения ключей предназначены для безопасного хэширования паролей. Простые алгоритмы, такие как `sha1(password)`, не устойчивы к атакам полным перебором. Хорошая функция хэширования паролей должна быть настраиваемой, медленной и включать [соль](https://python-all.ru/2.7/library/hashlib.html).115116#### `hashlib.pbkdf2_hmac(name, password, salt, rounds, dklen=None)`117118Функция реализует функцию вывода ключей на основе пароля PKCS#5 версии 2. Она использует HMAC в качестве псевдослучайной функции.119120Строка *name* – это желаемое имя алгоритма хэширования дайджеста для HMAC, например 'sha1' или 'sha256'. *password* и *salt* интерпретируются как буферы байтов. Приложениям и библиотекам следует ограничить *password* разумным значением (например, 1024). *salt* должен содержать около 16 или более байтов из надежного источника, например [`os.urandom()`](https://python-all.ru/2.7/library/os.html#os.urandom).121122Количество *раундов* следует выбирать исходя из алгоритма хеширования и вычислительной мощности. По состоянию на 2013 год рекомендуется не менее 100 000 раундов SHA-256.123124*dklen* – это длина производного ключа. Если *dklen* равно `None`, то используется размер дайджеста алгоритма хэширования *name*, например 64 для SHA-512.125126```python127>>> import hashlib, binascii128>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)129>>> binascii.hexlify(dk)130b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'131```132133Новое в версии 2.7.8.134135> **Примечание**136>137> Быстрая реализация *pbkdf2\_hmac* доступна в OpenSSL. Реализация на Python использует встроенную версию [`hmac`](https://python-all.ru/2.7/library/hmac.html#module-hmac). Она примерно в три раза медленнее и не освобождает GIL.138139> **См. также**140>141> **Модуль [`hmac`](https://python-all.ru/2.7/library/hmac.html#module-hmac)**142>143> Модуль для генерации кодов аутентификации сообщений с использованием хешей.144>145> **Модуль [`base64`](https://python-all.ru/2.7/library/base64.html#module-base64)**146>147> Другой способ кодирования двоичных хешей для сред, не предназначенных для работы с двоичными данными.148>149> **[http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf](https://python-all.ru/2.7/library/hashlib.html)**150>151> Публикация FIPS 180-2, описывающая безопасные хэш-алгоритмы.152>153> **[https://en.wikipedia.org/wiki/Cryptographic\_hash\_function#Cryptographic\_hash\_algorithms](https://python-all.ru/2.7/library/hashlib.html)**154>155> Статья в Википедии с информацией о том, в каких алгоритмах известны проблемы и что это означает для их использования.156