Spec-Zone.ru › Python 3.9

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

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

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

Примечание

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

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

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

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

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

Примечание

Для повышения производительности в многопоточных средах 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 должно выбираться на основе алгоритма хеширования и вычислительной мощности. По состоянию на 2013 год рекомендуется не менее 100 000 итераций SHA-256.

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

>>> import hashlib
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> dk.hex()
'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.

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

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

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'

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

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

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

>>> 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 был разработан Жан-Пьером Омассоном, Самуэлем Невесом, Зуко Уилкокс-О'Херном и Кристианом Виннерлейном на основе финалиста SHA-3 BLAKE, созданного Жан-Пьером Омассоном, Лукой Хенценом, Вилли Майером и Рафаэлем К.-У. Фаном.

Он использует ядро алгоритма из шифра ChaCha, разработанного Даниэлем Дж. Бернштейном.

Реализация в стандартной библиотеке основана на модуле pyblake2. Она была написана Дмитрием Честныковым на основе реализации на C, написанной Самуэлем Невесом. Документация была скопирована из pyblake2 и написана Дмитрием Честныковым.

Код C был частично переписан для Python Кристианом Хаймсом.

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

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

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

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

  • Александр Соколовский

См. также

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/rfc2898.txt

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

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

END_OF_DOCUMENT_MARKER

Spec-Zone.ru

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