Réponses:
Je me rends compte que ce n'est pas exactement ce que vous demandez, mais il ne sert à rien de réinventer la roue et d'écrire une version bash.
Vous pouvez simplement utiliser la openssl
commande pour générer le hachage dans votre script.
[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Ou simplement:
[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
N'oubliez pas d'utiliser -n
avec, echo
sinon un caractère de saut de ligne est ajouté à la chaîne et cela change vos données et le hachage.
Cette commande provient du package OpenSSL qui devrait déjà être installé (ou facilement installé) dans votre choix de Linux / Unix, Cygwin et autres.
Notez que les anciennes versions de openssl
(comme celle livrée avec RHEL4) peuvent ne pas fournir cette -hmac
option.
Comme solution alternative, mais principalement pour prouver que les résultats sont les mêmes, nous pouvons également appeler PHP hmac_sha1()
depuis la ligne de commande:
[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
sha1
est remplacée par sha256
:-)
openssl genrsa
? De plus, le lien de documentation openssl donne un 404.
Voici une fonction bash qui fonctionne comme hash_hmac
depuis 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"
. Sinon, vous pouvez simplement diriger votre fichier openssl dgst
sans utiliser cette hash_hmac
fonction.
Merci pour la fonction hash_hmac! Mais ce n'était pas suffisant pour ma candidature. Au cas où quelqu'un se poserait la question, j'ai dû re-hacher des trucs plusieurs fois en utilisant une clé qui était le résultat du hachage précédent, et donc une entrée binaire. (La signature d'authentification Amazon AWS est créée comme ceci.)
Donc, ce dont j'avais besoin était un moyen de fournir la clé binaire d'une manière qui ne briserait pas l'algorithme. Ensuite, j'ai trouvé ceci: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html
La réponse de Stephen Henson nécessite que la fonction hash_hmac renvoie la valeur au format hexadécimal. Il doit donc faire écho à ce qui suit:
$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'
Ensuite, le prochain appel devra fournir la clé sous forme d'hexit:
$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'
Espérons que cela aide n'importe qui, probablement quelqu'un qui essaie de créer des scripts bash pour invalider les entrées CloudFront sur AWS (comme moi!) (Je ne l'ai pas encore testé, mais je pense que c'est la raison pour laquelle mon script bash ne fonctionne pas, et mon PHP fonctionne ...)
Pour ceux qui aiment explorer plus JWT sur la ligne de commande: cool script jwt bash