Berechne eine HMAC-Signatur für jede Nachricht und jedes Geheimnis mit SHA-1, SHA-256, SHA-384 oder SHA-512, mit hex-, base64- oder base64url-Ausgabe.
Nachrichtenauthentifizierungscodes, lokal. HMAC kombiniert eine Hash-Funktion mit einem geheimen Schlüssel, sodass ein Empfänger sowohl Integrität als auch Authentizität verifizieren kann. Berechnet im Browser über die Web Crypto API.
Wofür HMAC dient
Was HMAC leistet
Ein HMAC verbirgt nichts. Es beantwortet eine andere Frage: Wurde diese genaue Nachricht von jemandem erzeugt, der den gemeinsamen Schlüssel besitzt, und wurde sie seitdem verändert? Die Ausgabe ist ein Tag fester Größe, den du zusammen mit der Nachricht sendest; der Empfänger berechnet ihn mit demselben Schlüssel neu und vergleicht. Übereinstimmende Tags bedeuten, dass die Nachricht authentisch und intakt ist. Nicht übereinstimmende Tags bedeuten, dass sie keines von beiden ist, und es gibt keine Möglichkeit festzustellen, welches.
Das macht HMAC zum Arbeitspferd hinter Webhook-Signaturen, API-Anfragesignierung, signierten Cookies und Session-Tokens. Stripe, GitHub und die meisten Webhook-Anbieter signieren ihre Nutzdaten so, damit du verifizieren kannst, dass eine Anfrage wirklich von ihnen stammt und nicht von jemandem, der deine Endpunkt-URL erraten hat.
Warum nicht einfach Schlüssel und Nachricht zusammen hashen
Die naheliegende Konstruktion – SHA256(key + message) – ist bei Merkle-Damgard-Hashes wie SHA-1 und SHA-256 broken. Diese Hashes verarbeiten Daten in Blöcken und tragen den Zustand fort, sodass ein Angreifer, der ein gültiges Digest kennt, Daten anhängen und ein gültiges Digest für die erweiterte Nachricht berechnen kann, ohne den Schlüssel jemals zu lernen. Das ist der Length-Extension-Angriff, und er ist nicht theoretisch; er hat echte APIs gebrochen.
Die verschachtelte Konstruktion von HMAC, H(key XOR opad || H(key XOR ipad || message)), schließt dieses Loch. Die zwei Durchläufe mit unterschiedlichen aufgefüllten Schlüsseln bedeuten, dass das finale Digest nicht der rohe interne Zustand eines Hashes über vom Angreifer beeinflusste Daten ist. Das ist der Grund, warum du immer zu HMAC greifen solltest, anstatt deinen eigenen Keyed Hash zu erfinden.
Praktische Hinweise
Wähle SHA-256, sofern dich nicht etwas von außen dazu zwingt. SHA-1 ist innerhalb von HMAC immer noch sicher, weil die Konstruktion nicht auf Kollisionsresistenz beruht, aber neue Systeme haben keinen Grund, es zu verwenden, und AuditorInnen werden es beanstanden. SHA-512 ist für diesen Zweck nicht merklich stärker und ist manchmal auf 64-Bit-Hardware schneller.
Zwei Implementierungsdetails zählen mehr als die Hash-Wahl. Erstens: Vergleiche Tags in konstanter Zeit – ein normaler Zeichenkettenvergleich kehrt beim ersten abweichenden Byte früh zurück, was genug Timing-Information preisgibt, um ein Tag Byte für Byte zu fälschen. Zweitens: Schlüssel sollten zufällige Bytes von mindestens Digest-Länge sein, kein merkhaftes Passwort; HMAC-Schlüssel sind keine Passwort-Hashes und werden nicht gestreckt.
FAQ
Wird mein Geheimnis irgendwo hin gesendet?
Nein. Der Schlüssel und die Nachricht verlassen niemals deinen Browser; die Signatur wird lokal über die Web Crypto API berechnet, und es wird nichts übertragen oder gespeichert.
Welchen Algorithmus sollte ich wählen?
Verwende SHA-256 für neue Arbeiten. SHA-384 und SHA-512 erhöhen den Sicherheitsabstand zu geringen Kosten; SHA-1 existiert nur für die Interoperabilität mit Altsystemen.
Was ist der Unterschied zwischen base64 und base64url?
Base64url ersetzt - und _ durch + und / und lässt das Padding weg, wodurch das Ergebnis sicher in URLs, Dateinamen und HTTP-Headern verwendet werden kann.
Ist HMAC eine Form der Verschlüsselung?
Nein. Es beweist, dass die Nachricht von einem Inhaber des Schlüssels stammt und nicht verändert wurde, aber die Nachricht selbst bleibt vollständig lesbar. Füge TLS oder Verschlüsselung hinzu, wenn du auch Geheimhaltung brauchst.
Warum nicht einfach Schlüssel und Nachricht zusammen hashen?
Plain SHA-2 ist anfällig für Length-Extension: Ein Angreifer kann eine signierte Nachricht um Daten erweitern und ein gültiges Digest fälschen, ohne den Schlüssel zu kennen. Die verschachtelte Konstruktion von HMAC blockiert das.
Wie sollte ich zwei HMACs im Code vergleichen?
Mit einem Vergleich in konstanter Zeit, wie crypto.timingSafeEqual. Ein normales == bricht beim ersten abweichenden Byte ab, was das korrekte Tag Byte für Byte preisgeben kann.