Webhook-Signatur mit HMAC sicher prüfen
Die Prüfung von Webhook-Signaturen scheitert häufig an Schnittstellen: Das Framework verändert den Body, der Header wird zu großzügig ausgewertet oder ein gewöhnlicher Vergleich verrät Zeitinformationen.
Im Browser ausführen – kostenlos
Diese Funktion wandelt den HMAC-Algorithmus und Header des Anbieters in eine präzise, geordnete Prüfliste um. Payload, Geheimnis und Signatur werden nicht benötigt. Nutzen Sie das Ergebnis zur Implementierung oder Kontrolle und gleichen Sie Zeitformat, Kodierung und Replay-Toleranz mit der Anbieterdokumentation ab.
Beginnen Sie mit den signierten Bytes
Bewahren Sie vor dem Parsen exakt die empfangenen Bytes auf. Erneutes Serialisieren von JSON kann Leerraum, Reihenfolge, Escapes, Unicode oder Zeilenenden verändern. Lesen Sie den genannten Header ohne Beachtung der Großschreibung seines Namens, prüfen Sie seinen Wert jedoch streng. Folgen Sie der dokumentierten Grammatik, lehnen Sie fehlende, leere, doppelte oder fehlerhafte Werte ab und speichern Sie das Geheimnis ausschließlich geschützt.
Rekonstruieren, berechnen und vergleichen Sie korrekt
Rekonstruieren Sie die signierte Nachricht exakt: nur den Roh-Body oder Zeitstempel, Trennzeichen und Body. Beachten Sie Reihenfolge und Kodierung. Berechnen Sie HMAC mit Geheimnis und normalisiertem Algorithmus und kodieren Sie das Ergebnis wie vorgeschrieben. Dekodieren Sie beide Signaturen in gleich lange Bytefolgen und vergleichen Sie diese in konstanter Zeit. Ungültige Kodierung oder abweichende Länge bedeutet Ablehnung.
Betrachten Sie Kryptografie als Teil der Annahme
Ein passendes HMAC belegt Kenntnis des Geheimnisses, aber weder Aktualität noch Einmaligkeit. Erzwingen Sie das empfohlene Zeitfenster, speichern Sie angenommene Ereignis-IDs und verarbeiten Sie idempotent. Rotieren Sie Geheimnisse mit der dokumentierten Überlappung. Lehnen Sie vor dem Einreihen ab, antworten Sie allgemein und protokollieren Sie nur sichere Codes. Testen Sie veränderte Bodys, alte Zeitstempel, ungültige Header, falsche Geheimnisse und Replays.
Anwendungsfälle
Neuen Webhook-Endpunkt umsetzen
Wandeln Sie Algorithmus und Header vor der Programmierung in eine prüfbare Liste um.
Bestehende Integration prüfen
Kontrollieren Sie die Reihenfolge von Erfassung, HMAC, sicherem Vergleich und Replay-Schutz.
Sicherheitstests vorbereiten
Leiten Sie Negativtests für fehlende Header, veränderte Bodys, ungültige Signaturen, alte Zeitstempel und Replays ab.
Häufige Fragen
Prüft dieses Werkzeug einen echten Webhook?
Nein. Es erzeugt Umsetzungsschritte und fragt nie nach Payload, Geheimnis oder Signatur.
Welche Algorithmen werden erkannt?
HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 und HMAC-SHA512. Andere Algorithmen führen zu einem Eingabefehler.
Warum muss der Roh-Body erhalten bleiben?
Parsen und erneutes Serialisieren kann die Bytes ändern und eine gültige Signatur entwerten.
Verhindert ein gültiges HMAC Replay-Angriffe?
Nein. Prüfen Sie signierte Zeitstempel und deduplizieren Sie vorhandene Ereignis-IDs.
Soll ich das Webhook-Geheimnis übermitteln?
Nein. Nur Algorithmus und Header sind nötig; bewahren Sie das Geheimnis geschützt auf.
Was kostet eine API-Anfrage?
Jede Anfrage kostet $0.002. Die deterministische Browser-Ausführung übermittelt keine Geheimnisse.
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem Stack
curl -X POST https://api.kit.forhosting.com/security/webhook-signature-verify-steps \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"algorithm":"HMAC-SHA256","header_name":"X-Webhook-Signature"}'const res = await fetch("https://api.kit.forhosting.com/security/webhook-signature-verify-steps", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"algorithm": "HMAC-SHA256",
"header_name": "X-Webhook-Signature"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/security/webhook-signature-verify-steps",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"algorithm": "HMAC-SHA256",
"header_name": "X-Webhook-Signature"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/security/webhook-signature-verify-steps", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"algorithm":"HMAC-SHA256","header_name":"X-Webhook-Signature"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"algorithm":"HMAC-SHA256","header_name":"X-Webhook-Signature"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/security/webhook-signature-verify-steps", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Beispiel-Anfrage
{
"algorithm": "HMAC-SHA256",
"header_name": "X-Webhook-Signature"
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "security.webhook_signature_verify_steps",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |