Содержание страницы
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().
Например, чтобы получить дайджест байтовой строки 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()¶ Возвращает копию («клон») хеш-объекта. Это можно использовать для эффективного вычисления дайджестов данных, имеющих общую начальную подстроку.
Дайджесты переменной длины SHAKE¶SHAKE variable length digests
Алгоритмы shake_128() и shake_256() предоставляют дайджесты
переменной длины с length_in_bits//2 до 128 или 256 бит безопасности.
Поэтому их методы дайджеста требуют указания длины. Максимальная длина не ограничена
алгоритмом SHAKE.
-
shake.digest(length)¶ Возвращает дайджест данных, переданных методу
update()на текущий момент. Это объект bytes размером length, который может содержать байты во всём диапазоне от 0 до 255.
Вывод ключей¶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