Python: как сравнить хешлиб lib и дайджесты сообщений hmac lib - PullRequest
0 голосов
/ 01 апреля 2019

Я искал вокруг и не мог найти ответ на этот вопрос.Я заметил, что могу генерировать дайджесты сообщений, используя, скажем, алгоритм blake2b, используя библиотеку hashlib или библиотеку hmac, которая использует digestmod, обозначенный hashlib.Итак:

plainMsg = "this is a plaintext message"
hashlib_hashed = hashlib.blake2b(key=b'super secret key')
hashlib_hashed.update(plainMsg.encode())
hmac_hashed = hmac.new(b'super secret key', digestmod=hashlib.blake2b)
hmac_hashed.update(plainMsg.encode())

print(hashlib_hashed.hexdigest())
print(hmac_hashed.hexdigest())

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

ec0d0ab13d7e7f3b62d742aa92078a4a14346ee6ee352e27c8814e4bf6361556fdc3d301e100b5a2c90c5596c4b2bb72c887c6b6aa92fb41752f6b52105ce13b
b632045e745550e5b9da6d411c013c978cb8120847260eb8fda9c8885368a5eaba80cd74ad95a51b1a4bde1f47cccb5a2e4591e9935126f673479c7474c2be97

Я изначально думал, что это связано с солью, так как я не использовал один с hashlib.blake2b(), поэтому я думаю, что он пуст, поскольку salt=b'',Но с помощью hmac я не нашел, как настроить соль.Итак, кто-нибудь может объяснить?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Алгоритм HMAC - это больше, чем просто «ключ хеша, за которым следует сообщение»; ключ дополняется для соответствия размеру блока алгоритма, каждый байт затем записывается с фиксированным «ipad» (0x36), хеш вычисляется из этого значения, после которого вычисляется текст. Затем исходный дополненный ключ записывается с фиксированным «opad» (0x5C), и хеш снова вычисляется из этого нового значения, за которым следует хеш из предыдущего шага.

Дело в том, что это не так просто, как вы думаете. Вы можете просмотреть содержимое класса hmac.HMAC , чтобы увидеть, что дополнительный Python делает для следования HMAC RFC .

0 голосов
/ 01 апреля 2019

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

Когда вы используете модуль hmac, вы создаете хэшированный MAC или HMAC . Здесь ключ используется дважды (с другой маской XOR каждый раз) для добавления значения к данным, а хеш-функция (предоставляемая библиотекой hashlib) используется для обработки входных данных блоком за один раз, чтобы «сжать» данные сначала во внутреннее значение, а затем во внешнее значение после добавления второго ключа в двухэтапном процессе. Это делает алгоритм очень гибким, поскольку любой хеш-блок может быть адаптирован для этой техники.

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

Но Blake2 без ключа - это просто еще одна хеш-функция, такая как SHA256 и другие, и когда вы используете ее в HMAC, другой подход приведет к другому результату. Эти два несовместимы, потому что два алгоритма используют свой ключ очень по-разному.

Цитирование из RFC 7693 - BLAKE2 Crypto Hash и MAC :

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

и из раздела BLAKE2 документации hashlib :

BLAKE2 поддерживает режим клавиш (более быстрая и простая замена HMAC), [...]

Аргумент salt для функции hashlib.blake2b() - это другая особенность алгоритма хеширования BLAKE2, где в противном случае вы просто добавили бы соль с хешированным открытым текстом. Соль «рандомизирует» выходные данные, так что маловероятно, что один и тот же входной сигнал будет выдаваться дважды для одного и того же входящего сообщения (что делает невозможным обнаружение повторяющихся сообщений третьим лицом).

...