Spec-Zone.ru › Python 3.10

hashlib — Безопасные хэши и дайджесты сообщений

Исходный код: Lib/hashlib.py

Этот модуль реализует общий интерфейс для многих различных алгоритмов безопасных хэшей и дайджестов сообщений. Включаются алгоритмы FIPS безопасных хэшей SHA1, SHA224, SHA256, SHA384 и SHA512 (определенные в FIPS 180-2), а также алгоритм MD5 RSA (определенный в интернет-RFC 1321). Термины «безопасный хэш» и «дайджест сообщения» взаимозаменяемы. Более старые алгоритмы назывались дайджестами сообщений. Современный термин — безопасный хэш.

Примечание

Если вам нужны функции хэширования adler32 или crc32, они доступны в модуле zlib.

Предупреждение

У некоторых алгоритмов известны слабые места в столкновениях хэшей, см. раздел «См. также» в конце.

Алгоритмы хэширования

Для каждого типа хэша существует один метод конструктора. Все они возвращают объект хэша с одинаковым простым интерфейсом. Например: используйте sha256() для создания объекта хэша SHA-256. Теперь вы можете передавать в этот объект объекты типа байты (обычно bytes) с помощью метода update(). В любой момент вы можете запросить дайджест конкатенации данных, переданных ему до сих пор, используя методы digest() или hexdigest().

Примечание

Для лучшей производительности в многопоточных приложениях Python блокировка интерпретатора Python (GIL) освобождается для данных размером более 2047 байт при создании объекта или при обновлении.

Примечание

Передача строковых объектов в update() не поддерживается, так как хэши работают с байтами, а не с символами.

Конструкторы для алгоритмов хэширования, которые всегда присутствуют в этом модуле, — это sha1(), sha224(), sha256(), sha384(), sha512(), blake2b() и blake2s(). md5() обычно также доступен, хотя может отсутствовать или быть заблокирован, если вы используете редкую «совместимую с FIPS» сборку Python. Дополнительные алгоритмы также могут быть доступны в зависимости от библиотеки OpenSSL, используемой Python на вашей платформе. На большинстве платформ также доступны sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256().

Введено в версии 3.6: Конструкторы SHA3 (Keccak) и SHAKE sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256().

Введено в версии 3.6: blake2b() и blake2s() были добавлены.

Изменено в версии 3.9: Все конструкторы hashlib принимают ключевое слово-только аргумент usedforsecurity со значением по умолчанию True. Ложное значение позволяет использовать небезопасные и заблокированные алгоритмы хэширования в ограниченных средах. False указывает, что алгоритм хэширования не используется в контексте безопасности, например, как функция одностороннего некриптографического сжатия.

Hashlib теперь использует SHA3 и SHAKE из OpenSSL 1.1.1 и новее.

Например, чтобы получить дайджест байтовой строки b'Nobody inspects the spammish repetition':

>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'
>>> m.digest_size
32
>>> m.block_size
64

Более компактно:

>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
hashlib.new(name, [data, ]*, usedforsecurity=True)

Это универсальный конструктор, который принимает строку name желаемого алгоритма в качестве первого параметра. Он также существует, чтобы предоставить доступ к перечисленным выше хэшам, а также к любым другим алгоритмам, которые может предложить ваша библиотека OpenSSL. Именные конструкторы намного быстрее, чем new(), и их следует предпочитать.

Использование new() с алгоритмом, предоставляемым OpenSSL:

>>> h = hashlib.new('sha256')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'

Hashlib предоставляет следующие постоянные атрибуты:

hashlib.algorithms_guaranteed

Множество, содержащее имена алгоритмов хэширования, гарантированно поддерживаемых этим модулем на всех платформах. Обратите внимание, что «md5» в этом списке, несмотря на то, что некоторые поставщики upstream предлагают странную «совместимую с FIPS» сборку Python, которая его исключает.

Введено в версии 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(data)

Обновляет объект хэша с помощью объекта типа байты. Повторные вызовы эквивалентны одному вызову с конкатенацией всех аргументов: m.update(a); m.update(b) эквивалентно m.update(a+b).

Изменено в версии 3.1: Блокировка интерпретатора Python (GIL) освобождается, чтобы позволить другим потокам работать во время обновления хэша на данных размером более 2047 байт при использовании алгоритмов хэширования, предоставленных OpenSSL.

hash.digest()

Возвращает дайджест данных, переданных методу update() до сих пор. Это объект типа байты размером digest_size, который может содержать байты во всем диапазоне от 0 до 255.

hash.hexdigest()

Аналогично digest(), за исключением того, что дайджест возвращается как строка объекта двойной длины, содержащая только шестнадцатеричные цифры. Это может использоваться для безопасного обмена значениями по электронной почте или в других небинарных средах.

hash.copy()

Возвращает копию («клон») объекта хэша. Это можно использовать для эффективного вычисления дайджестов данных, у которых есть общая начальная подстрока.

SHAKE переменной длины дайджесты

Алгоритмы shake_128() и shake_256() предоставляют дайджесты переменной длины с длиной в битах//2 до 128 или 256 бит безопасности. Таким образом, их методы дайджеста требуют длины. Максимальная длина не ограничена алгоритмом SHAKE.

shake.digest(length)

Возвращает дайджест данных, переданных методу update() до сих пор. Это объект типа байты размером length, который может содержать байты во всем диапазоне от 0 до 255.

shake.hexdigest(length)

Аналогично digest(), за исключением того, что дайджест возвращается как строка объекта двойной длины, содержащая только шестнадцатеричные цифры. Это может использоваться для безопасного обмена значениями по электронной почте или в других небинарных средах.

END_OF_DOCUMENT_MARKER ```

Вывод ключа

Алгоритмы вывода ключа и расширения ключа предназначены для безопасного хэширования паролей. Примитивные алгоритмы, такие как 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 должно выбираться на основе алгоритма хэширования и вычислительной мощности. По состоянию на 2022 год рекомендуется использовать сотни тысяч итераций SHA-256. Для обоснования выбора и того, как выбрать наилучший вариант для вашего приложения, прочитайте приложение A.2.2 в документе NIST-SP-800-132. Ответы на вопрос о количестве итераций pbkdf2 на stackexchange подробно объясняют этот вопрос.

dklen — длина выводимого ключа. Если dklen None, то используется размер дайджеста алгоритма хэширования hash_name, например, 64 для SHA-512.

>>> from hashlib import pbkdf2_hmac
>>> our_app_iters = 500_000  # Application specific, read above.
>>> dk = pbkdf2_hmac('sha256', b'password', b'bad salt'*2, our_app_iters)
>>> dk.hex()
'15530bba69924174860db778f2c6f8104d3aaf9d26241840c8c4a641c8d000a9'

Новая в версии 3.4.

Примечание

Быстрая реализация pbkdf2_hmac доступна с OpenSSL. Реализация на Python использует встроенную версию hmac. Она примерно в три раза медленнее и не освобождает GIL.

Устарело начиная с версии 3.10: Медленная реализация pbkdf2_hmac на Python устарела. В будущем функция будет доступна только при компиляции Python с OpenSSL.

hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64)

Функция предоставляет функцию вывода ключа scrypt, определённую в RFC 7914.

password и salt должны быть байтоподобными объектами. Приложения и библиотеки должны ограничивать password разумной длиной (например, 1024). salt должен быть примерно 16 или более байтами из надёжного источника, например, os.urandom().

n — фактор стоимости для ЦП/памяти, r — размер блока, p — фактор распараллеливания, а maxmem ограничивает память (по умолчанию 32 МБ в OpenSSL 1.1.0). dklen — длина выводимого ключа.

Новая в версии 3.6.

BLAKE2

BLAKE2 — криптографическая хеш-функция, определённая в RFC 7693, представленная в двух вариантах:

  • BLAKE2b, оптимизирован для 64-битных платформ и производит дайджесты любого размера от 1 до 64 байтов,
  • BLAKE2s, оптимизирован для 8- до 32-битных платформ и производит дайджесты любого размера от 1 до 32 байтов.

BLAKE2 поддерживает режим с ключом (более быстрый и простой заменитель HMAC), хэширование с солью, персонализацию и хэширование дерева.

Объекты хэша из этого модуля следуют API стандартных объектов библиотеки hashlib.

Создание объектов хэша

Новые объекты хэша создаются путём вызова конструкторских функций:

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, usedforsecurity=True)
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, usedforsecurity=True)

Эти функции возвращают соответствующие объекты хэша для вычисления BLAKE2b или BLAKE2s. Они необязательно принимают следующие параметры:

  • data: начальный фрагмент данных для хэширования, который должен быть байтоподобным объектом. Он может быть передан только как позиционный аргумент.
  • digest_size: размер дайджеста на выходе в байтах.
  • key: ключ для хэширования с ключом (до 64 байтов для BLAKE2b, до 32 байтов для BLAKE2s).
  • salt: соль для случайного хэширования (до 16 байтов для BLAKE2b, до 8 байтов для BLAKE2s).
  • person: строка персонализации (до 16 байтов для BLAKE2b, до 8 байтов для BLAKE2s).

В следующей таблице показаны ограничения для общих параметров (в байтах):

Хеш

digest_size

len(key)

len(salt)

len(person)

BLAKE2b

64

64

16

16

BLAKE2s

32

32

8

8

Примечание

Спецификация BLAKE2 определяет постоянные длины для параметров соли и персонализации, однако для удобства эта реализация принимает байтовые строки любого размера до указанной длины. Если длина параметра меньше указанной, она дополняется нулями. Таким образом, например, b'salt' и b'salt\x00' имеют одинаковое значение. (Это не относится к key.)

Эти размеры доступны как константы модуля, описанные ниже.

Конструкторские функции также принимают следующие параметры хэширования дерева:

  • fanout: разветвление (0 до 255, 0 если без ограничений, 1 в последовательном режиме).
  • depth: максимальная глубина дерева (1 до 255, 255 если без ограничений, 1 в последовательном режиме).
  • leaf_size: максимальная длина листа в байтах (0 до 2**32-1, 0 если без ограничений или в последовательном режиме).
  • node_offset: смещение узла (0 до 2**64-1 для BLAKE2b, 0 до 2**48-1 для BLAKE2s, 0 для первого, левого, листа или в последовательном режиме).
  • node_depth: глубина узла (0 до 255, 0 для листьев или в последовательном режиме).
  • inner_size: размер внутреннего дайджеста (0 до 64 для BLAKE2b, 0 до 32 для BLAKE2s, 0 в последовательном режиме).
  • last_node: логическое значение, указывающее, является ли обработанный узел последним (False для последовательного режима).
Explanation of tree mode parameters.

См. раздел 2.10 в спецификации BLAKE2 для подробного обзора хэширования дерева.

Константы

blake2b.SALT_SIZE
blake2s.SALT_SIZE

Длина соли (максимальная длина, принимаемая конструкторами).

blake2b.PERSON_SIZE
blake2s.PERSON_SIZE

Длина строки персонализации (максимальная длина, принимаемая конструкторами).

blake2b.MAX_KEY_SIZE
blake2s.MAX_KEY_SIZE

Максимальный размер ключа.

blake2b.MAX_DIGEST_SIZE
blake2s.MAX_DIGEST_SIZE

Максимальный размер дайджеста, который может вывести хеш-функция.

Примеры

Простое хеширование

Для вычисления хеша данных, необходимо сначала создать объект хеша, вызвав соответствующую функцию-конструктор (blake2b() или blake2s()), затем обновить его данными, вызвав update() для объекта, и, наконец, получить значение хеша, вызвав digest() (или hexdigest() для шестнадцатеричной строки).

>>> from hashlib import blake2b
>>> h = blake2b()
>>> h.update(b'Hello world')
>>> h.hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'

В качестве сокращения, вы можете передать первый фрагмент данных для обновления напрямую в конструктор в качестве позиционного аргумента:

>>> from hashlib import blake2b
>>> blake2b(b'Hello world').hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'

Вы можете вызвать hash.update() любое количество раз, для итеративного обновления хеша:

>>> from hashlib import blake2b
>>> items = [b'Hello', b' ', b'world']
>>> h = blake2b()
>>> for item in items:
...     h.update(item)
>>> h.hexdigest()
'6ff843ba685842aa82031d3f53c48b66326df7639a63d128974c5c14f31a0f33343a8c65551134ed1ae0f2b0dd2bb495dc81039e3eeb0aa1bb0388bbeac29183'

Использование различных размеров дайджеста

BLAKE2 имеет настраиваемый размер дайджеста до 64 байт для BLAKE2b и до 32 байт для BLAKE2s. Например, чтобы заменить SHA-1 на BLAKE2b без изменения размера вывода, мы можем указать BLAKE2b генерировать дайджесты размером в 20 байт:

>>> from hashlib import blake2b
>>> h = blake2b(digest_size=20)
>>> h.update(b'Replacing SHA1 with the more secure function')
>>> h.hexdigest()
'd24f26cf8de66472d58d4e1b1774b4c9158b1f4c'
>>> h.digest_size
20
>>> len(h.digest())
20

Объекты хеша с различными размерами дайджеста имеют совершенно разные выходные данные (короткие хеши не являются префиксами длинных хешей); BLAKE2b и BLAKE2s генерируют разные выходные данные даже если длина вывода одинакова:

>>> from hashlib import blake2b, blake2s
>>> blake2b(digest_size=10).hexdigest()
'6fa1d8fcfd719046d762'
>>> blake2b(digest_size=11).hexdigest()
'eb6ec15daf9546254f0809'
>>> blake2s(digest_size=10).hexdigest()
'1bf21a98c78a1c376ae9'
>>> blake2s(digest_size=11).hexdigest()
'567004bf96e4a25773ebf4'

Ключевое хеширование

Ключевое хеширование может использоваться для аутентификации в качестве более быстрого и простого заменителя Hash-based message authentication code (HMAC). BLAKE2 может безопасно использоваться в режиме prefix-MAC благодаря свойству индифферентности, унаследованному от BLAKE.

Этот пример демонстрирует, как получить (шестнадцатеричный) 128-битный код аутентификации для сообщения b'message data' с ключом b'pseudorandom key':

>>> from hashlib import blake2b
>>> h = blake2b(key=b'pseudorandom key', digest_size=16)
>>> h.update(b'message data')
>>> h.hexdigest()
'3d363ff7401e02026f4a4687d4863ced'

В качестве практического примера, веб-приложение может симметрично подписывать куки, отправляемые пользователям, и впоследствии проверять их, чтобы убедиться, что они не были изменены:

>>> from hashlib import blake2b
>>> from hmac import compare_digest
>>>
>>> SECRET_KEY = b'pseudorandomly generated server secret key'
>>> AUTH_SIZE = 16
>>>
>>> def sign(cookie):
...     h = blake2b(digest_size=AUTH_SIZE, key=SECRET_KEY)
...     h.update(cookie)
...     return h.hexdigest().encode('utf-8')
>>>
>>> def verify(cookie, sig):
...     good_sig = sign(cookie)
...     return compare_digest(good_sig, sig)
>>>
>>> cookie = b'user-alice'
>>> sig = sign(cookie)
>>> print("{0},{1}".format(cookie.decode('utf-8'), sig))
user-alice,b'43b3c982cf697e0c5ab22172d1ca7421'
>>> verify(cookie, sig)
True
>>> verify(b'user-bob', sig)
False
>>> verify(cookie, b'0102030405060708090a0b0c0d0e0f00')
False

Несмотря на наличие родного режима ключевого хеширования, BLAKE2, конечно, может использоваться в конструкции HMAC с модулем hmac:

>>> import hmac, hashlib
>>> m = hmac.new(b'secret key', digestmod=hashlib.blake2s)
>>> m.update(b'message')
>>> m.hexdigest()
'e3c8102868d28b5ff85fc35dda07329970d1a01e273c37481326fe0c861c8142'

Рандомизированное хеширование

Установив параметр salt, пользователи могут ввести рандомизацию в функцию хеширования. Рандомизированное хеширование полезно для защиты от атак на столкновения в хеш-функции, используемой в цифровых подписях.

Рандомизированное хеширование предназначено для ситуаций, когда одна сторона, подготовитель сообщения, генерирует все или часть сообщения, которое должно быть подписано второй стороной, подписывающим сообщение. Если подготовитель сообщения может найти коллизии криптографических хеш-функций (то есть два сообщения, производящие одинаковое значение хеша), то он может подготовить осмысленные версии сообщения, которые произведут одинаковое значение хеша и цифровую подпись, но с разными результатами (например, перевод 1 000 000 долл. на счет вместо 10 долл.). Криптографические хеш-функции были разработаны с коллизионной устойчивостью в качестве основной цели, но нынешняя концентрация на атаках на криптографические хеш-функции может привести к тому, что заданная криптографическая хеш-функция обеспечит меньшую коллизионную устойчивость, чем ожидалось. Рандомизированное хеширование предоставляет подписывающей стороне дополнительную защиту, уменьшая вероятность того, что подготовитель сможет сгенерировать два или более сообщений, которые в конечном итоге дадут одинаковое значение хеша во время процесса генерации цифровой подписи — даже если практично найти коллизии для хеш-функции. Однако использование рандомизированного хеширования может уменьшить количество безопасности, обеспечиваемое цифровой подписью, когда все части сообщения подготовлены подписывающей стороной.

(NIST SP-800-106 «Рандомизированное хеширование для цифровых подписей»)

В BLAKE2 соль обрабатывается как одноразовое входное значение в хеш-функцию во время инициализации, а не как входное значение для каждой функции сжатия.

Предупреждение

Хеширование с солью (или просто хеширование) с BLAKE2 или любой другой универсальной криптографической хеш-функцией, такой как SHA-256, не подходит для хеширования паролей. См. ЧАВО BLAKE2 для получения дополнительной информации.

>>> import os
>>> from hashlib import blake2b
>>> msg = b'some message'
>>> # Calculate the first hash with a random salt.
>>> salt1 = os.urandom(blake2b.SALT_SIZE)
>>> h1 = blake2b(salt=salt1)
>>> h1.update(msg)
>>> # Calculate the second hash with a different random salt.
>>> salt2 = os.urandom(blake2b.SALT_SIZE)
>>> h2 = blake2b(salt=salt2)
>>> h2.update(msg)
>>> # The digests are different.
>>> h1.digest() != h2.digest()
True

Персонализация

Иногда полезно заставить хеш-функцию производить разные дайджесты для одного и того же входного значения для разных целей. Процитируем авторов хеш-функции Skein:

Мы рекомендуем всем разработчикам приложений серьезно рассмотреть этот вопрос; мы видели много протоколов, где хеш, вычисленный в одной части протокола, может быть использован в совершенно другой части, потому что два вычисления хеша были выполнены на похожих или связанных данных, и злоумышленник может заставить приложение сделать входные данные хеша одинаковыми. Персонализация каждой хеш-функции, используемой в протоколе, в общих чертах останавливает этот тип атаки.

(Семейство хеш-функций Skein, стр. 21)

BLAKE2 можно персонализировать, передавая байты в аргумент person:

>>> from hashlib import blake2b
>>> FILES_HASH_PERSON = b'MyApp Files Hash'
>>> BLOCK_HASH_PERSON = b'MyApp Block Hash'
>>> h = blake2b(digest_size=32, person=FILES_HASH_PERSON)
>>> h.update(b'the same content')
>>> h.hexdigest()
'20d9cd024d4fb086aae819a1432dd2466de12947831b75c5a30cf2676095d3b4'
>>> h = blake2b(digest_size=32, person=BLOCK_HASH_PERSON)
>>> h.update(b'the same content')
>>> h.hexdigest()
'cf68fb5761b9c44e7878bfb2c4c9aea52264a80b75005e65619778de59f383a3'

Персонализация вместе с ключевым режимом также может использоваться для получения различных ключей из одного.

>>> from hashlib import blake2s
>>> from base64 import b64decode, b64encode
>>> orig_key = b64decode(b'Rm5EPJai72qcK3RGBpW3vPNfZy5OZothY+kHY6h21KM=')
>>> enc_key = blake2s(key=orig_key, person=b'kEncrypt').digest()
>>> mac_key = blake2s(key=orig_key, person=b'kMAC').digest()
>>> print(b64encode(enc_key).decode('utf-8'))
rbPb15S/Z9t+agffno5wuhB77VbRi6F9Iv2qIxU7WHw=
>>> print(b64encode(mac_key).decode('utf-8'))
G9GtHFE1YluXY1zWPlYk1e/nWfu0WSEb0KRcjhDeP/o=

Режим дерева

Вот пример хеширования минимального дерева с двумя узлами листа:

  10
 /  \
00  01

В этом примере используются 64-байтовые внутренние дайджесты и возвращается 32-байтовый конечный дайджест:

>>> from hashlib import blake2b
>>>
>>> FANOUT = 2
>>> DEPTH = 2
>>> LEAF_SIZE = 4096
>>> INNER_SIZE = 64
>>>
>>> buf = bytearray(6000)
>>>
>>> # Left leaf
... h00 = blake2b(buf[0:LEAF_SIZE], fanout=FANOUT, depth=DEPTH,
...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
...               node_offset=0, node_depth=0, last_node=False)
>>> # Right leaf
... h01 = blake2b(buf[LEAF_SIZE:], fanout=FANOUT, depth=DEPTH,
...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
...               node_offset=1, node_depth=0, last_node=True)
>>> # Root node
... h10 = blake2b(digest_size=32, fanout=FANOUT, depth=DEPTH,
...               leaf_size=LEAF_SIZE, inner_size=INNER_SIZE,
...               node_offset=0, node_depth=1, last_node=True)
>>> h10.update(h00.digest())
>>> h10.update(h01.digest())
>>> h10.hexdigest()
'3ad2a9b37c6070e374c7a8c508fe20ca86b6ed54e286e93a0318e95e881db5aa'

Благодарности

BLAKE2 был разработан Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O’Hearn и Christian Winnerlein на основе SHA-3 финалиста BLAKE, созданного Jean-Philippe Aumasson, Luca Henzen, Willi Meier и Raphael C.-W. Phan.

Он использует ядро алгоритма из шифра ChaCha, разработанного Daniel J. Bernstein.

Реализация stdlib основана на модуле pyblake2. Она была написана Dmitry Chestnykh на основе C-реализации, написанной Samuel Neves. Документация была скопирована из pyblake2 и написана Dmitry Chestnykh.

Код C частично был переписан для Python Christian Heimes.

Для реализации C хеш-функции, расширенного кода и этой документации применяется следующее посвящение общественному достоянию:

В максимально возможной степени в рамках закона, авторы посвятили все авторские права и связанные и смежные права на эту программу общественному достоянию во всем мире. Эта программа распространяется без каких-либо гарантий.

Вы должны были получить копию посвящения общественному достоянию CC0 вместе с этой программой. В противном случае, см. https://creativecommons.org/publicdomain/zero/1.0/.

Следующие люди помогли в разработке или внесли свои изменения в проект и общественное достояние в соответствии с универсальной лицензией Creative Commons Public Domain Dedication 1.0:

  • Alexandr Sokolovskiy

См. также

Module hmac

Модуль для генерации кодов аутентификации сообщений с использованием хешей.

Module base64

Еще один способ кодирования двоичных хешей для недвоичных сред.

https://blake2.net

Официальный сайт BLAKE2.

https://csrc.nist.gov/csrc/media/publications/fips/180/2/archive/2002-08-01/documents/fips180-2.pdf

Публикация FIPS 180-2 по безопасным алгоритмам хеширования.

https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms

Статья Википедии с информацией о том, какие алгоритмы имеют известные проблемы и что это означает с точки зрения их использования.

https://www.ietf.org/rfc/rfc8018.txt

PKCS #5: Спецификация криптографии на основе паролей, версия 2.1

https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-132.pdf

Рекомендация NIST по производству ключей на основе паролей.

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/hashlib.html

END_OF_DOCUMENT_MARKER

Spec-Zone.ru

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