HMAC-SHA1 в Баш


есть ли скрипт bash для создания HMAC-SHA1 хэш?

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

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

4 ответа:

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

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

[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

или просто:

[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

не забывайте использовать -n С echo или же к строке добавляется символ разрыва строки, который изменяет ваши данные и хэш.

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

обратите внимание, что более старые версии openssl (например, поставляемый с RHEL4) не может обеспечить .


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

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

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

#!/bin/bash

function hash_hmac {
  digest=""
  data=""
  key=""
  shift 3
  echo -n "$data" | openssl dgst "-$digest" -hmac "$key" "$@"
}

# 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"

Спасибо за функцию 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 не работает, а мой PHP-один...)

для тех, кто любит исследовать больше JWT в командной строке: классный скрипт JWT bash