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

hashlib – безопасные хеши и дайджесты сообщенийhashlib – Secure hashes and message digests

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


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

Примечание

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

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

Некоторые алгоритмы имеют известные уязвимости к коллизиям хешей; обратитесь к разделу «См. также» в конце.

Алгоритмы хешированияHash algorithms

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

Примечание

Для повышения производительности в многопоточных приложениях GIL Python освобождается для данных размером более 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().

Например, чтобы получить дайджест байтовой строки 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])

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

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

>>> h = hashlib.new('ripemd160')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'

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

hashlib.algorithms_guaranteed

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

Новое в версии 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: GIL Python освобождается, чтобы другие потоки могли выполняться, пока происходит обновление хеша для данных размером более 2047 байт при использовании алгоритмов хеширования, предоставляемых OpenSSL.

hash.digest()

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

hash.hexdigest()

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

hash.copy()

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

Дайджесты переменной длины SHAKESHAKE variable length digests

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

shake.digest(length)

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

shake.hexdigest(length)

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

Вывод ключейKey derivation

Алгоритмы вывода ключей и растяжения ключей предназначены для безопасного хэширования паролей. Простые алгоритмы, такие как 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().

Количество итераций должно выбираться на основе алгоритма хеширования и вычислительной мощности. По состоянию на 2013 год рекомендуется не менее 100 000 итераций SHA-256.

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

>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)
b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'

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

Примечание

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

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

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

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

n – множитель затрат CPU/памяти, r – размер блока, p – коэффициент параллелизма, а maxmem ограничивает память (по умолчанию в OpenSSL 1.1.0 – 32 МиБ). dklen – длина производного ключа.

Доступность: OpenSSL 1.1+.

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

BLAKE2

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

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

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

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

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

Создание хеш-объектовCreating hash objects

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

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)
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)

Эти функции возвращают соответствующие хеш-объекты для вычисления 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: 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 для последовательного режима).

Пояснение параметров режима дерева.

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

КонстантыConstants

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

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

ПримерыExamples

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

Чтобы вычислить хеш некоторых данных, сначала необходимо создать объект хеша, вызвав соответствующую функцию-конструктор (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'

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

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'

Хеширование с ключомKeyed hashing

Хеширование с ключом может использоваться для аутентификации как более быстрая и простая замена коду аутентификации сообщений на основе хеша (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'

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

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

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

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

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

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

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

>>> import os
>>> from hashlib import blake2b
>>> msg = b'some message'
>>> # Вычислить первый хеш со случайной солью.
>>> salt1 = os.urandom(blake2b.SALT_SIZE)
>>> h1 = blake2b(salt=salt1)
>>> h1.update(msg)
>>> # Вычислить второй хеш с другой случайной солью.
>>> salt2 = os.urandom(blake2b.SALT_SIZE)
>>> h2 = blake2b(salt=salt2)
>>> h2.update(msg)
>>> # Дайджесты различаются.
>>> h1.digest() != h2.digest()
True

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

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

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

(The Skein Hash Function Family, p. 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=

Древовидный режимTree mode

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

  10
 /  \
00  01

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

>>> from hashlib import blake2b
>>>
>>> FANOUT = 2
>>> DEPTH = 2
>>> LEAF_SIZE = 4096
>>> INNER_SIZE = 64
>>>
>>> buf = bytearray(6000)
>>>
>>> # Левый лист
... 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)
>>> # Правый лист
... 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)
>>> # Корневой узел
... 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'

АвторыCredits

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.

Реализация в стандартной библиотеке основана на модуле 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 Universal:

  • Alexandr Sokolovskiy

См. также

Модуль hmac

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

Модуль 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/rfc2898.txt

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