HMAC

Abkürzung: HMAC

Der Name steht für Keyed-Hashing for Message Authentication. HMAC ist kein eigenes Verfahren, sondern eine Konstruktion, die eine beliebige Hashfunktion um einen Schlüssel erweitert — in der Praxis meist SHA-256, dann HMAC-SHA256 genannt.

Warum ein Hashwert allein nicht genügt

Ein Hashwert belegt Unverändertheit nur gegenüber dem Zufall, nicht gegenüber einem Angreifer. Wer eine Nachricht verändern kann, kann auch den mitgeschickten Hashwert neu berechnen — beides steht auf derselben Leitung.

Der naheliegende Ausweg, einen geheimen Schlüssel einfach vor die Nachricht zu hängen und H(Schlüssel ‖ Nachricht) zu bilden, funktioniert nicht. Hashfunktionen der SHA-2- und MD5-Familie arbeiten nach dem Merkle-Damgård-Prinzip: Sie verarbeiten die Eingabe blockweise und tragen den Zwischenzustand mit. Der ausgegebene Hashwert ist dieser Zustand.

Daraus folgt die Längenerweiterung: Wer H(K ‖ m) und die Länge von m kennt, kann den Hashwert als Zwischenzustand übernehmen und weitere Blöcke anhängen. Er erhält einen gültigen Wert für H(K ‖ m ‖ Anhang), ohne den Schlüssel zu kennen. Genau dieser Angriff hat in der Vergangenheit Signaturverfahren in Webanwendungen gebrochen.

Die Konstruktion

HMAC umgeht das Problem, indem es die Hashfunktion zweimal anwendet und den Schlüssel an beiden Stellen einbringt:

HMAC(K, m) = H( (K ⊕ opad) ‖ H( (K ⊕ ipad) ‖ m ) )

ipad ist das Byte 0x36, opad das Byte 0x5C, jeweils auf die Blockgröße der Hashfunktion wiederholt. Der Schlüssel wird auf diese Blockgröße gebracht — kürzere Schlüssel werden mit Nullen aufgefüllt, längere zunächst gehasht.

Der äußere Durchlauf ist der Grund, dass die Längenerweiterung nicht greift: Der nach außen gegebene Wert ist nicht mehr der Zwischenzustand über die Nachricht, sondern der Hashwert eines schlüsselabhängigen Blocks.

Schlüssellänge

Empfohlen ist eine Schlüssellänge von mindestens der Ausgabelänge der verwendeten Hashfunktion, bei HMAC-SHA256 also 256 Bit. Ein längerer Schlüssel bringt keinen Zusatzgewinn, weil er zuerst auf die Blockgröße gehasht wird. Ein deutlich kürzerer senkt die Sicherheit auf seine eigene Länge.

Der Schlüssel muss Zufall sein. Ein Passwort als HMAC-Schlüssel ist angreifbar, weil sich Kandidaten durchprobieren lassen — hier gehört eine Schlüsselableitung davor.

Welche Hashfunktion

Bemerkenswert ist, wie wenig HMAC von Kollisionen betroffen ist. Für Signaturen ist Kollisionsresistenz entscheidend, für HMAC fast nicht: Ein Angreifer kann die Kollision nicht nutzen, weil er den Schlüssel nicht kennt und die Werte nicht frei berechnen kann.

Deshalb galt HMAC-SHA1 noch lange als tragfähig, als SHA-1 für Signaturen bereits erledigt war. Für HMAC-MD5 hat RFC 6151 trotzdem von der weiteren Verwendung abgeraten — nicht wegen eines konkreten Bruchs, sondern weil die Grundlage nicht mehr vertrauenswürdig ist. Neue Anwendungen nehmen HMAC-SHA256 oder HMAC-SHA512.

Vergleich in konstanter Zeit

Ein Fehler, der regelmäßig in Anwendungscode steckt: Der berechnete HMAC wird mit dem empfangenen über einen gewöhnlichen Zeichenkettenvergleich geprüft. Solche Vergleiche brechen beim ersten abweichenden Byte ab.

Damit verrät die Antwortzeit, wie viele Bytes bereits stimmten. Ein Angreifer, der viele Versuche senden kann, erarbeitet sich den gültigen Wert byteweise. Der Vergleich muss deshalb immer alle Bytes durchlaufen; die Kryptobibliotheken halten dafür eigene Funktionen bereit.

Wo HMAC vorkommt

In TLS bis Version 1.2 als Prüfsumme der Datensätze, in Version 1.3 innerhalb der Schlüsselableitung. In IPsec zur Integritätssicherung der Pakete. Bei RADIUS im Message-Authenticator. In JSON Web Tokens als Verfahren HS256. Und in nahezu jeder API, die Anfragen mit einem gemeinsamen Geheimnis signiert.

Abgrenzung zur digitalen Signatur

Beides belegt Unverändertheit und Herkunft, aber mit einem Unterschied, der rechtlich und praktisch zählt.

HMAC ist symmetrisch: Beide Seiten kennen denselben Schlüssel. Wer prüfen kann, kann auch erzeugen. Gegenüber einem Dritten lässt sich damit nichts beweisen — der Empfänger hätte die Nachricht selbst erstellen können.

Eine digitale Signatur ist asymmetrisch: Nur der Inhaber des privaten Schlüssels kann sie erzeugen, jeder mit dem öffentlichen Schlüssel kann sie prüfen. Erst das ergibt Nichtabstreitbarkeit. Siehe Public-Key-Verfahren.

HMAC ist dafür erheblich schneller und braucht keine Zertifikatsverwaltung — weshalb es innerhalb geschlossener Systeme die üblichere Wahl ist.

Erstellt: