Berechnen Sie einen HMAC oder prüfen Sie den, den ein Webhook gesendet hat
Dieser HMAC Generator signiert eine Nachricht mit einem geheimen Schlüssel per HMAC-SHA256, HMAC-SHA1, HMAC-SHA384 oder HMAC-SHA512 und zeigt die Signatur gleichzeitig als Hex in Klein- und Großbuchstaben, als Base64 und als Base64url. Schlüssel und Nachricht lassen sich jeweils als Klartext, Hex oder Base64 eingeben, sodass sowohl rohe binäre Secrets als auch Passwörter funktionieren. Fügen Sie die empfangene Signatur ein — <code>sha256=…</code> von GitHub, einen Stripe-Header <code>t=…,v1=…</code> oder einfaches Base64 — und das Tool sagt Ihnen, ob sie übereinstimmt. Die Berechnung nutzt die Web Crypto API Ihres Browsers; Schlüssel und Nachricht verlassen die Seite nie.
So erzeugen oder prüfen Sie einen HMAC
- 1Wählen Sie die Hashfunktion: SHA-256 verwenden die meisten APIs und Webhooks.
- 2Geben Sie den geheimen Schlüssel ein oder fügen Sie ihn ein und wählen Sie, wie er geschrieben ist: Text, Hex oder Base64. Mit Zufallsschlüssel erzeugen Sie ein neues Secret in der passenden Länge.
- 3Fügen Sie die Nachricht ein — bei einem Webhook den rohen Request-Body genau so, wie er angekommen ist, Byte für Byte.
- 4Kopieren Sie die Signatur in der benötigten Kodierung. Um eine Signatur zu prüfen, fügen Sie sie unter Erwartete Signatur ein; ein Präfix wie
sha256=wird erkannt und ignoriert.
Was ist ein HMAC?
Ein HMAC (hash-based message authentication code, RFC 2104) ist ein kurzer Wert, der aus einer Nachricht und einem geheimen Schlüssel berechnet wird. Wer den Schlüssel kennt, kann denselben Wert berechnen und so zwei Dinge auf einmal prüfen: dass die Nachricht unterwegs nicht verändert wurde und dass sie von jemandem stammt, der den Schlüssel besitzt. Ohne den Schlüssel kann ein Angreifer weder einen gültigen HMAC für eine neue Nachricht fälschen noch einen bestehenden nach einer Änderung der Nachricht anpassen.
Es ist nicht einfach ein Hash aus Schlüssel und Nachricht hintereinander. HMAC hasht zweimal, wobei der Schlüssel in ein inneres und ein äußeres Padding eingemischt wird: H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ message)). Diese Konstruktion macht ihn sicher mit SHA-256 und SHA-512, die allein als H(key ‖ message) für Length-Extension-Angriffe anfällig sind.
Webhook-Signaturen prüfen
Die meisten Webhook-Anbieter signieren jeden Request mit einem HMAC des Bodys und schreiben das Ergebnis in einen Header. Zum Prüfen berechnen Sie den HMAC des rohen Bodys mit Ihrem Signing Secret und vergleichen ihn mit dem Header-Wert. Der häufigste Fehler ist, ein neu serialisiertes JSON-Objekt zu hashen statt der angekommenen Bytes: Eine andere Reihenfolge der Schlüssel oder ein fehlendes Leerzeichen ändert die Signatur vollständig.
Manche Anbieter signieren mehr als den Body. Stripe signiert timestamp.body — den t-Wert aus dem Header, einen Punkt und dann den Payload — und Slack signiert v0:timestamp:body. Bauen Sie genau diesen String hier als Nachricht zusammen und fügen Sie den vollständigen Header in das Prüffeld ein; der Wert v1= oder v0= wird daraus entnommen.
- GitHub
- <code>X-Hub-Signature-256: sha256=<hex></code>, HMAC-SHA256 des Bodys mit dem Webhook-Secret als Text.
- Stripe
- <code>Stripe-Signature: t=…,v1=<hex></code>, HMAC-SHA256 von <code>t.body</code>.
- Shopify
- <code>X-Shopify-Hmac-Sha256: <Base64></code>, HMAC-SHA256 des Bodys.
- Slack
- <code>X-Slack-Signature: v0=<hex></code>, HMAC-SHA256 von <code>v0:timestamp:body</code>.
Schlüssel als Text, Hex und Base64
Ein Schlüssel ist eine Folge von Bytes, und wie er geschrieben ist, spielt eine Rolle. Der Text abc123 sind sechs Bytes; das Hex abc123 sind drei völlig andere Bytes. Viele Dienste geben Secrets als Hex- oder Base64-Strings aus, erwarten aber, dass Sie den String selbst als Textschlüssel verwenden — GitHub und Stripe tun das beide —, während andere, etwa Signaturketten im AWS-Stil und die App-Proxys von Shopify, die dekodierten Bytes verwenden. Wenn eine Signatur nicht passt, sollten Sie zuerst die Kodierung des Schlüssels wechseln.
Verwenden Sie für einen neuen Schlüssel Zufallsbytes, die mindestens so lang sind wie die Hash-Ausgabe: 32 Bytes für HMAC-SHA256, 64 für HMAC-SHA512. Längere Schlüssel bringen nichts — alles über der Blockgröße des Hashes wird zuerst gehasht.
Vergleich in konstanter Zeit
Wenn Ihr Server eine Signatur prüft, vergleichen Sie sie mit einer Funktion mit konstanter Laufzeit wie crypto.timingSafeEqual in Node.js, hmac.compare_digest in Python oder hash_equals in PHP. Ein normaler Stringvergleich bricht beim ersten abweichenden Zeichen ab, und die dafür benötigte Zeit kann verraten, wie viel einer gefälschten Signatur richtig war. Diese Seite nutzt dasselbe Muster mit konstanter Laufzeit, der Code dient also als Referenz und als Prüfung.
Wenn Sie nur eine gewöhnliche Prüfsumme einer Datei oder eines Textes ohne Schlüssel brauchen, verwenden Sie den Hash-Generator. Zum Signieren von Tokens erzeugt der JWT-Secret-Generator HS256-Schlüssel in der richtigen Größe.
Häufige Fragen
- Was ist der Unterschied zwischen einem Hash und einem HMAC?
- Ein Hash wie SHA-256 hängt nur von den Daten ab, also kann ihn jeder neu berechnen. Ein HMAC hängt zusätzlich von einem geheimen Schlüssel ab, also kann ihn nur jemand mit dem Schlüssel erzeugen oder prüfen. Damit belegt ein HMAC die Echtheit, nicht nur die Integrität.
- Warum stimmt mein HMAC nicht mit dem der API überein?
- Fast immer unterscheidet sich die Eingabe: Die Nachricht ist nicht Byte für Byte der rohe Body (neu serialisiertes JSON, ein abschließender Zeilenumbruch, andere Zeilenenden), der Schlüssel wird als Text gelesen, obwohl der Dienst Hex- oder Base64-Bytes meint oder umgekehrt, oder der Anbieter signiert einen Zeitstempel plus Body statt nur des Bodys.
- Welchen HMAC-Algorithmus sollte ich verwenden?
- HMAC-SHA256 ist die Standardwahl und wird von fast jeder API verwendet. HMAC-SHA512 ist genauso gut und auf 64-Bit-Servern schneller. HMAC-SHA1 ist als HMAC trotz SHA-1-Kollisionen weiterhin sicher, verwenden Sie es aber nur, wenn ein Protokoll es verlangt.
- Ist HMAC-SHA1 gebrochen?
- Nein. SHA-1-Kollisionen bieten keinen Weg, einen HMAC-SHA1 ohne den Schlüssel zu fälschen, und es ist kein praktischer Angriff auf HMAC-SHA1 bekannt. Für neue Designs gilt es als veraltet, aber das Prüfen alter HMAC-SHA1-Signaturen ist sicher.
- Kann ich hier HMAC-MD5 berechnen?
- Nein. Die Web Crypto API des Browsers, die diese Seite nutzt, implementiert kein MD5. HMAC-MD5 gibt es nur noch in alten Protokollen; verwenden Sie für alles Neue HMAC-SHA256.
- Wie lang sollte ein HMAC-Schlüssel sein?
- Mindestens so lang wie die Hash-Ausgabe: 32 Zufallsbytes für HMAC-SHA256, 48 für SHA-384, 64 für SHA-512. Die Schaltfläche Zufallsschlüssel erzeugt genau das mit dem sicheren Zufallszahlengenerator Ihres Browsers.
- Kann ich einen leeren Schlüssel verwenden?
- HMAC erlaubt das, und das Ergebnis ist klar definiert, daher zeigt das Tool es an, aber ein leerer oder kurzer Schlüssel bietet keine Sicherheit. Jeder könnte dieselbe Signatur berechnen.
- Wird mein geheimer Schlüssel irgendwohin gesendet?
- Nein. Der HMAC wird von der Web Crypto API Ihres Browsers auf dieser Seite berechnet. Nichts, was Sie eingeben, wird hochgeladen oder gespeichert.