HMAC-Generator und Webhook-Prüfer

Berechnen Sie HMAC-SHA256, SHA-384, SHA-512 oder SHA-1 und prüfen Sie, ob die vom Webhook gesendete Signatur übereinstimmt. Die Vorlagen für GitHub, Stripe, Shopify, Mercado Pago und Slack bauen die signierte Nachricht so, wie der jeweilige Anbieter es tut. Payload und Schlüssel bleiben in Ihrem Browser.

Anbieter

HMAC des Payloads unverändert, mit Algorithmus und Kodierung Ihrer Wahl.

Die Signatur deckt den Roh-Body Byte für Byte ab. Ein anderes Leerzeichen, ein Zeilenumbruch oder eine andere Feldreihenfolge ändert das Ergebnis. Fügen Sie den Body genau so ein, wie er ankam, bevor er durch JSON.parse oder einen Formatierer ging.

Der Schlüssel ist
Algorithmus
Signaturformat

Signatur

Der Schlüssel fehlt

Geben Sie den geheimen Schlüssel ein. Die Signatur erscheint während der Eingabe.

Ein HS256-JWT ist ein HMAC-SHA256 von Header und Payload. Der Decoder prüft die Signatur des Tokens mit Ihrem Secret.

JWT dekodieren

Möchten Sie den Webhook-Payload lesen? Formatieren Sie ihn in einem anderen Tab. Formatiertes JSON hat andere Bytes und eignet sich nicht zum Prüfen der Signatur.

JSON formatieren

Brauchen Sie nur einen Hash, ohne Schlüssel? Der Hash-Generator berechnet MD5, SHA-1 und SHA-256 für Text und Dateien.

Hash erzeugen

Was ist HMAC

HMAC ist ein Hash, der mit einem geheimen Schlüssel berechnet wird (RFC 2104). Einen einfachen SHA-256 kann jeder nach einer Änderung der Nachricht neu berechnen. Mit HMAC kann nur, wer den Schlüssel kennt, die richtige Signatur erzeugen. Deshalb belegt man damit, dass eine Anfrage vom angegebenen Absender kommt und unterwegs nicht verändert wurde: Webhooks, API-Signaturen wie AWS Signature V4 und HS256-JWTs.

Format der einzelnen Anbieter

Jeder Anbieter legt fest, was er signiert und wie er das Ergebnis schreibt. Die Tabelle fasst die Vorlagen dieser Seite zusammen; jedes Format wurde anhand der offiziellen Dokumentation des Anbieters geprüft.

AnbieterHeaderWas signiert wirdFormat
GitHubX-Hub-Signature-256Bodysha256=<hex>
StripeStripe-Signaturet.Bodyt=<ts>,v1=<hex>
ShopifyX-Shopify-Hmac-Sha256Body<base64>
Mercado Pagox-signatureid:…;request-id:…;ts:…;ts=<ts>,v1=<hex>
SlackX-Slack-Signaturev0:timestamp:Bodyv0=<hex>

So funktioniert die Webhook-Prüfung

Anbieter und Anwendung teilen dasselbe Secret. Beim Senden des Ereignisses berechnet der Anbieter den HMAC des Bodys oder einer Nachricht aus Timestamp und Body und schickt das Ergebnis in einem Header. Ihre Anwendung berechnet ihn mit dem empfangenen Body neu und vergleicht. Stimmen beide überein, ist das Ereignis echt. Der Vergleich muss in konstanter Zeit laufen, mit crypto.timingSafeEqual in Node, hash_equals in PHP oder hmac.compare_digest in Python, damit die Antwortzeit die Signatur nicht verrät.

Die häufigste Ursache ungültiger Signaturen

Das Framework macht aus dem JSON ein Objekt, bevor Ihr Code läuft, und beim erneuten Serialisieren ändern sich Schlüsselreihenfolge, Leerzeichen und das Escaping von Umlauten. Die Signatur stimmt dann selbst mit dem richtigen Schlüssel nicht mehr. Lesen Sie den Roh-Body: express.raw() in Express, $request->getContent() in Laravel, einen String-Parameter mit @RequestBody in Spring und request.get_data() in Flask. In NestJS erstellen Sie die App mit rawBody: true und verwenden req.rawBody.

Schlüssel als Text, Hex oder Base64

HMAC arbeitet mit den Bytes des Schlüssels. Zeigt das Dashboard des Anbieters ein Secret in Hex und Sie verwenden diese Zeichenkette als Text, sind die Bytes andere und damit auch die Signatur. Die meisten Webhook-Anbieter, darunter GitHub, Stripe, Shopify, Mercado Pago und Slack, verwenden das Secret als Text, so wie es im Dashboard steht, einschließlich des whsec_-Präfixes von Stripe.

Timestamp und Wiederholung

Eine abgefangene gültige Anfrage bleibt gültig, wenn sie erneut gesendet wird. Stripe und Slack nehmen den Timestamp in die signierte Nachricht auf, und ihre Bibliotheken lehnen Ereignisse ab, die älter als 5 Minuten sind. Beim Testen mit einem alten Payload aus dem Log kann die Signatur hier übereinstimmen und trotzdem von Ihrem Server wegen der Uhrzeit abgelehnt werden.

Häufige Fragen zu HMAC

Webhook-Signaturen, Schlüssel, Kodierung und die häufigsten Fehler bei der Prüfung.