Fügen Sie den unformatierten Anfragetext, das gemeinsame Geheimnis und die empfangene Signatur ein. Das Programm berechnet dann den HMAC und vergleicht die Werte. Dies ist die Prüfung, die jeder Webhook-Empfänger durchführen muss und die beim ersten Versuch meist aus einem Grund fehlschlägt, der nichts mit der Kryptografie zu tun hat.
Fast immer liegt es daran, dass sich die Nutzdaten vor dem Hashing geändert haben. Die Signatur deckt die exakten empfangenen Bytes ab. Ein Empfänger, der das JSON parst und vor dem Hashing neu serialisiert, signiert daher eine andere Zeichenkette – Schlüsselreihenfolge, Leerzeichen und Zahlenformatierung ändern sich. Erfassen Sie daher zuerst den Rohdatenkörper und hashen Sie diesen. Eine weitere häufige Ursache ist ein Signatur-Header mit dem Präfix ("sha256="") oder einer anderen Kodierung (Hexadezimal statt Base64).
Im Produktivbetrieb empfiehlt sich ein Vergleich mit einer Funktion konstanter Laufzeit – beispielsweise `crypto.timingSafeEqual` in Node.js oder `hmac.compare_digest` in Python. Ein normaler Stringvergleich liefert beim ersten abweichenden Byte ein Ergebnis, und der Laufzeitunterschied reicht aus, um bei genügend Versuchen eine gültige Signatur zu rekonstruieren. Auch diese Seite vergleicht in konstanter Zeit, allerdings dient der Vergleich mit einem selbst eingefügten Geheimnis eher der Demonstration als der Verteidigung.
Eine gültig signierte Nutzlast bleibt dauerhaft signiert, sodass jeder, der sie abfängt, sie erneut abspielen kann. Seriöse Webhook-Anbieter signieren die Nutzlast mit einem Zeitstempel und erwarten, dass Empfänger alles ablehnen, was älter als einige Minuten ist. Wenn der Anbieter einen Zeitstempel bereitstellt, ist dieser Teil der signierten Zeichenkette und kein zu ignorierender Header.
Alle Werkzeuge · Einstiegsanleitung · Alle 39 Mock-REST-APIs
Zuletzt aktualisiert