Gibt es ein Bash-Skript, um einen HMAC-SHA1
Hash zu generieren ?
Ich suche etwas, das dem folgenden PHP-Code entspricht:
hash_hmac("sha1", "value", "key");
Gibt es ein Bash-Skript, um einen HMAC-SHA1
Hash zu generieren ?
Ich suche etwas, das dem folgenden PHP-Code entspricht:
hash_hmac("sha1", "value", "key");
Antworten:
Mir ist klar, dass dies nicht genau das ist, wonach Sie fragen, aber es macht keinen Sinn, das Rad neu zu erfinden und eine Bash-Version zu schreiben.
Sie können einfach den openssl
Befehl verwenden, um den Hash in Ihrem Skript zu generieren.
[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Oder einfach:
[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Denken Sie daran, -n
mit zu verwenden, da echo
sonst ein Zeilenumbruchzeichen an die Zeichenfolge angehängt wird und Ihre Daten und der Hash geändert werden.
Dieser Befehl stammt aus dem OpenSSL-Paket, das bereits unter Linux / Unix, Cygwin und ähnlichen Geräten Ihrer Wahl installiert (oder einfach installiert) werden sollte.
Beachten Sie, dass ältere Versionen von openssl
(z. B. die mit RHEL4 gelieferte) möglicherweise nicht die -hmac
Option bieten .
Als alternative Lösung, aber hauptsächlich um zu beweisen, dass die Ergebnisse gleich sind, können wir auch PHPs hmac_sha1()
über die Befehlszeile aufrufen :
[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
sha1
ersetzt durch sha256
:-)
openssl genrsa
? Außerdem führt der OpenSL-Dokumentationslink zu einem 404.
Hier ist eine Bash-Funktion, die wie hash_hmac
in PHP funktioniert :
#!/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"
. Alternativ können Sie Ihre Datei auch einfach weiterleiten, openssl dgst
ohne diese hash_hmac
Funktion zu verwenden.
Danke für die hash_hmac Funktion! Für meine Bewerbung hat es aber nicht gereicht. Für den Fall, dass sich jemand wunderte, musste ich das Zeug mehrmals mit einem Schlüssel neu hashen, der das Ergebnis des vorherigen Hashings war und daher eine binäre Eingabe ist. (Die Amazon AWS-Authentifizierungssignatur wird wie folgt erstellt.)
Was ich also brauchte, war eine Möglichkeit, den Binärschlüssel auf eine Weise bereitzustellen, die den Algorithmus nicht beschädigen würde. Dann fand ich dies: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html
Für die Antwort von Stephen Henson muss die Funktion hash_hmac den Wert im Hex-Format zurückgeben. Es muss also Folgendes wiedergeben:
$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'
Dann müsste der nächste Aufruf den Schlüssel als hexit bereitstellen:
$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'
Hoffentlich hilft dies jedem, wahrscheinlich jemandem, der versucht, Bash-Skripte zu erstellen, um CloudFront-Einträge in AWS ungültig zu machen (wie ich!) (Ich habe es noch nicht getestet, aber ich denke, dies ist die Ursache für mein Bash-Skript funktioniert nicht und mein PHP funktioniert ...)
Für diejenigen, die mehr JWT in der Befehlszeile erkunden möchten : cooles JWT-Bash-Skript