EMZETT.
Login

HMAC: Nachrichten mit einem geheimen Schlüssel absichern

Kurz: Ein HMAC ist ein Prüfwert aus Nachricht und geheimem Schlüssel; er beweist, dass die Nachricht von jemandem mit dem Schlüssel stammt und unterwegs nicht verändert wurde.

Genauer: Ein normaler Hash (zum Beispiel SHA-256) kann von jedem berechnet werden: Ein Angreifer ändert die Nachricht und berechnet den Hash neu. Ein HMAC (Hash-based Message Authentication Code) bezieht einen geheimen Schlüssel ein; ohne ihn kann niemand einen gültigen Wert erzeugen.

Im Detail

So funktioniert es

HMAC(Schlüssel, Nachricht) = Hash( (Schlüssel ⊕ opad) ‖ Hash( (Schlüssel ⊕ ipad) ‖ Nachricht ) )

Sender und Empfänger kennen denselben geheimen Schlüssel. Der Sender hängt HMAC-SHA256(Schlüssel, Nachricht) an; der Empfänger berechnet ihn selbst und vergleicht. Stimmen sie überein, ist die Nachricht authentisch (vom Schlüsselinhaber) und unverändert (Integrität). Der Hash allein verschlüsselt nichts.

Beispiel in Python

import hmac, hashlib
 
schluessel = b"geheimes-token"
nachricht = b'{"betrag": 100}'
 
sig = hmac.new(schluessel, nachricht, hashlib.sha256).hexdigest()
 
# Prüfen (zeitkonstanter Vergleich!)
ok = hmac.compare_digest(sig, empfangene_sig)

Benutze compare_digest (Vergleich in konstanter Zeit), sonst verrät die Zeitdifferenz beim Vergleich, wie viele Zeichen stimmen (Timing-Angriff).

Wo es verwendet wird

  • Webhooks: Stripe, GitHub und andere signieren Anfragen mit HMAC; dein Server prüft die Signatur, bevor er sie verarbeitet.
  • API-Authentifizierung (zum Beispiel AWS Signature, signierte URLs).
  • JWT mit HS256 (symmetrisch signiert).
  • Session-Cookies signieren, CSRF-Token, Passwort-Reset-Links.
  • TLS, IPsec, SSH nutzen HMAC (oder AEAD) für Integrität.
  • TOTP (Einmalcodes) basiert auf HMAC.

Wichtige Hinweise

  • Schlüssel lang und zufällig (mindestens 32 Byte), geheim halten, rotieren.
  • HMAC ≠ Verschlüsselung: Der Inhalt bleibt lesbar.
  • Für Absicherung gegen Wiederholung (Replay) einen Zeitstempel/Nonce einbeziehen und Alter prüfen.
  • Asymmetrische Signaturen (RSA, Ed25519) nutzt man, wenn der Prüfer den Schlüssel nicht geheim halten soll (jeder darf prüfen, nur einer darf signieren).
  • Kein selbstgebautes Hash(Schlüssel + Nachricht): anfällig für Length-Extension; immer HMAC verwenden.

Siehe auch: Hashing, SHA-256, Webhooks, JWT, Digitale Signatur