Відповіді:
Я розумію, що це не зовсім те, про що ви просите, але немає сенсу винаходити колесо і писати версію 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
sha1
замінено на sha256
:-)
openssl genrsa
? Крім того, посилання на документацію openssl дає 404.
Ось функція 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"
hash_hmac "sha1" "$(cat your-json-file)" "key"
. Крім того, ви можете просто передати файл openssl dgst
без використання цієї hash_hmac
функції.
Дякуємо за функцію 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 у командному рядку: cool jwt bash script