hashlib.md
1> **Источник:** https://python-all.ru/3.6/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.6/library/hashlib.html#module-hashlib) – Безопасные хеши и дайджесты сообщений89**Исходный код:** [Lib/hashlib.py](https://python-all.ru/src/3.6/Lib/hashlib.py)1011---1213Этот модуль реализует общий интерфейс для множества различных алгоритмов безопасного хеширования и дайджестов сообщений. Включены алгоритмы безопасного хеширования FIPS: SHA1, SHA224, SHA256, SHA384 и SHA512 (определены в FIPS 180-2), а также алгоритм MD5 от RSA (определён в [**RFC 1321**](https://python-all.ru/3.6/library/hashlib.html)). Термины «безопасный хеш» и «дайджест сообщения» взаимозаменяемы. Старые алгоритмы назывались дайджестами сообщений. Современный термин – безопасный хеш.1415> **Примечание**16>17> Если вам нужны хеш-функции adler32 или crc32, они доступны в модуле [`zlib`](https://python-all.ru/3.6/library/zlib.html#module-zlib).1819> **Предупреждение**20>21> Некоторые алгоритмы имеют известные уязвимости к коллизиям хешей; обратитесь к разделу «См. также» в конце.2223## 15.1.1. Алгоритмы хеширования2425Для каждого типа *хеша* существует один метод-конструктор. Все они возвращают хеш-объект с одинаковым простым интерфейсом. Например: используйте `sha256()` для создания хеш-объекта SHA-256. Затем можно передавать этому объекту [байтоподобные объекты](https://python-all.ru/3.6/glossary.html#term-bytes-like-object) (обычно [`bytes`](https://python-all.ru/3.6/library/stdtypes.html#bytes)) с помощью метода `update()`. В любой момент можно запросить *дайджест* объединения всех переданных данных с помощью методов `digest()` или `hexdigest()`.2627> **Примечание**28>29> Для повышения производительности в многопоточных приложениях [GIL](https://python-all.ru/3.6/glossary.html#term-gil) Python освобождается для данных размером более 2047 байт при создании объекта или обновлении.3031> **Примечание**32>33> Передача строковых объектов в `update()` не поддерживается, поскольку хеши работают с байтами, а не с символами.3435Конструкторы хеш-алгоритмов, которые всегда присутствуют в этом модуле: `sha1()`, `sha224()`, `sha256()`, `sha384()`, `sha512()`, [`blake2b()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.blake2b) и [`blake2s()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.blake2s). `md5()` обычно тоже доступен, но может отсутствовать, если используется редкая «FIPS-совместимая» сборка Python. Дополнительные алгоритмы могут быть доступны в зависимости от библиотеки OpenSSL, которую Python использует на вашей платформе. На большинстве платформ также доступны `sha3_224()`, `sha3_256()`, `sha3_384()`, `sha3_512()`, `shake_128()`, `shake_256()`.3637Новое в версии 3.6: конструкторы SHA3 (Keccak) и SHAKE: `sha3_224()`, `sha3_256()`, `sha3_384()`, `sha3_512()`, `shake_128()`, `shake_256()`.3839Новое в версии 3.6: добавлены [`blake2b()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.blake2b) и [`blake2s()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.blake2s).4041Например, чтобы получить дайджест байтовой строки `b'Nobody inspects the spammish repetition'`:4243```python44>>> import hashlib45>>> m = hashlib.sha256()46>>> m.update(b"Nobody inspects")47>>> m.update(b" the spammish repetition")48>>> m.digest()49b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'50>>> m.digest_size513252>>> m.block_size536454```5556Более компактно:5758```python59>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()60'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'61```6263#### `hashlib.new(name[, data])`6465Это универсальный конструктор, который принимает строку *name* желаемого алгоритма в качестве первого параметра. Он также существует для обеспечения доступа к перечисленным выше хешам, а также к любым другим алгоритмам, которые может предложить ваша библиотека OpenSSL. Именованные конструкторы работают намного быстрее, чем [`new()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.new), и их следует предпочитать.6667Использование [`new()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.new) с алгоритмом, предоставляемым OpenSSL:6869```python70>>> h = hashlib.new('ripemd160')71>>> h.update(b"Nobody inspects the spammish repetition")72>>> h.hexdigest()73'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'74```7576Hashlib предоставляет следующие константные атрибуты:7778#### `hashlib.algorithms_guaranteed`7980Множество, содержащее имена хеш-алгоритмов, которые гарантированно поддерживаются этим модулем на всех платформах. Обратите внимание, что «md5» присутствует в этом списке, несмотря на то, что некоторые вышестоящие поставщики предлагают странную сборку Python «с поддержкой FIPS», которая его исключает.8182Новое в версии 3.2.8384#### `hashlib.algorithms_available`8586Множество, содержащее имена хеш-алгоритмов, доступных в работающем интерпретаторе Python. Эти имена будут распознаны при передаче в [`new()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.new). [`algorithms_guaranteed`](https://python-all.ru/3.6/library/hashlib.html#hashlib.algorithms_guaranteed) всегда будет подмножеством. Один и тот же алгоритм может появляться в этом множестве несколько раз под разными именами (благодаря OpenSSL).8788Новое в версии 3.2.8990Следующие значения предоставляются в качестве константных атрибутов хеш-объектов, возвращаемых конструкторами:9192#### `hash.digest_size`9394Размер результирующего хеша в байтах.9596#### `hash.block_size`9798Внутренний размер блока хэш-алгоритма в байтах.99100Хэш-объект имеет следующие атрибуты:101102#### `hash.name`103104Каноническое имя этого хеша, всегда в нижнем регистре и всегда подходящее в качестве параметра для [`new()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.new), чтобы создать другой хеш того же типа.105106Изменено в версии 3.4: Атрибут name присутствует в CPython с самого начала, но до Python 3.4 не был формально определён, поэтому может отсутствовать на некоторых платформах.107108Хеш-объект имеет следующие методы:109110#### `hash.update(data)`111112Обновляет хеш-объект с помощью [байтоподобного объекта](https://python-all.ru/3.6/glossary.html#term-bytes-like-object). Многократные вызовы эквивалентны одному вызову с конкатенацией всех аргументов: `m.update(a); m.update(b)` эквивалентно `m.update(a+b)`.113114Изменено в версии 3.1: GIL Python освобождается, чтобы другие потоки могли выполняться, пока происходит обновление хеша для данных размером более 2047 байт при использовании алгоритмов хеширования, предоставляемых OpenSSL.115116#### `hash.digest()`117118Возвращает дайджест данных, переданных методу [`update()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.hash.update) на данный момент. Это байтовый объект размером [`digest_size`](https://python-all.ru/3.6/library/hashlib.html#hashlib.hash.digest_size), который может содержать байты во всём диапазоне от 0 до 255.119120#### `hash.hexdigest()`121122Как [`digest()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.hash.digest), за исключением того, что дайджест возвращается в виде строкового объекта двойной длины, содержащего только шестнадцатеричные цифры. Это можно использовать для безопасного обмена значением в электронной почте или других недвоичных средах.123124#### `hash.copy()`125126Возвращает копию («клон») хеш-объекта. Это можно использовать для эффективного вычисления дайджестов данных, имеющих общую начальную подстроку.127128## 15.1.2. SHAKE дайджесты переменной длины129130Алгоритмы `shake_128()` и `shake_256()` предоставляют дайджесты переменной длины с length\_in\_bits//2 до 128 или 256 бит безопасности. Поэтому их методы дайджеста требуют указания длины. Максимальная длина не ограничена алгоритмом SHAKE.131132#### `shake.digest(length)`133134Возвращает дайджест данных, переданных методу `update()` на текущий момент. Это объект bytes размером *length*, который может содержать байты во всём диапазоне от 0 до 255.135136#### `shake.hexdigest(length)`137138Как [`digest()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.shake.digest), за исключением того, что дайджест возвращается в виде строкового объекта двойной длины, содержащего только шестнадцатеричные цифры. Это можно использовать для безопасного обмена значением в электронной почте или других недвоичных средах.139140## 15.1.3. Вывод ключа141142Алгоритмы вывода ключей и растяжения ключей предназначены для безопасного хэширования паролей. Простые алгоритмы, такие как `sha1(password)`, не устойчивы к атакам полным перебором. Хорошая функция хэширования паролей должна быть настраиваемой, медленной и включать [соль](https://python-all.ru/3.6/library/hashlib.html).143144#### `hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)`145146Функция реализует функцию вывода ключей на основе пароля PKCS#5 версии 2. Она использует HMAC в качестве псевдослучайной функции.147148Строка *hash\_name* – это желаемое имя алгоритма хэширования для HMAC, например 'sha1' или 'sha256'. *password* и *salt* интерпретируются как буферы байтов. Приложениям и библиотекам следует ограничивать *password* разумной длиной (например, 1024). *salt* должна содержать около 16 или более байтов из надёжного источника, например [`os.urandom()`](https://python-all.ru/3.6/library/os.html#os.urandom).149150Количество *итераций* должно выбираться на основе алгоритма хеширования и вычислительной мощности. По состоянию на 2013 год рекомендуется не менее 100 000 итераций SHA-256.151152*dklen* – это длина производного ключа. Если *dklen* равен `None`, то используется размер дайджеста алгоритма хеширования *hash\_name*, например, 64 для SHA-512.153154```python155>>> import hashlib, binascii156>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)157>>> binascii.hexlify(dk)158b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'159```160161Новое в версии 3.4.162163> **Примечание**164>165> Быстрая реализация *pbkdf2\_hmac* доступна в OpenSSL. Реализация на Python использует встроенную версию [`hmac`](https://python-all.ru/3.6/library/hmac.html#module-hmac). Она примерно в три раза медленнее и не освобождает GIL.166167#### `hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)`168169Функция реализует функцию вывода ключей на основе пароля scrypt, как определено в [**RFC 7914**](https://python-all.ru/3.6/library/hashlib.html).170171*password* и *salt* должны быть [байтоподобными объектами](https://python-all.ru/3.6/glossary.html#term-bytes-like-object). Приложениям и библиотекам следует ограничивать *password* разумной длиной (например, 1024). *salt* должна содержать около 16 или более байтов из надёжного источника, например [`os.urandom()`](https://python-all.ru/3.6/library/os.html#os.urandom).172173*n* определяет фактор стоимости по CPU/памяти, *r* – размер блока, *p* – фактор параллелизации, а *maxmem* ограничивает память (в OpenSSL 1.1.0 по умолчанию 32 МБ). *dklen* задаёт длину производного ключа.174175Доступность: OpenSSL 1.1+176177Новое в версии 3.6.178179## 15.1.4. BLAKE2180181[BLAKE2](https://python-all.ru/3.6/library/hashlib.html) – это криптографическая хэш-функция, определённая в [**RFC 7693**](https://python-all.ru/3.6/library/hashlib.html), которая существует в двух вариантах:182183- **BLAKE2b**, оптимизированная для 64-битных платформ и создающая дайджесты любого размера от 1 до 64 байтов,184- **BLAKE2s**, оптимизированная для 8- и 32-битных платформ и создающая дайджесты любого размера от 1 до 32 байтов.185186BLAKE2 поддерживает **ключевой режим** (более быструю и простую замену [HMAC](https://python-all.ru/3.6/library/hashlib.html)), **хэширование с солью**, **персонализацию** и **древовидное хэширование**.187188Хэш-объекты этого модуля следуют API объектов стандартной библиотеки [`hashlib`](https://python-all.ru/3.6/library/hashlib.html#module-hashlib).189190### 15.1.4.1. Создание объектов хеша191192Новые хеш-объекты создаются вызовом функций-конструкторов:193194#### `hashlib.blake2b(data=b'', *, digest_size=64, key=b'', salt=b'', person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False)`195196#### `hashlib.blake2s(data=b'', *, digest_size=32, key=b'', salt=b'', person=b'', fanout=1, depth=1, leaf_size=0, node_offset=0, node_depth=0, inner_size=0, last_node=False)`197198Эти функции возвращают соответствующие хеш-объекты для вычисления BLAKE2b или BLAKE2s. Они опционально принимают следующие общие параметры:199200- *data*: начальный фрагмент данных для хеширования, который должен быть [байтоподобный объект](https://python-all.ru/3.6/glossary.html#term-bytes-like-object). Его можно передавать только как позиционный аргумент.201- *digest\_size*: размер выходного дайджеста в байтах.202- *key*: ключ для хеширования с ключом (до 64 байт для BLAKE2b, до 32 байт для BLAKE2s).203- *salt*: соль для рандомизированного хеширования (до 16 байт для BLAKE2b, до 8 байт для BLAKE2s).204- *person*: строка персонализации (до 16 байт для BLAKE2b, до 8 байт для BLAKE2s).205206Следующая таблица показывает ограничения для общих параметров (в байтах):207208| Хеш | digest\_size | len(key) | len(salt) | len(person) |209| --- | --- | --- | --- | --- |210| BLAKE2b | 64 | 64 | 16 | 16 |211| BLAKE2s | 32 | 32 | 8 | 8 |212213> **Примечание**214>215> Спецификация BLAKE2 определяет постоянные длины для параметров соли и персонализации, однако для удобства данная реализация принимает байтовые строки любой длины вплоть до указанной. Если длина параметра меньше указанной, он дополняется нулями, так что, например, `b'salt'` и `b'salt\x00'` – одно и то же значение. (Это не относится к *key*.)216217Эти размеры доступны в виде [констант](https://python-all.ru/3.6/library/hashlib.html#constants) модуля, описанных ниже.218219Функции-конструкторы также принимают следующие параметры хеширования деревьев:220221- *fanout*: fanout (от 0 до 255, 0 – если без ограничения, 1 в последовательном режиме).222- *depth*: максимальная глубина дерева (от 1 до 255, 255 – если без ограничения, 1 в последовательном режиме).223- *leaf\_size*: максимальный размер листа в байтах (от 0 до 2\*\*32-1, 0, если без ограничения или в последовательном режиме).224- *node\_offset*: смещение узла (от 0 до 2\*\*64-1 для BLAKE2b, от 0 до 2\*\*48-1 для BLAKE2s, 0 для первого самого левого листа или в последовательном режиме).225- *node\_depth*: глубина узла (от 0 до 255, 0 для листьев или в последовательном режиме).226- *inner\_size*: размер внутреннего дайджеста (от 0 до 64 для BLAKE2b, от 0 до 32 для BLAKE2s, 0 в последовательном режиме).227- *last\_node*: логическое значение, указывающее, является ли обрабатываемый узел последним (*False* для последовательного режима).228229230231См. раздел 2.10 в [спецификации BLAKE2](https://python-all.ru/3.6/library/hashlib.html) для всестороннего обзора хеширования деревьев.232233### 15.1.4.2. Константы234235#### `blake2b.SALT_SIZE`236237#### `blake2s.SALT_SIZE`238239Длина соли (максимальная длина, принимаемая конструкторами).240241#### `blake2b.PERSON_SIZE`242243#### `blake2s.PERSON_SIZE`244245Длина строки персонализации (максимальная длина, принимаемая конструкторами).246247#### `blake2b.MAX_KEY_SIZE`248249#### `blake2s.MAX_KEY_SIZE`250251Максимальный размер ключа.252253#### `blake2b.MAX_DIGEST_SIZE`254255#### `blake2s.MAX_DIGEST_SIZE`256257Максимальный размер дайджеста, который может выдать хеш-функция.258259### 15.1.4.3. Примеры260261#### 15.1.4.3.1. Простое хеширование262263Чтобы вычислить хеш некоторых данных, сначала необходимо создать объект хеша, вызвав соответствующую функцию-конструктор ([`blake2b()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.blake2b) или [`blake2s()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.blake2s)), затем обновить его данными, вызвав `update()` для этого объекта, и, наконец, получить дайджест из объекта, вызвав `digest()` (или `hexdigest()` для строки в шестнадцатеричной кодировке).264265```python266>>> from hashlib import blake2b267>>> h = blake2b()268>>> h.update(b'Hello world')269>>> h.hexdigest()270'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'271```272273Для сокращения можно передать первый фрагмент данных для обновления непосредственно конструктору в качестве позиционного аргумента:274275```python276>>> from hashlib import blake2b277>>> blake2b(b'Hello world').hexdigest()278'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'279```280281[`hash.update()`](https://python-all.ru/3.6/library/hashlib.html#hashlib.hash.update) можно вызывать сколько угодно раз для итеративного обновления хеша:282283```python284>>> from hashlib import blake2b285>>> items = [b'Hello', b' ', b'world']286>>> h = blake2b()287>>> for item in items:288... h.update(item)289>>> h.hexdigest()290'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'291```292293#### 15.1.4.3.2. Использование разных размеров дайджеста294295BLAKE2 имеет настраиваемый размер дайджестов: до 64 байт для BLAKE2b и до 32 байт для BLAKE2s. Например, чтобы заменить SHA-1 на BLAKE2b без изменения размера вывода, можно указать BLAKE2b создавать 20-байтовые дайджесты:296297```python298>>> from hashlib import blake2b299>>> h = blake2b(digest_size=20)300>>> h.update(b'Replacing SHA1 with the more secure function')301>>> h.hexdigest()302'd24f26cf8de66472d58d4e1b1774b4c9158b1f4c'303>>> h.digest_size30420305>>> len(h.digest())30620307```308309Объекты хешей с разными размерами дайджеста имеют совершенно разные выходные данные (короткие хеши *не* являются префиксами более длинных); BLAKE2b и BLAKE2s выдают разные результаты, даже если длина вывода одинакова:310311```python312>>> from hashlib import blake2b, blake2s313>>> blake2b(digest_size=10).hexdigest()314'6fa1d8fcfd719046d762'315>>> blake2b(digest_size=11).hexdigest()316'eb6ec15daf9546254f0809'317>>> blake2s(digest_size=10).hexdigest()318'1bf21a98c78a1c376ae9'319>>> blake2s(digest_size=11).hexdigest()320'567004bf96e4a25773ebf4'321```322323#### 15.1.4.3.3. Хеширование с ключом324325Хеширование с ключом может использоваться для аутентификации как более быстрая и простая замена [коду аутентификации сообщений на основе хеша](https://python-all.ru/3.6/library/hashlib.html) (HMAC). BLAKE2 можно безопасно использовать в режиме prefix-MAC благодаря свойству неразличимости, унаследованному от BLAKE.326327Этот пример показывает, как получить (в шестнадцатеричной кодировке) 128-битный код аутентификации для сообщения `b'message data'` с ключом `b'pseudorandom key'`:328329```python330>>> from hashlib import blake2b331>>> h = blake2b(key=b'pseudorandom key', digest_size=16)332>>> h.update(b'message data')333>>> h.hexdigest()334'3d363ff7401e02026f4a4687d4863ced'335```336337В качестве практического примера: веб-приложение может симметрично подписывать куки, отправляемые пользователям, и впоследствии проверять их, чтобы убедиться, что они не были изменены:338339```python340>>> from hashlib import blake2b341>>> from hmac import compare_digest342>>>343>>> SECRET_KEY = b'pseudorandomly generated server secret key'344>>> AUTH_SIZE = 16345>>>346>>> def sign(cookie):347... h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY)348... h.update(cookie)349... return h.hexdigest().encode('utf-8')350>>>351>>> def verify(cookie, sig):352... good_sig = sign(cookie)353... return compare_digest(good_sig, sig)354>>>355>>> cookie = b'user-alice'356>>> sig = sign(cookie)357>>> print("{0},{1}".format(cookie.decode('utf-8'), sig))358user-alice,b'43b3c982cf697e0c5ab22172d1ca7421'359>>> verify(cookie, sig)360True361>>> verify(b'user-bob', sig)362False363>>> verify(cookie, b'0102030405060708090a0b0c0d0e0f00')364False365```366367Несмотря на наличие встроенного режима хеширования с ключом, BLAKE2, конечно, может использоваться в конструкции HMAC с модулем [`hmac`](https://python-all.ru/3.6/library/hmac.html#module-hmac):368369```python370>>> import hmac, hashlib371>>> m = hmac.new(b'secret key', digestmod=hashlib.blake2s)372>>> m.update(b'message')373>>> m.hexdigest()374'e3c8102868d28b5ff85fc35dda07329970d1a01e273c37481326fe0c861c8142'375```376377#### 15.1.4.3.4. Рандомизированное хеширование378379Устанавливая параметр *salt* (соль), можно внести рандомизацию в хеш-функцию. Рандомизированное хеширование полезно для защиты от атак на коллизии хеш-функции, используемой в цифровых подписях.380381> Рандомизированное хеширование предназначено для ситуаций, когда одна сторона – подготовитель сообщения – создаёт всё сообщение или его часть для подписания второй стороной – подписантом. Если подготовитель способен найти коллизии криптографической хеш-функции (то есть два сообщения, дающих одно и то же хеш-значение), то он может подготовить осмысленные варианты сообщения, которые будут давать одинаковые хеш-значение и цифровую подпись, но с разными результатами (например, перевод $1 000 000 на счёт вместо $10). Криптографические хеш-функции изначально проектировались с устойчивостью к коллизиям как главной целью, но современная сосредоточенность на атаках на криптографические хеш-функции может привести к тому, что конкретная криптографическая хеш-функция будет обеспечивать меньшую устойчивость к коллизиям, чем ожидалось. Рандомизированное хеширование предоставляет подписанту дополнительную защиту, снижая вероятность того, что подготовитель сможет сгенерировать два или более сообщений, которые в конечном итоге дадут одно и то же хеш-значение в процессе генерации цифровой подписи – даже если на практике можно найти коллизии для данной хеш-функции. Однако использование рандомизированного хеширования может снизить уровень безопасности, обеспечиваемой цифровой подписью, когда все части сообщения подготовлены подписантом.382>383> ([NIST SP-800-106 «Рандомизированное хеширование для цифровых подписей»](https://python-all.ru/3.6/library/hashlib.html))384385В BLAKE2 соль обрабатывается как одноразовый вход хеш-функции во время инициализации, а не как вход каждой функции сжатия.386387> **Предупреждение**388>389> *Хеширование с солью* (или просто хеширование) с помощью BLAKE2 или любой другой криптографической хеш-функции общего назначения, такой как SHA-256, не подходит для хеширования паролей. См. [BLAKE2 FAQ](https://python-all.ru/3.6/library/hashlib.html) для получения дополнительной информации.390391```python392>>> import os393>>> from hashlib import blake2b394>>> msg = b'some message'395>>> # Вычислить первый хеш со случайной солью.396>>> salt1 = os.urandom(blake2b.SALT_SIZE)397>>> h1 = blake2b(salt=salt1)398>>> h1.update(msg)399>>> # Вычислить второй хеш с другой случайной солью.400>>> salt2 = os.urandom(blake2b.SALT_SIZE)401>>> h2 = blake2b(salt=salt2)402>>> h2.update(msg)403>>> # Дайджесты различаются.404>>> h1.digest() != h2.digest()405True406```407408#### 15.1.4.3.5. Персонализация409410Иногда бывает полезно заставить хеш-функцию выдавать разные дайджесты для одного и того же входного значения для разных целей. Цитируя авторов хеш-функции Skein:411412> Мы рекомендуем всем разработчикам приложений серьезно рассмотреть эту возможность; мы видели много протоколов, где хеш, вычисленный в одной части протокола, может быть использован в совершенно другой части, потому что два хеш-вычисления были выполнены над похожими или связанными данными, и атакующий может заставить приложение сделать входные данные для хешей одинаковыми. Персонализация каждой хеш-функции, используемой в протоколе, однозначно предотвращает такой тип атаки.413>414> ([The Skein Hash Function Family](https://python-all.ru/3.6/library/hashlib.html), p. 21)415416BLAKE2 можно персонализировать, передав байты аргументу *person*:417418```python419>>> from hashlib import blake2b420>>> FILES_HASH_PERSON = b'MyApp Files Hash'421>>> BLOCK_HASH_PERSON = b'MyApp Block Hash'422>>> h = blake2b(digest_size=32, person=FILES_HASH_PERSON)423>>> h.update(b'the same content')424>>> h.hexdigest()425'20d9cd024d4fb086aae819a1432dd2466de12947831b75c5a30cf2676095d3b4'426>>> h = blake2b(digest_size=32, person=BLOCK_HASH_PERSON)427>>> h.update(b'the same content')428>>> h.hexdigest()429'cf68fb5761b9c44e7878bfb2c4c9aea52264a80b75005e65619778de59f383a3'430```431432Персонализация вместе с ключевым режимом также может использоваться для получения разных ключей из одного.433434```python435>>> from hashlib import blake2s436>>> from base64 import b64decode, b64encode437>>> orig_key = b64decode(b'Rm5EPJai72qcK3RGBpW3vPNfZy5OZothY+kHY6h21KM=')438>>> enc_key = blake2s(key=orig_key, person=b'kEncrypt').digest()439>>> mac_key = blake2s(key=orig_key, person=b'kMAC').digest()440>>> print(b64encode(enc_key).decode('utf-8'))441rbPb15S/Z9t+agffno5wuhB77VbRi6F9Iv2qIxU7WHw=442>>> print(b64encode(mac_key).decode('utf-8'))443G9GtHFE1YluXY1zWPlYk1e/nWfu0WSEb0KRcjhDeP/o=444```445446#### 15.1.4.3.6. Древовидный режим447448Пример хеширования минимального дерева с двумя листовыми узлами:449450```python451 10452 / \45300 01454```455456Этот пример использует 64-байтовые внутренние дайджесты и возвращает 32-байтовый конечный дайджест:457458```python459>>> from hashlib import blake2b460>>>461>>> FANOUT = 2462>>> DEPTH = 2463>>> LEAF_SIZE = 4096464>>> INNER_SIZE = 64465>>>466>>> buf = bytearray(6000)467>>>468>>> # Левый лист469... h00 = blake2b(buf[0:LEAF_SIZE], fanout=FANOUT, depth=DEPTH,470... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,471... node_offset=0, node_depth=0, last_node=False)472>>> # Правый лист473... h01 = blake2b(buf[LEAF_SIZE:], fanout=FANOUT, depth=DEPTH,474... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,475... node_offset=1, node_depth=0, last_node=True)476>>> # Корневой узел477... h10 = blake2b(digest_size=32, fanout=FANOUT, depth=DEPTH,478... leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,479... node_offset=0, node_depth=1, last_node=True)480>>> h10.update(h00.digest())481>>> h10.update(h01.digest())482>>> h10.hexdigest()483'3ad2a9b37c6070e374c7a8c508fe20ca86b6ed54e286e93a0318e95e881db5aa'484```485486### 15.1.4.4. Благодарности487488[BLAKE2](https://python-all.ru/3.6/library/hashlib.html) был разработан *Jean-Philippe Aumasson*, *Samuel Neves*, *Zooko Wilcox-O’Hearn* и *Christian Winnerlein* на основе [SHA-3](https://python-all.ru/3.6/library/hashlib.html), финалистом которого был [BLAKE](https://python-all.ru/3.6/library/hashlib.html) созданный *Jean-Philippe Aumasson*, *Luca Henzen*, *Willi Meier* и *Raphael C.-W. Phan*.489490В нём используется основной алгоритм из шифра [ChaCha](https://python-all.ru/3.6/library/hashlib.html), разработанного *Daniel J. Bernstein*.491492Реализация в стандартной библиотеке основана на модуле [pyblake2](https://python-all.ru/3.6/library/hashlib.html). Её написал *Dmitry Chestnykh* на основе реализации на C, написанной *Samuel Neves*. Документация скопирована из [pyblake2](https://python-all.ru/3.6/library/hashlib.html) и написана *Dmitry Chestnykh*.493494Код на C был частично переписан для Python *Christian Heimes*.495496Следующее заявление о передаче в общественное достояние применимо как к реализации хеш-функции на C, так и к коду расширения и данной документации:497498> Насколько это возможно по закону, автор(ы) передали все авторские и смежные права на это программное обеспечение в общественное достояние по всему миру. Это программное обеспечение распространяется без каких-либо гарантий.499>500> Вы должны были получить копию посвящения в общественное достояние CC0 вместе с этим программным обеспечением. Если нет, см. [http://creativecommons.org/publicdomain/zero/1.0/](https://python-all.ru/3.6/library/hashlib.html).501502Следующие люди участвовали в разработке или вносили свои изменения в проект, передавая их в общественное достояние в соответствии с Creative Commons Public Domain Dedication 1.0 Universal:503504- *Alexandr Sokolovskiy*505506> **См. также**507>508> **Модуль [`hmac`](https://python-all.ru/3.6/library/hmac.html#module-hmac)**509>510> Модуль для генерации кодов аутентификации сообщений с использованием хешей.511>512> **Модуль [`base64`](https://python-all.ru/3.6/library/base64.html#module-base64)**513>514> Другой способ кодирования двоичных хешей для сред, не предназначенных для работы с двоичными данными.515>516> **[https://blake2.net](https://python-all.ru/3.6/library/hashlib.html)**517>518> Официальный сайт BLAKE2.519>520> **[http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf](https://python-all.ru/3.6/library/hashlib.html)**521>522> Публикация FIPS 180-2, описывающая безопасные хэш-алгоритмы.523>524> **[https://en.wikipedia.org/wiki/Cryptographic\_hash\_function#Cryptographic\_hash\_algorithms](https://python-all.ru/3.6/library/hashlib.html)**525>526> Статья в Википедии с информацией о том, в каких алгоритмах известны проблемы и что это означает для их использования.527>528> **[https://www.ietf.org/rfc/rfc2898.txt](https://python-all.ru/3.6/library/hashlib.html)**529>530> PKCS #5: Спецификация криптографии на основе пароля, версия 2.0531