it-swarm.com.de

HMAC-SHA1 in bash

Gibt es ein Bash-Skript zum Erzeugen eines HMAC-SHA1 hash?

Ich suche nach etwas, das dem folgenden entspricht PHP code:

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

Mir ist klar, dass das nicht genau das ist, wonach Sie fragen, aber es hat keinen Sinn, das Rad neu zu erfinden und eine Bash-Version zu schreiben.

Sie können einfach den Befehl openssl verwenden, um den Hash in Ihrem Skript zu generieren.

[[email protected]] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

Oder einfach:

[[email protected]] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319

Denken Sie daran, -n Mit echo zu verwenden, da ansonsten ein Zeilenumbruchzeichen an die Zeichenfolge angehängt wird, das Ihre Daten und den Hash ändert.

Dieser Befehl stammt aus dem OpenSSL-Paket, das bereits unter Linux/Unix, Cygwin und ähnlichen Betriebssystemen installiert (oder problemlos installiert) sein sollte.

Beachten Sie, dass ältere Versionen von openssl (wie die mit RHEL4 gelieferte) möglicherweise nicht die Option -hmac Enthalten.


Als alternative Lösung, aber hauptsächlich um zu beweisen, dass die Ergebnisse gleich sind, können wir PHPs hmac_sha1() auch von der Kommandozeile aus aufrufen:

[[email protected]]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
166
Shawn Chin

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" "[email protected]"
}

# 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

Danke für die hash_hmac Funktion! Für meine Bewerbung hat es aber nicht gereicht. Für den Fall, dass sich jemand wundert, musste ich das Zeug mehrmals mit einem Schlüssel, der das Ergebnis des vorherigen Hashings war, neu hashen und ist daher eine Binäreingabe. (Die Amazon AWS-Authentifizierungssignatur wird folgendermaßen erstellt.)

Ich brauchte also eine Möglichkeit, den Binärschlüssel auf irgendeine Weise bereitzustellen, die den Algorithmus nicht zerstört. Dann habe ich folgendes gefunden: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html

Stephen Hensons Antwort erfordert die Funktion hash_hmac, um den Wert im Hex-Format zurückzugeben. 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 für ungültig zu erklären (wie ich!) funktioniert nicht und mein PHP man tut ...)

7
Wouter Thielen

Für diejenigen, die mehr über JWT auf der Kommandozeile erfahren möchten: cooles JWT-Bash-Skript

0
typelogic