121 votes

HMAC-SHA1 dans bash

Est-il un script bash pour générer un HMAC-SHA1 de hachage?

Je suis à la recherche de quelque chose d'équivalent pour le code PHP suivant:

hash_hmac("sha1", "value", "key");

238voto

Shawn Chin Points 29756

Je constate que ce n'est pas exactement ce que vous demandez, mais il ne sert à rien de réinventer la roue et de l'écriture d'un bash version.

Vous pouvez simplement utiliser l' openssl commande pour générer le hachage dans votre script.

[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

Ou tout simplement:

[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

N'oubliez pas d'utiliser -n avec echo , ou encore un caractère de saut de ligne est ajouté à la chaîne et que les modifications apportées à vos données et de la table de hachage.

Cette commande vient du paquet OpenSSL qui devrait déjà être installé (ou facilement installé dans votre choix de Unix/Linux, Cygwin et l'aime.

Notez que les anciennes versions d' openssl (telles que fournies avec RHEL4) ne peuvent pas prévoir l' -hmac option.


Comme une solution alternative, mais surtout de prouver que les résultats sont les mêmes, nous pouvons aussi appeler PHP hmac_sha1() à partir de la ligne de commande:

[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319

44voto

Martin Points 13951

Voici un bash fonction 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"

14voto

Wouter Thielen Points 164

Merci pour le hash_hmac fonction! Mais ce n'était pas assez pour mon application. Dans le cas où quelqu'un s'est demandé, j'ai dû re-hachage des trucs à plusieurs reprises à l'aide d'une clé qui a été le résultat de la précédente hachage, et, par conséquent, est une entrée binaire. (Amazon AWS authentification de signature est créée comme ceci.)

Donc, ce que j'avais besoin d'un moyen de fournir la clé binaire d'une certaine façon qui permettrait de ne pas casser l'algorithme. Ensuite, j'ai trouvé ceci: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

Stephen Henson réponse nécessite la hash_hmac fonction pour renvoyer la valeur au format hexadécimal. Il doit donc faire l'écho de l'suivantes:

$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'

Alors le prochain appel devra fournir la clé comme un hexit:

$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'

Espérons que cela aide quelqu'un, probablement quelqu'un qui essaie de créer des scripts bash pour invalider CloudFront entrées sur AWS (comme moi!) (Je n'ai pas encore testé, mais je pense que c'est la chose qui est la cause de pourquoi mon script bash ne fonctionne pas, et mon PHP on n'...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X