web-dev-qa-db-fra.com

HMAC-SHA1 en bash

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");
86
Mark

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
166
Shawn Chin

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"
38
Martin

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 ...)

7
Wouter Thielen

Pour ceux qui aiment explorer plus de JWT sur la ligne de commande: script jwt bash cool

0
typelogic