HMAC-Authentifizierung
HMAC(Schlüssel K, Nachricht m) = H((K' XOR opad) || H((K' XOR ipad) || m)), wobei K' der auf die Blockgröße gebrachte Schlüssel ist
Berechne das HMAC einer Nachricht mit einem geheimen Schlüssel, in Hex oder Base64, und vergleiche es mit einer erwarteten Signatur (Präfix sha256= wird akzeptiert), um einen GitHub-, Stripe- oder Shopify-Webhook zu prüfen.
Hexadezimal oder Base64, mit oder ohne Präfix wie sha256=.
Dieses Tool berechnet das HMAC einer Nachricht mit einem geheimen Schlüssel, mit SHA-1, SHA-256, SHA-384 oder SHA-512, und vergleicht es mit einer erwarteten Signatur. Es richtet sich vor allem an Entwickler, die Webhooks von GitHub, Stripe oder Shopify einbinden oder debuggen und wissen wollen, ob ein Fehler am Secret, am Nachrichten-Body oder am eigenen Code liegt.
Ein HMAC (RFC 2104, FIPS 198-1) kombiniert eine Hashfunktion mit einem geheimen Schlüssel: HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). Dieser doppelte Durchlauf macht es unmöglich, den Wert ohne Schlüssel zu erzeugen, und verhindert den Length-Extension-Angriff, der ein einfaches SHA-256(Schlüssel ‖ Nachricht) trifft. Mit dem Schlüssel „key“ und der Nachricht „Franz jagt im komplett verwahrlosten Taxi quer durch Bayern“ ergibt HMAC-SHA-256 6a764052c9893892621c72191ed1d5f67e1838836764ebd7a19d33e5ee8b620c in Hex bzw. anZAUsmJOJJiHHIZHtHV9n4YOINnZOvXoZ0z5e6LYgw= in Base64. Der Schlüssel wird so verwendet, wie du ihn eingibst, Nachricht und Schlüssel werden als UTF-8 kodiert, und die Berechnung läuft über die Web Crypto API des Browsers.
Die meisten Anbieter signieren den rohen Request-Body. GitHub sendet X-Hub-Signature-256: sha256=<hex>, Shopify sendet X-Shopify-Hmac-Sha256 in Base64, und Stripe signiert den String „Zeitstempel.Body“ und setzt den Hex-Wert hinter v1= in den Header Stripe-Signature. Wähle also je nach Anbieter die Ausgabe in Hex oder Base64 und füge die erhaltene Signatur in das optionale Feld ein: Präfixe wie „sha256=“ werden akzeptiert, und das Ergebnis aktualisiert sich bei jeder Eingabe. Der Vergleich läuft in konstanter Zeit, wie GitHub es für Servercode empfiehlt.
Füge die exakte zu signierende Nachricht ein, etwa den rohen Body eines Webhooks, und danach den gemeinsamen geheimen Schlüssel.
Wähle SHA-1, SHA-256, SHA-384 oder SHA-512 und die Ausgabe in Hex oder Base64, je nachdem, was der Dienst erwartet.
Füge bei Bedarf die erwartete Signatur ein, mit oder ohne Präfix wie sha256=: HMAC und Prüfergebnis aktualisieren sich während der Eingabe.
HMAC(Schlüssel K, Nachricht m) = H((K' XOR opad) || H((K' XOR ipad) || m)), wobei K' der auf die Blockgröße gebrachte Schlüssel ist
Kopiere den rohen Payload und den Header X-Hub-Signature-256 aus dem Tab Recent Deliveries des Webhooks, gib das Secret ein und vergleiche. Stimmt der Wert hier, aber nicht auf deinem Server, verändert dein Framework den Body vor der Prüfung.
Setze den signierten String „t.Body“ aus dem Header Stripe-Signature und dem rohen Body zusammen, berechne das HMAC-SHA-256 mit deinem whsec_…-Secret und vergleiche es mit dem v1-Wert, um die Ursache eines Prüffehlers einzugrenzen.
Shopify signiert den rohen Body mit HMAC-SHA-256 und sendet das Ergebnis in Base64 im Header X-Shopify-Hmac-Sha256. Wähle die Base64-Ausgabe und füge den Header ein, um zu bestätigen, dass du das richtige App-Secret nutzt.
Eingabe
Nachricht: The quick brown fox jumps over the lazy dog; Geheimer Schlüssel: key; Algorithmus: SHA-256; Kodierung: HexadezimalErgebnis
Berechnete Signatur: f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8Einen Hash wie SHA-256 kann jeder berechnen: Er belegt die Integrität, nicht die Herkunft. Ein HMAC fügt einen geheimen Schlüssel hinzu, sodass nur, wer diesen Schlüssel hat, den richtigen Wert erzeugen kann. Damit authentifiziert es den Absender und erkennt zugleich jede Änderung.
Meist wurde der Body vor der Berechnung verändert: JSON vom Framework geparst und neu serialisiert, andere Kodierung oder zusätzliche Leerzeichen. Weitere häufige Ursachen sind ein falsches Secret (Test statt Produktion), ein falsches Ausgabeformat (Hex statt Base64) oder bei Stripe der vergessene Zeitstempel im signierten String.
Zur Nachrichtenauthentifizierung ja: SHA-1-Kollisionen erlauben es nicht, ein HMAC-SHA-1 ohne Schlüssel zu fälschen, und es wird weiterhin genutzt, zum Beispiel von TOTP. Für neue Systeme solltest du trotzdem HMAC-SHA-256 nehmen, inzwischen der Standard für Webhooks. GitHub behält den SHA-1-Header X-Hub-Signature nur aus Kompatibilitätsgründen.
RFC 2104 empfiehlt einen Schlüssel, der mindestens so lang ist wie die Hash-Ausgabe, also 32 Byte für HMAC-SHA-256. Ein Schlüssel, der länger als die Blockgröße ist (64 Byte bei SHA-256), wird zuerst gehasht und bringt daher keine zusätzliche Sicherheit. Erzeuge ihn zufällig, statt ein Passwort zu wählen.
Nein, ein HMAC ist keine Verschlüsselung: Es enthält die Nachricht nicht und erlaubt nicht, sie zu rekonstruieren. Die Nachricht wird meist ohnehin im Klartext neben der Signatur gesendet. Um Inhalte unlesbar zu machen, brauchst du eine Verschlüsselung wie AES-GCM.
Die Berechnung findet nur in deinem Browser mit Web Crypto statt: Weder Schlüssel noch Nachricht werden übertragen. Grundsätzlich solltest du trotzdem lieber ein Test-Secret verwenden oder das Secret nach einer Debugging-Sitzung auf einem gemeinsam genutzten Rechner erneuern.
Verwandte Werkzeuge
Werkzeuge, die diesem ähnlich sind oder es ergänzen.
Berechne MD5-, SHA-1-, SHA-256-, SHA-384- und SHA-512-Hashes eines Textes oder einer Datei auf einmal.
Prüfe, ob zwei Hashes oder Prüfsummen übereinstimmen, unabhängig von Groß-/Kleinschreibung, Leerzeichen oder Doppelpunkten.
Erzeuge sichere Zufallstoken von 8 bis 256 Byte in Hex, Base64 oder Base64URL, mit optionalem Präfix.
Unterscheide Hashing, Verschlüsselung und Kodierung und verstehe SHA-256, SHA-3, Kollisionen sowie die Grenzen eines Hashes ohne Authentisierung.
Verstehe, wann Verschlüsselung, Hashing, HMAC oder PBKDF2 für Vertraulichkeit, Integrität, Authentifizierung und Passwörter eingesetzt werden.
Verstehe das Zusammenspiel von OAuth 2.0, PKCE, JWT, JWK und JWKS bei Autorisierung, Tokens, Schlüsseln und Verifizierung.
Verstehe, wie SRI-Hashes unerwartete Änderungen an externen Skripten und Stylesheets erkennen und wo die Grenzen liegen.