HMAC Generator
Generate HMAC signatures with SHA-1, SHA-256, SHA-384 and SHA-512.
Geprüft von Aygul Dovletova · Zuletzt geprüft
Eine Nachricht mit einem gemeinsamen Geheimnis signieren
- Füge die Nachricht ein, die du authentifizieren möchtest, in das Nachrichten-Textarea. Das sind die Bytes, die signiert werden; von einem JSON-Webhook-Body bis zu einem Unicode-String funktioniert alles.
- Gib das gemeinsame Geheimnis in das Schlüssel-Eingabefeld ein. In der Produktion ist das typischerweise ein 32-Byte-Zufallswert aus einem CSPRNG, als Hex oder Base64 kodiert; zum Testen wird jeder String akzeptiert.
- Wähle den zugrundeliegenden Hash: SHA-1 für Legacy-Interoperabilität (AWS Signature v2, RFC 2104-Testvektoren), SHA-256 für fast alles Moderne (JWT HS256, Stripe-Webhooks, GitHub-Webhooks), SHA-384 für Payloads mit höherer Sicherheitsanforderung, SHA-512 wenn du das längere Tag benötigst.
- Klicke auf "HMAC generieren". Das Tool importiert den Schlüssel über
crypto.subtle.importKeymit dem passenden Algorithmusnamen (HMACmithash: 'SHA-256'), dann ruft escrypto.subtle.signauf deinen Nachrichten-Bytes auf. - Kopiere den Hex-Digest und füge ihn in den
X-Signature-Header ein (oder wohin auch immer deine API ihn erwartet). Auf der Empfangsseite berechnet der Server HMAC auf denselben Bytes mit demselben Schlüssel neu und vergleicht mit einer zeitkonstanten Gleichheitsprüfung.
Was HMAC löst, was ein einfacher Hash nicht kann
HMAC (Hash-basierter Nachrichtenauthentifizierungscode) ist in RFC 2104 und FIPS 198-1 spezifiziert: HMAC(K, m) = H((K' XOR opad) || H((K' XOR ipad) || m)), wobei K' der auf Blockgröße aufgefüllte Schlüssel ist, ipad = 0x36 wiederholt und opad = 0x5C wiederholt. Der doppelte Hash mit innerer/äußerer Auffüllung verhindert Längenerweiterungsangriffe auf rohe Merkle-Damgard SHA-1/SHA-256. Bei SHA256(key || msg) kann ein Angreifer, der ein gültiges Tag beobachtet, ein Tag für key || msg || padding || evil fälschen; HMAC verhindert dies. Die Web Crypto API stellt HMAC über crypto.subtle.sign und crypto.subtle.verify bereit, beide nativ implementiert (BoringSSL für Chromium, NSS für Firefox). Der verify-Pfad läuft in konstanter Zeit. Dieses Tool verwendet nur sign; im Produktions-Verifikationscode verwende immer verify statt Hex mit === zu vergleichen.
Wo HMAC in echten Systemen auftaucht
- Webhook-Signaturverifizierung: GitHub signiert Webhook-Bodies mit HMAC-SHA-256 im
X-Hub-Signature-256-Header; Stripe verwendetStripe-Signaturemit HMAC-SHA-256; Slack nutzt ein versioniertes HMAC-SHA-256-Schema. - JWT-Signierung für HS256/HS384/HS512-Algorithmen (RFC 7518), verwendet von Auth0, Clerk und jeder Bibliothek, die symmetrische JWTs unterstützt.
- AWS Signature Version 4 für alle REST-API-Aufrufe: Eine Kette von HMAC-SHA-256-Aufrufen leitet pro-Anfrage-, pro-Region-, pro-Service-Signaturschlüssel aus deinem geheimen Zugriffsschlüssel ab.
- TOTP und HOTP Einmalpasswort-Codes (RFC 6238, RFC 4226) berechnen HMAC-SHA-1 eines Zeitzählers und kürzen dynamisch auf 6 Stellen.
- Die TLS 1.2-Datensatzschicht verwendet HMAC für Nachrichtenintegrität in Cipher-Suites, die kein AEAD sind (obwohl TLS 1.3 vollständig zu AEAD gewechselt ist).
- Signierte URLs (S3 Presigned URLs, CloudFront Signed URLs, benutzerdefinierte CDN-Token-Authentifizierung) betten einen HMAC ein, den der Server vor dem Ausliefern der Ressource verifiziert.
Die Fehlermodi, die tatsächlich Ausfälle verursachen
Der häufigste HMAC-Implementierungsfehler ist der nicht-zeitkonstante Vergleich. Wenn du das empfangene Tag mit dem berechneten Tag mittels === oder == vergleichst, leckt der frühe Abbruch beim ersten Byte-Unterschied Timing-Informationen. Die Lösung ist crypto.subtle.verify, crypto.timingSafeEqual in Node, hmac.compare_digest in Python. Der zweite Fehler ist Schlüsselverwechslung zwischen Algorithmen: Wenn dein Server sowohl HS256 als auch HS384 akzeptiert, kann ein Angreifer Algorithmus-Header tauschen und mit einem längeren Schlüssel signieren. Pinne den Algorithmus auf der Serverseite. Drittens die Kanonisierung: HMAC signiert Bytes, also müssen Sender und Empfänger exakt dieselben Bytes vereinbaren. GitHub und Stripe signieren rohe Request-Bodies; wenn Middleware vor der Verifizierung re-serialisiert, stimmt das Tag nicht überein. Viertens müssen HMAC-Schlüssel wie jedes andere Geheimnis behandelt werden - ein geteilter Schlüssel im Quellcode ist ein Klartext-Passwort.
RFC 2104, FIPS 198-1 und warum HMAC seltsam aussieht
HMAC wurde 1996 von Bellare, Canetti und Krawczyk entworfen und in RFC 2104 (1997) als IETF-Antwort auf CBC-MAC-Fallstricke und die ad-hoc-"Geheimpräfix"-Schemata standardisiert, die es davor gab. Die innere-äußere Auffüllungsstruktur stellt sicher, dass HMAC ein sicherer MAC bleibt, selbst wenn die zugrundeliegende Hash-Funktion einige Kollisionsschwächen hat: HMAC-MD5 war noch sicher, lange nachdem MD5-Kollisionen gefunden wurden, weil Kollisionsresistenz nicht die Eigenschaft ist, die HMAC von seinem Hash benötigt. Was HMAC braucht, ist Pseudozufalls-Funktionsverhalten, das SHA-1, SHA-256 und SHA-512 alle bieten. Die Ausgabegröße entspricht der zugrundeliegenden Hash-Ausgabegröße: 20 Byte für HMAC-SHA-1, 32 Byte für HMAC-SHA-256, 64 Byte für HMAC-SHA-512. Kürzung ist erlaubt (RFC 2104 Abschnitt 5) bis auf die Hälfte der Hash-Ausgabe - HMAC-SHA-256-128 kürzt auf 16 Byte und ist noch sicher. Der Schlüssel kann jede Länge haben; wenn er länger als die Hash-Blockgröße (64 Byte für SHA-256, 128 für SHA-512) ist, wird er zuerst gehashed, also bringt ein 1-MB-Schlüssel nichts über die ersten blockgröße-gehashten Bytes hinaus.
HMAC vs. Poly1305, KMAC und asymmetrische Signaturen
HMAC ist der etablierte Standard; Poly1305 (RFC 8439, ChaCha20-Poly1305 AEAD) ist auf Plattformen ohne SHA-NI viel schneller als HMAC-SHA-256 und wird von TLS 1.3-Mobilverbindungen verwendet. KMAC (NIST SP 800-185) ist die SHA-3-basierte Alternative, sauberer aber nicht weit verbreitet. Für asymmetrisches Vertrauen, bei dem nur eine Partei den Signierschlüssel hat, verwende Ed25519 (RFC 8032) oder ECDSA - HMAC erfordert, dass beide Parteien das Geheimnis teilen. Praktische Empfehlung: Webhook-Signaturen, JWT HS-Prefix, AWS-Signierung, TOTP verwenden HMAC-SHA-256. Enge innere Schleifen verwenden Poly1305. Mehrparteien-Vertrauen verwendet Ed25519. Die begleitenden RSA- und TOTP-Tools auf dieser Seite decken diese Alternativen ab.
Häufig gestellte Fragen
Welche Schlüssellänge sollte ich für HMAC-SHA-256 verwenden?
Mindestens 32 Byte (256 Bit) zufällige Daten aus einem CSPRNG. RFC 2104 erlaubt jede Länge, aber kürzere Schlüssel verringern den Sicherheitsabstand - ein 8-Byte-Schlüssel bietet nur 64 Bit Brute-Force-Schutz. Länger als die Hash-Blockgröße (64 Byte bei SHA-256) bringt keinen zusätzlichen Schutz, da HMAC übergroße Schlüssel auf Blockgröße herunterhast. Der optimale Bereich liegt genau bei 32 Byte für HMAC-SHA-256 und 64 Byte für HMAC-SHA-512, einmalig generiert und in einem Secret-Manager gespeichert.
Wird mein Schlüssel oder meine Nachricht an einen Server gesendet?
Nein. crypto.subtle.importKey und crypto.subtle.sign laufen in der nativen Kryptobibliothek deines Browsers. Der Schlüssel ist in einem nicht-extrahierbaren CryptoKey-Objekt verpackt, das das Kryptomodul nie verlässt, und die Nachrichten-Bytes werden lokal verarbeitet. Es gibt keinen fetch-, keinen XHR- und keinen Service-Worker-Interceptor-Aufruf. Öffne den Netzwerk-Tab in DevTools und bestätige, dass beim Klick auf "Generieren" null Anfragen gesendet werden. Das ist wichtig, wenn du beim Debuggen Webhook-Payloads signierst und der Payload Produktionsdaten enthält.
Warum verwendet JWT HS256 HMAC statt eines einfachen Hashes?
Weil ein JWT sowohl Integrität (der Payload wurde nicht verändert) als auch Authentizität (das Token wurde von jemandem ausgestellt, der das Geheimnis kennt) benötigt. Ein einfacher SHA-256 über den JWT-Body wäre von jedem modifizierbar, der den Hash neu berechnen kann; HMAC-SHA-256 erfordert, dass der Angreifer das Geheimnis kennt. RFC 7518 spezifiziert HS256/HS384/HS512 mit passenden HMAC-Varianten. Für JWTs mit öffentlichem Schlüssel (RS256, ES256, EdDSA) benötigt der Prüfer nur den öffentlichen Schlüssel - die richtige Wahl, wenn der Prüfer keine neuen Token ausstellen können soll.
Wie verifiziere ich einen HMAC in konstanter Zeit?
Verwende crypto.subtle.verify im Browser, crypto.timingSafeEqual in Node.js, hmac.compare_digest in Python oder subtle.ConstantTimeCompare in Go. Vergleiche HMAC-Tags niemals mit === - das gibt bei der ersten Byte-Abweichung früh zurück und gibt Timing-Informationen preis. Ein Angreifer, der wiederholte Anfragen stellt, kann das Tag Byte für Byte aus dem Timing-Seitenkanal extrahieren. Dieser Angriff wurde gegen echte Systeme (Xbox 360 Secure Boot, Java JJWT-Bibliothek) demonstriert, bevor Konstantzeit-Vergleiche zur Standardpraxis wurden.
Ist HMAC-SHA-1 noch sicher verwendbar?
Ja, für die Authentifizierung. Die Sicherheit von HMAC erfordert keine Kollisionsresistenz vom zugrundeliegenden Hash, daher bricht SHAttered (2017) HMAC-SHA-1 nicht. Es wird weiterhin von TOTP (RFC 6238 Standard) und AWS Signature v2 verwendet. Neue Designs sollten HMAC-SHA-256 für Ökosystem-Konsistenz verwenden. Wenn du an FIPS 140-3 gebunden bist, ist HMAC-SHA-1 noch für die Authentifizierung zugelassen, aber nicht für neue Designs.
Kann ich denselben Geheimschlüssel für Verschlüsselung und HMAC verwenden?
Nein. Schlüsselwiederverwendung über Primitive ist ein klassischer Fallstrick. Das sichere Muster ist, zwei Unterschlüssel aus einem Hauptschlüssel mittels HKDF (RFC 5869) mit unterschiedlichen Info-Strings abzuleiten - einen für Verschlüsselung, einen für MAC. Wenn du sowohl Vertraulichkeit als auch Authentizität benötigst, verwende einen authentifizierten Verschlüsselungsmodus (AES-GCM, ChaCha20-Poly1305), der beides in einem Primitiv erledigt.
Schützt HMAC vor Replay-Angriffen?
Nicht von sich aus. HMAC beweist, dass die Nachricht nicht verändert wurde und von jemandem mit dem Schlüssel kam; es beweist nicht, dass die Nachricht aktuell ist. Eine gültige HMAC-getaggte Anfrage kann wiederholt werden. Die Standardabwehrmaßnahmen sind Nonces (nach einmaliger Verwendung abgelehnt), Zeitstempel mit einem engen Akzeptanzfenster (AWS Signature v4 lehnt Anfragen ab, die älter als 15 Minuten sind), oder Sequenznummern. Stripe lehnt Webhook-Payloads ab, die älter als 5 Minuten sind; GitHub gibt dir eine Delivery-ID, aber die Replay-Abwehr liegt bei dir.
Wie verhält sich dieses Tool im Vergleich zu openssl dgst -hmac?
Kryptographisch identische Ausgabe. openssl dgst -sha256 -hmac "mykey" erzeugt denselben Hex-Digest. Der Vorteil der CLI ist das Streamen großer Dateien und die Skriptfähigkeit; dieses Tool gewinnt dadurch, dass keine Shell benötigt wird, alle vier Varianten angezeigt werden und es offline bleibt. Für programmatisches HMAC verwende die Standardbibliothek deiner Sprache (hmac in Python, crypto.createHmac in Node) statt einer Shell.
Mehr Developer Tools
AI Token Counter
Count tokens for GPT-4o, Claude, and Gemini models instantly.
Open toolBase64 Encoder & Decoder
Encode UTF-8 text to Base64 online or decode Base64 back to UTF-8 and plain text. Runs in your browser with no upload.
Open toolBulk URL Encode / Decode
Encode or decode many URLs at once. Paste a newline-separated list and the tool processes each line in parallel, preserving order and blank lines.
Open toolchmod Calculator
Calculate and convert Unix file permission modes between octal and symbolic.
Open toolCode Screenshot
Create beautiful code snippet images with customizable themes.
Open toolColor Converter
Convert colors between HEX, RGB, HSL and CMYK formats.
Open tool