Объяснение флага -hmac в открытом SSL

3

Я наткнулся на следующую команду для unix on binance, которую я пытался распаковать. Посмотреть здесь: https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md

(Раздел: ПОДПИСАННЫЕ Примеры конечных точек для POST / api / v1 / order)

openssl dgst -sha256 -hmac

Насколько я понимаю, это вызов команды openssl для создания дайджеста, дайджест будет иметь разновидность sha256, как согласовано в стандартных спецификациях. Что я не понимаю, так это -hmac флаг. Что это такое и что оно делает до математического уровня?

Моя попытка решить проблему:

Я сделал поиск в Google с openssl -hmac а также openssl dgst -hmac но 10 лучших результатов мне не помогли. Поэтому я думаю, что более опытные пользователи лучше спросить.

Обновления:

Флаг не упоминается в следующих документах: https://www.mkssoftware.com/docs/man1/openssl_dgst.1.asp и поэтому я начинаю верить, что это может не иметь криптографической цели. Хотя я сейчас не уверен.

Я нашел то, что похоже на флаг, упомянутый в этом вопросе: https://stackoverflow.com/questions/7285059/hmac-sha1-in-bash

frogeyedpeas
источник
МКС, кажется, устарела, но веб-сайт проекта OpenSSL показывает эту опцию и выпущенные OpenSSL справочные страницы делают это в течение многих лет.
dave_thompson_085
@ dave_thompson_085 Я нашел интересный пост от jww на StackOverflow и обновил свой ответ этим. Ответ удивителен, если не сказать больше.
Maarten Bodewes

Ответы:

4

HMAC также называется хеш-ключом. Таким образом, вы можете генерировать один и тот же хеш при проверке, если у вас есть тот же ключ, который использовался при генерации подписи. Результат MAC называется тег аутентификации ,

HMAC - это специальная конструкция, которая использует два вызова хеша - в вашем случае SHA-256 - который используется внутри и не использует никаких других криптографические примитивы , Поэтому его можно рассматривать как конкретный Режим самого хэша. Отсюда и включение в dgst ,

В вашем коде отсутствуют ключевые данные, которые, конечно, необходимы для создания ключевого хэша. Это должно быть представлено после -hmac, к несчастью openssl требуется двоичный формат ключа. Для получения дополнительной информации см. этот старый разговор в списке рассылки OpenSSL ,

РЕДАКТИРОВАТЬ # 1: копать немного глубже, если вы хотите указать ключ в шестнадцатеричном формате, вы можете использовать строку, как это:

echo -n "Hello world!" | openssl dgst -sha256 -mac hmac -macopt hexkey:01020304

Выходные данные функции являются выходными данными второго запуска хэша, поэтому он не отличается от просто SHA-256, если вы просто посмотрите на размер результата хеш / HMAC. Разумеется, содержимое будет полностью отличаться от простого хеширования данных (или объединения ключей и данных).


РЕДАКТИРОВАТЬ # 2: Однако вы не указали ключ, так что на самом деле HMAC пропускается и используется SHA-256. Это было помечено как ошибка, см. Вот

Maarten Bodewes
источник
1
В этом API (по ссылке) они используют ключ формы ASCII (длинная строка base64), который затем используется в качестве аргумента после -hmac, Если вы хотите использовать двоичные ключи, вам необходимо преобразовать их в шестнадцатеричные строки (как в enc -K вариант) и использовать альтернативную форму команды openssl dgst -sha256 -mac HMAC -macopt hexkey:ABCDEF0102 например
Henno
Конечно, для энтропии не имеет значения, если мы используем ASCII-ключ NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j или эквивалентные 48 необработанных байтов. Обычно в таких API-вызовах к base64 все так, что строковые методы (или аргументы) просто работают. HTTP также предпочитает ASCII (для ключей API в заголовках и т. Д.)
Henno
Спасибо за комментарии Хенно. Мне потребовалось некоторое время, чтобы подтвердить. Отправленный из поезда, было немного трудно набирать команды.
Maarten Bodewes