Y at-il un script bash pour générer un HMAC-SHA1
hash?
Je cherche quelque chose d’équivalent à ce qui suit PHP code:
hash_hmac("sha1", "value", "key");
Je réalise 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 commande openssl
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, ce qui modifie vos données et le hachage.
Cette commande provient du paquet 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 celles livrées avec RHEL4) peuvent ne pas fournir l'option -hmac
.
Comme solution alternative, mais principalement pour prouver que les résultats sont identiques, nous pouvons également appeler la fonction hmac_sha1()
de PHP à partir de la ligne de commande:
[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
Voici une fonction bash qui fonctionne comme hash_hmac
de 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"
Merci pour la fonction hash_hmac! Mais ce n'était pas suffisant pour mon application. Au cas où quelqu'un se le demanderait, j'ai dû refaire le hachage plusieurs fois en utilisant une clé qui était le résultat du hachage précédent et qui constitue donc une entrée binaire. (La signature d'authentification Amazon AWS est créée comme suit.)
Il me fallait donc un moyen de fournir la clé binaire d’une manière qui ne casserait pas l’algorithme. Puis 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 exige que la fonction hash_hmac renvoie la valeur au format hexadécimal. Donc, il doit 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 la forme d'un 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 d'invalider les entrées CloudFront sur AWS (comme moi!) (Je ne l'ai pas encore testé, mais je pense que c'est la cause de la raison pour laquelle mon script bash ne fonctionne pas, et mon PHP on le fait ...)
Pour ceux qui aiment explorer plus de JWT sur la ligne de commande: script jwt bash cool