Risposte:
Mi rendo conto che questo non è esattamente quello che stai chiedendo, ma non ha senso reinventare la ruota e scrivere una versione bash.
Puoi semplicemente usare il openssl
comando per generare l'hash all'interno del tuo script.
[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
O semplicemente:
[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Ricorda di usare -n
con echo
altrimenti un carattere di interruzione di riga viene aggiunto alla stringa e questo cambia i tuoi dati e l'hash.
Quel comando proviene dal pacchetto OpenSSL che dovrebbe essere già installato (o installato facilmente) nella tua scelta di Linux / Unix, Cygwin e simili.
Tieni presente che le versioni precedenti di openssl
(come quella fornita con RHEL4) potrebbero non fornire l' -hmac
opzione.
Come soluzione alternativa, ma principalmente per dimostrare che i risultati sono gli stessi, possiamo anche chiamare PHP hmac_sha1()
dalla riga di comando:
[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
sha1
viene sostituita con sha256
:-)
openssl genrsa
? Inoltre, il collegamento alla documentazione di openssl risulta in un 404.
Ecco una funzione bash che funziona come hash_hmac
da 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"
. In alternativa puoi semplicemente reindirizzare il tuo file openssl dgst
senza usare questa hash_hmac
funzione.
Grazie per la funzione hash_hmac! Ma non era abbastanza per la mia domanda. Nel caso qualcuno se lo chiedesse, ho dovuto ripetere l'hashing più volte usando una chiave che era il risultato dell'hash precedente, e quindi è un input binario. (La firma di autenticazione di Amazon AWS viene creata in questo modo.)
Quindi quello di cui avevo bisogno era un modo per fornire la chiave binaria in un modo che non rompesse l'algoritmo. Poi ho trovato questo: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html
La risposta di Stephen Henson richiede che la funzione hash_hmac restituisca il valore in formato esadecimale. Quindi deve echeggiare quanto segue:
$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'
Quindi la chiamata successiva dovrebbe fornire la chiave come hexit:
$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'
Spero che questo aiuti chiunque, probabilmente qualcuno che sta cercando di creare script bash per invalidare le voci CloudFront su AWS (come me!) (Non l'ho ancora testato, ma penso che questa sia la causa del motivo per cui il mio script bash non funziona e il mio PHP funziona ...)
A coloro a cui piace esplorare più JWT sulla riga di comando: cool jwt bash script