Подтвердить что ты не робот

HMAC-SHA1 в bash

Есть ли bash script для генерации хеша HMAC-SHA1?

Я ищу что-то, эквивалентное следующему PHP-коду:

hash_hmac("sha1", "value", "key");
4b9b3361

Ответ 1

Я понимаю, что это не совсем то, о чем вы просите, но нет смысла изобретать колесо и писать версию bash.

Вы можете просто использовать команду openssl для генерации хэша в script.

[[email protected]] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

Или просто:

[[email protected]] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

Не забудьте использовать -n с echo, иначе символ строки будет добавлен к строке и изменит ваши данные и хэш.

Эта команда поступает из пакета OpenSSL, который уже должен быть установлен (или легко установлен) в вашем выборе Linux/Unix, Cygwin и т.д.

Заметьте, что более старые версии openssl (например, поставляемые с RHEL4) могут не предоставлять параметр -hmac.


В качестве альтернативного решения, но в основном для подтверждения того, что результаты одинаковы, мы также можем вызвать PHP hmac_sha1() из командной строки:

[[email protected]]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319

Ответ 2

Вот функция bash, которая работает как hash_hmac из PHP:

#!/bin/bash

function hash_hmac {
  digest="$1"
  data="$2"
  key="$3"
  shift 3
  echo -n "$data" | openssl dgst "-$digest" -hmac "$key" "[email protected]"
}

# hex output by default
hash_hmac "sha1" "value" "key"

# raw output by adding the "-binary" flag
hash_hmac "sha1" "value" "key" -binary | base64

# other algos also work
hash_hmac "md5"  "value" "key"

Ответ 3

Спасибо за функцию hash_hmac! Но этого было недостаточно для моего приложения. В случае, если кто-то задается вопросом, мне пришлось повторно использовать хэш файл несколько раз, используя ключ, который был результатом предыдущего хеширования, и, следовательно, является двоичным вводом. (Подпись аутентификации Amazon AWS создается следующим образом.)

Так что мне нужен был способ снабдить двоичный ключ каким-то образом, который не нарушил бы алгоритм. Затем я нашел это: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

Ответ Стивена Хенсона требует, чтобы функция hash_hmac возвращала значение в шестнадцатеричном формате. Поэтому необходимо повторить следующее:

$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'

Затем следующий вызов должен предоставить ключ как hexit:

$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'

Надеюсь, это поможет любому, возможно, кому-то, кто пытается создать скрипты bash, чтобы аннулировать записи CloudFront на AWS (например, я!) (я еще не тестировал его, но я думаю, что это то, что является причиной почему мой bash script не работает, и мой PHP файл делает это...)

Ответ 4

Тем, кто любит изучать больше JWT в командной строке: cool jwt bash script