MiServe DevTools

Ihre Sticker

Heften Sie hier Tools an. Sie werden in diesem Browser gespeichert.

HMAC-Generator

Signieren Sie eine Nachricht mit einem geheimen Schlüssel per HMAC-SHA256 oder einem anderen Hash, und prüfen Sie eine empfangene Signatur.

HMAC (hex)
HMAC (Base64)

Läuft mit WebAssembly in Ihrem Browser. Nichts, was Sie einfügen, wird hochgeladen.

Über dieses Tool

Was ein HMAC beweist

HMAC (RFC 2104) verknüpft eine Nachricht über eine Hashfunktion mit einem geheimen Schlüssel und liefert ein kurzes Tag. Wer denselben Schlüssel besitzt, kann das Tag erneut berechnen. Sind beide Tags gleich, wurde die Nachricht unterwegs nicht verändert (Integrität), und sie stammt von jemandem, der den Schlüssel kennt (Authentizität).

Ein einfacher Hash kann das nicht leisten, denn wer die Nachricht verändert, kann auch ihren Hash neu berechnen. Ein HMAC verbirgt die Nachricht nicht, er ist also keine Verschlüsselung. Und weil beide Seiten denselben Schlüssel besitzen, kann er nicht zeigen, welche der beiden die Nachricht geschrieben hat. Dafür braucht es eine digitale Signatur mit einem privaten Schlüssel.

Webhook-Signaturen

Häufig begegnet einem HMAC bei Webhooks. Der Anbieter signiert den Request-Body mit einem Secret, das er mit Ihnen teilt, und sendet das Tag in einem Header. Ihr Server berechnet denselben HMAC, bevor er dem Request vertraut. GitHub sendet X-Hub-Signature-256: sha256=… als Hex, Shopify sendet X-Shopify-Hmac-SHA256 als Base64, und Stripe signiert den Zeitstempel, einen Punkt und den Body und sendet das Ergebnis als v1=… in Stripe-Signature.

Signieren Sie die Rohbytes des Bodys genau so, wie sie angekommen sind. Wenn ein Framework das JSON parst und Sie es erneut serialisieren, ändern sich Leerzeichen und Schlüsselreihenfolge, und der HMAC stimmt nicht mehr. Schlägt eine Signatur hier fehl, prüfen Sie zuerst die Schlüsselkodierung (Text, Hex oder Base64) und dann, ob die Nachricht mit einem Zeilenumbruch endet.

Warum ein Server in konstanter Zeit vergleicht

Ein gewöhnlicher String-Vergleich bricht beim ersten abweichenden Zeichen ab. Auf einem Server kommt die Antwort dadurch etwas schneller, wenn die ersten Bytes einer gefälschten Signatur falsch sind, und etwas langsamer, wenn sie stimmen. Ein Angreifer, der das messen kann, kann so ein gültiges Tag Byte für Byte ermitteln. Ein Vergleich in konstanter Zeit liest jedes Byte, unabhängig vom Ergebnis. Verwenden Sie die Funktion Ihrer Plattform: crypto.timingSafeEqual in Node.js, hmac.Equal in Go, hmac.compare_digest in Python, hash_equals in PHP.

Das Vergleichsfeld auf dieser Seite arbeitet genauso: Es dekodiert beide Werte zu Bytes und liest sie alle. In einem Browser-Tab, der beide Werte ohnehin schon enthält, gibt es keine Laufzeit zu verbergen. Hier zeigt es Ihnen also nur, ob Ihr eigener Code das richtige Tag erzeugt hat.

So funktioniert das Tool

Das Tag wird vom Go-Paket crypto/hmac berechnet, das zu WebAssembly kompiliert ist und in einem Hintergrund-Thread Ihres Browsers läuft. Die Nachricht wird als UTF-8 übernommen, ohne dass etwas hinzugefügt oder abgeschnitten wird. Eines ändert sich allerdings: Ein Textfeld im Browser speichert jeden Zeilenumbruch als einzelnes Line Feed, eine Nachricht mit CRLF-Zeilenenden wird hier also mit LF signiert. Der Schlüssel wird als UTF-8-Text übernommen oder, wenn Sie es angeben, aus Hex oder Base64 dekodiert. Beides wird nirgendwohin gesendet. Ein Produktions-Secret gehört trotzdem besser nicht in eine Webseite: Verwenden Sie nach Möglichkeit einen Testschlüssel.

Fragen

Warum unterscheidet sich mein HMAC von dem, den mein Server berechnet?

Die üblichen Ursachen: Der Schlüssel wird in der falschen Kodierung gelesen (ein Hex- oder Base64-Schlüssel wird als reiner Text behandelt), die Nachricht endet mit einem Zeilenumbruch oder hat andere Zeilenenden, der Body wurde geparst und neu serialisiert, oder es wird ein anderer Hash-Algorithmus verwendet. Prüfen Sie auch, ob die Gegenseite Hex oder Base64 ausgibt.

Ist HMAC dasselbe wie ein Hash aus Schlüssel und Nachricht?

Nein. Bei SHA-256, SHA-512, SHA-1 oder MD5 lässt sich ein Hash aus Schlüssel plus Nachricht erweitern: Wer den Hash sieht, kann Daten anhängen und einen gültigen Hash berechnen, ohne den Schlüssel zu kennen. HMAC hasht zweimal mit zwei abgeleiteten Schlüsseln und schließt damit diese Lücke.

Wie lang sollte ein HMAC-Schlüssel sein?

Verwenden Sie einen zufälligen Schlüssel, der mindestens so lang ist wie die Ausgabe des Hashs: 32 Bytes für SHA-256, 64 Bytes für SHA-512. Ein längerer Schlüssel bringt wenig, und ein Schlüssel, der länger als die Blockgröße des Hashs ist, wird zuerst selbst gehasht. Ein kurzer oder erratbarer Schlüssel lässt sich finden, indem man Kandidaten an einer einzigen bekannten Nachricht samt Tag ausprobiert.

Sind HMAC-SHA1 und HMAC-MD5 gebrochen?

Die Kollisionsangriffe, die SHA-1 und MD5 als einfache Hashes gebrochen haben, führen nicht zu einer praktikablen Fälschung ihrer HMACs. Man findet sie noch in älteren Protokollen, aber für alles Neue wählen Sie HMAC-SHA256 oder stärker.

Weitere Tools in Hashing