HMAC-SHA1 в баш - PullRequest
       81

HMAC-SHA1 в баш

85 голосов
/ 02 сентября 2011

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

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

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

Ответы [ 4 ]

164 голосов
/ 02 сентября 2011

Я понимаю, что это не совсем то, что вы просите, но нет смысла заново изобретать колесо и писать версию 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) могут не предоставлять опцию -hmac.


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

[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
38 голосов
/ 12 сентября 2011

Вот функция 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" "$@"
}

# 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"
7 голосов
/ 13 марта 2014

Спасибо за функцию 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/^.* //'

Тогда при следующем вызове потребуется предоставить ключ в виде гексита:

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

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

0 голосов
/ 08 февраля 2017

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

...