Utilia

HMAC-Generator

HMAC-SHA1, SHA-256, SHA-384 oder SHA-512 mit Text-, Hex- oder Base64-Schlüssel berechnen, als Hex und Base64 ausgeben und Webhook-Signaturen im Browser prüfen.

Die Nachricht wird genau so signiert, wie sie eingegeben ist, als UTF-8 kodiert, einschließlich Leerzeichen und Zeilenumbrüchen.

Der Vergleich läuft in konstanter Zeit, wie es ein Server tun sollte. Die benötigte Zeit verrät also nicht, wie viele Zeichen übereinstimmen.

So berechnen Sie einen HMAC

  1. Fügen Sie die Nachricht ein. Bei einem Webhook muss das der rohe Request-Body sein, Byte für Byte.
  2. Geben Sie den Geheimen Schlüssel ein und wählen Sie das Schlüsselformat: Text (UTF-8), Hexadezimal oder Base64.
  3. Wählen Sie den Algorithmus: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 oder HMAC-SHA512.
  4. Das Ergebnis wird beim Tippen aktualisiert; Sie können auch auf HMAC erzeugen klicken. Sie erhalten HMAC (hex), HMAC (Base64) und einen Webhook-Signatur-Header (GitHub-Stil), jeweils mit einer Schaltfläche Kopieren.
  5. Um eine empfangene Signatur zu prüfen, fügen Sie sie in das Feld Mit einer erwarteten Signatur vergleichen (hex, Base64 oder sha256=…) ein. Das Tool zeigt an, ob sie übereinstimmt.

Die Nachricht wird genau so, wie Sie sie eingeben, als UTF-8 kodiert – einschließlich Leerzeichen und Zeilenumbrüchen. Die Berechnung nutzt die Web-Crypto-API Ihres Browsers; Nachricht und Schlüssel verlassen Ihr Gerät nie.

Was ist ein HMAC?

Ein HMAC (Hash-based Message Authentication Code, RFC 2104) verbindet einen geheimen Schlüssel mit einer Hashfunktion:

HMAC(K, m) = H((K′ ⊕ opad) ‖ H((K′ ⊕ ipad) ‖ m))

Dabei ist K′ der auf die Blockgröße des Hashs aufgefüllte Schlüssel (ist er länger, wird er zuerst gehasht), und ipad/opad sind feste Konstanten. Nur wer den Schlüssel kennt, kann den richtigen Code für eine Nachricht erzeugen, und jede Änderung an der Nachricht verändert den Code vollständig. Deshalb signieren HMACs Webhooks, API-Anfragen (zum Beispiel AWS Signature Version 4) und JSON Web Tokens mit HS256.

Ein HMAC ist keine Verschlüsselung: Die Nachricht bleibt lesbar. Er ist auch kein Passwort-Hash; zum Speichern von Passwörtern nehmen Sie eine langsame Funktion wie bcrypt oder Argon2.

Die Länge der Ausgabe hängt vom Algorithmus ab: 20 Byte bei SHA-1, 32 bei SHA-256, 48 bei SHA-384 und 64 bei SHA-512. HMAC-SHA1 gilt als MAC weiterhin als sicher, für neue Systeme ist SHA-256 aber die bessere Wahl. Empfohlen wird ein zufälliger Schlüssel, der mindestens so lang ist wie die Ausgabe (32 Byte für HMAC-SHA256). Mit Hex- oder Base64-Schlüsseln können Sie solche Zufallsbytes direkt eingeben.

Einen GitHub-Webhook prüfen

GitHub signiert jede Zustellung mit Ihrem Webhook-Secret und sendet das Ergebnis im Header X-Hub-Signature-256 als sha256=, gefolgt vom hexadezimalen HMAC-SHA256 des Bodys. Das Beispiel aus der GitHub-Dokumentation verwendet das Secret It's a Secret to Everybody und den Body Hello, World!. Geben Sie beides hier mit HMAC-SHA256 ein, dann zeigt der Header:

X-Hub-Signature-256: sha256=757107ea0eb2509fc211221cce984b8a37570b6d7586c22c46f4379c8b043e17

Das Vergleichsfeld akzeptiert die ganze Header-Zeile, den Wert sha256=… oder eine reine Hex- bzw. Base64-Signatur (Stripe, Shopify und Slack nutzen ähnliche Verfahren mit eigenen Headern und signierten Zeichenketten). Für SHA-384 und SHA-512 zeigt das Tool einen allgemeinen Header X-Signature, da es dafür keinen verbreiteten Standard gibt.

Vergleich in konstanter Zeit

Ein Server, der Signaturen mit einem normalen Zeichenkettenvergleich prüft, bricht beim ersten abweichenden Zeichen ab. Über die Antwortzeiten könnte ein Angreifer eine gültige Signatur Zeichen für Zeichen erraten. Der Vergleich in diesem Tool prüft unabhängig vom Ergebnis jedes Byte – so, wie es ein Server mit crypto.timingSafeEqual in Node.js, hmac.compare_digest in Python oder hash_equals in PHP tun sollte.

Häufige Fragen

Warum weicht mein HMAC von dem meines Servers ab?

Typische Ursachen sind eine andere Nachricht (der Server signiert den rohen Body, Sie haben aber neu formatiertes JSON eingefügt, oder die Zeilenumbrüche unterscheiden sich), ein Schlüssel im falschen Schlüsselformat oder ein anderer Algorithmus. Schon ein zusätzliches Leerzeichen ändert das gesamte Ergebnis.

Soll die Ausgabe hex oder Base64 sein?

Beide kodieren dieselben Bytes. GitHub verwendet hex, viele andere APIs wie Shopify dagegen Base64. Nehmen Sie das Format, das das empfangende System erwartet.

Kann ich einen leeren Schlüssel verwenden?

Das Tool akzeptiert ihn, warnt Sie aber: Mit einem leeren Schlüssel kann jeder denselben HMAC berechnen, er beweist also nichts.

Ist HMAC-SHA1 so unsicher wie SHA-1?

Die Kollisionsangriffe auf SHA-1 brechen HMAC-SHA1 nicht; als MAC gilt es weiterhin als sicher. Es wird für ältere Systeme wie den alten Header X-Hub-Signature noch unterstützt, neue Systeme sollten aber HMAC-SHA256 oder stärker verwenden.

Ist mein geheimer Schlüssel hier sicher?

Schlüssel und Nachricht werden nur in Ihrem Browser verarbeitet und nirgendwohin gesendet. Gehen Sie mit einem produktiven Secret trotzdem sorgsam um und tauschen Sie es aus, wenn Sie vermuten, dass es offengelegt wurde.