In diesem Artikel
Was ist HMAC?
HMAC (Hash-based Message Authentication Code) ist ein kryptografischer Mechanismus, der einen geheimen Schlüssel mit einer Hash-Funktion kombiniert, um einen Nachrichtenauthentifizierungscode zu erzeugen. Anders als ein reiner Hash belegt HMAC sowohl die Integrität als auch die Authentizität einer Nachricht – es bestätigt, dass die Daten nicht manipuliert wurden und von jemandem stammen, der den geheimen Schlüssel kennt.
HMAC wurde in RFC 2104 definiert und wird in TLS, IPsec, JWT-Signaturen und der Verifizierung von API-Webhooks eingesetzt. Der Algorithmus ist resistent gegen Length-Extension-Angriffe, die reine Hash-Funktionen wie SHA-256 betreffen, und ist damit die Standardwahl für die schlüsselbasierte Nachrichtenauthentifizierung.
So funktioniert HMAC
HMAC verwendet ein zweistufiges Hashing-Verfahren mit innerem und äußerem Padding. Der geheime Schlüssel wird auf die Blockgröße der Hash-Funktion aufgefüllt und anschließend mit zwei verschiedenen Konstanten (ipad und opad) per XOR verknüpft, um zwei abgeleitete Schlüssel zu erzeugen.
- Innerer Hash – der Schlüssel wird per XOR mit ipad (0x36 wiederholt) verknüpft, mit der Nachricht verkettet und gehasht: H(K XOR ipad || message)
- Äußerer Hash – der Schlüssel wird per XOR mit opad (0x5C wiederholt) verknüpft, mit dem Ergebnis des inneren Hashes verkettet und erneut gehasht: H(K XOR opad || inner_hash)
- Endgültige Ausgabe – das Ergebnis des äußeren Hashes ist der HMAC-Wert, der typischerweise als Hexadezimalzeichenkette dargestellt wird
Diese Konstruktion mit doppeltem Hashing verhindert Length-Extension-Angriffe. Selbst wenn ein Angreifer H(message) kennt, kann er ohne den geheimen Schlüssel HMAC(key, message || extra_data) nicht berechnen.
HMAC-Algorithmen
Die HMAC-Konstruktion funktioniert mit jeder kryptografischen Hash-Funktion. Die häufigsten Optionen sind SHA-256, SHA-384 und SHA-512, wobei SHA-1 und MD5 noch in Altsystemen vorkommen.
- HMAC-SHA256 – 256-Bit-Ausgabe, die am weitesten verbreitete Variante für API-Authentifizierung, JWT-HS256-Signaturen und Webhook-Verifizierung. Empfohlene Schlüsselgröße: 32 Byte
- HMAC-SHA384 – 384-Bit-Ausgabe, eingesetzt in TLS-1.3-Cipher-Suites und Hochsicherheitsanwendungen. Empfohlene Schlüsselgröße: 48 Byte
- HMAC-SHA512 – 512-Bit-Ausgabe, bevorzugt, wenn ein maximaler Sicherheitsspielraum erforderlich ist oder die Plattform 64-Bit-Operationen effizient verarbeitet. Empfohlene Schlüsselgröße: 64 Byte
Der Schlüssel sollte mindestens so lang wie die Hash-Ausgabe sein. Kürzere Schlüssel werden aufgefüllt, längere Schlüssel werden zuerst gehasht. Für die meisten Anwendungen bietet HMAC-SHA256 mit einem 32 Byte langen Zufallsschlüssel hervorragende Sicherheit.
Kostenlos testen – keine Registrierung erforderlich
HMAC-Signaturen erzeugen →Häufige Anwendungsfälle
HMAC bildet die Grundlage zahlreicher Sicherheitsprotokolle und API-Authentifizierungsverfahren.
- API-Authentifizierung – Dienste wie Stripe, GitHub und AWS verwenden HMAC-Signaturen, um Webhook-Payloads zu verifizieren und sicherzustellen, dass Anfragen tatsächlich vom Anbieter stammen
- JWT-Signierung – die Algorithmen HS256, HS384 und HS512 in JSON Web Tokens nutzen HMAC, um den Token-Payload zu signieren, sodass Empfänger überprüfen können, dass der Token nicht verändert wurde
- Nachrichtenintegrität – HMAC belegt, dass über ein Netzwerk übertragene Daten während der Übertragung nicht verändert wurden, eingesetzt in der TLS-Record-Schicht und in IPsec-Authentifizierungs-Headern
- OAuth 1.0a – die Signaturmethode HMAC-SHA1 signiert OAuth-Anfrageparameter, um nachzuweisen, dass die Anfrage von einem autorisierten Client stammt
HMAC im Vergleich zu anderen Authentifizierungsverfahren
HMAC ist einer von mehreren Ansätzen zur Nachrichtenauthentifizierung. Jeder bringt unterschiedliche Abwägungen bei Sicherheit, Leistung und Schlüsselverwaltung mit sich.
- HMAC vs. digitale Signaturen – HMAC verwendet einen gemeinsamen geheimen Schlüssel (symmetrisch), während digitale Signaturen öffentlich-private Schlüsselpaare nutzen (asymmetrisch). HMAC ist schneller, erfordert aber, dass beide Parteien dasselbe Geheimnis teilen. Digitale Signaturen bieten Nichtabstreitbarkeit.
- HMAC vs. API-Schlüssel – API-Schlüssel sind einfache Bearer-Token, die in Headern gesendet werden. HMAC signiert den Inhalt der Anfrage, sodass das Abfangen einer früheren Anfrage nicht das Fälschen neuer Anfragen ermöglicht. In Kombination mit Zeitstempeln oder Nonces bietet HMAC Schutz vor Replay-Angriffen.
- HMAC vs. reines Hashing – das Hashen einer Nachricht mit SHA-256 belegt Integrität, aber nicht Authentizität. Jeder kann SHA-256(message) berechnen. HMAC erfordert den geheimen Schlüssel, sodass nur autorisierte Parteien gültige Signaturen erzeugen können.
Häufig gestellte Fragen
Was ist die ideale HMAC-Schlüssellänge?
Der Schlüssel sollte mindestens so lang wie die Hash-Ausgabe sein – 32 Byte für HMAC-SHA256, 48 Byte für HMAC-SHA384 und 64 Byte für HMAC-SHA512. Schlüssel, die kürzer als die Hash-Ausgabe sind, schwächen die Sicherheitsgarantie. Schlüssel, die länger als die Blockgröße sind (64 Byte für SHA-256, 128 Byte für SHA-512), werden zuerst gehasht, sodass extrem lange Schlüssel keinen Vorteil bringen.
Ist HMAC dasselbe wie Verschlüsselung?
Nein. HMAC bietet Authentifizierung und Integrität, aber keine Vertraulichkeit. Eine HMAC-Signatur belegt, dass eine Nachricht nicht manipuliert wurde und von jemandem mit dem geheimen Schlüssel erstellt wurde, doch die ursprüngliche Nachricht bleibt lesbar. Wenn Sie den Nachrichteninhalt verbergen müssen, verwenden Sie zusätzlich zu HMAC eine Verschlüsselung (AES, ChaCha20).
Kann ich HMAC im Browser mit der Web Crypto API verwenden?
Ja. Die Web Crypto API unterstützt HMAC nativ über crypto.subtle.importKey() und crypto.subtle.sign(). Sie können HMAC-SHA256-, HMAC-SHA384- und HMAC-SHA512-Signaturen vollständig clientseitig ohne externe Bibliotheken erzeugen. Dies ist der Ansatz, den moderne browserbasierte HMAC-Tools verwenden.