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 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().
Например, чтобы получить дайджест байтовой строки 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]) -
Является универсальным конструктором, который принимает строку имя желаемого алгоритма в качестве первого параметра. Он также существует, чтобы обеспечить доступ к перечисленным выше хешам, а также к любым другим алгоритмам, которые может предложить ваша библиотека OpenSSL. Имена конструкторов намного быстрее, чем
new(), и их следует предпочитать.
Использование new() с алгоритмом, предоставленным OpenSSL:
>>> h = hashlib.new('sha512_256')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'19197dc4d03829df858011c6c87600f994a858103bbc19005f20987aa19a97e2'
Hashlib предоставляет следующие атрибуты-константы:
-
hashlib.algorithms_guaranteed -
Множество, содержащее имена алгоритмов хеширования, гарантированно поддерживаемых этим модулем на всех платформах. Обратите внимание, что ‘md5’ находится в этом списке, несмотря на то, что некоторые поставщики предлагают странную «соответствующую 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() предоставляют дайджесты переменной длины с длиной length_in_bits//2 до 128 или 256 битов безопасности. Таким образом, их методы дайджеста требуют длины. Максимальная длина не ограничена алгоритмом SHAKE.
-
shake.digest(length) -
Возвращает дайджест данных, переданных методу
update()до сих пор. Это объект типа байт размером length, который может содержать байты в диапазоне от 0 до 255.
-
shake.hexdigest(length) -
Аналогично
digest(), за исключением того, что дайджест возвращается как строковый объект двойной длины, содержащий только шестнадцатеричные цифры. Это может быть использовано для безопасного обмена значениями по электронной почте или в других небинарных средах.
Вывод ключа
Алгоритмы вывода ключа и растягивания ключа предназначены для безопасного хэширования паролей. Примитивные алгоритмы, такие как 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 — коэффициент затрат на процессор/память, 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)
-
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: коэффициент ветвления (от 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 для всестороннего обзора хеширования деревьев.
Константы
-
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'
В качестве практического примера, веб-приложение может симметрично подписывать файлы 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 был разработан Жан-Пьером Омассоном, Самуэлем Невесом, Зуко Вилкокс-О'Хирном и Кристианом Виннерлейном на основе финалиста конкурса NIST SHA-3 BLAKE, созданного Жан-Пьером Омассоном, Лукой Генценом, Вилли Майером и Рафаэлем К.-В. Фаном.
Он использует алгоритм ядра из шифра ChaCha, разработанного Дэниелом Дж. Бернштейном.
Реализация stdlib основана на модуле pyblake2. Она была написана Дмитрием Честныховым на основе реализации на языке C, написанной Самуэлем Невесом. Документация была скопирована из pyblake2 и написана Дмитрием Честныховым.
Код на языке C был частично переписан для языка Python Кристианом Хаймесом.
Следующее посвящение в общественное достояние применимо как для реализации функции хеширования на C, расширения кода, так и для этой документации:
В максимальной степени, допускаемой законом, авторы предоставили все права на авторское право и смежные права на настоящее программное обеспечение общественности во всем мире. Это программное обеспечение распространяется без каких-либо гарантий.
Вы должны были получить копию посвящения CC0 в общественное достояние вместе с этим программным обеспечением. В противном случае см. https://creativecommons.org/publicdomain/zero/1.0/.
Следующие люди помогли в разработке или внесли свои изменения в проект и общественное достояние в соответствии с посвящением Creative Commons Public Domain Dedication 1.0 Universal:
- Александр Соколовский
См. также
-
Modulehmac -
Модуль для генерации кодов аутентификации сообщений с использованием хешей.
-
Modulebase64 -
Еще один способ кодирования двоичных хешей для недвоичных сред.
- 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.8/library/hashlib.html