Rechnernetze
Home Nach oben Stichworte

HMAC: Verschlüsseltes Hashing

Im RFC 2104 wird ein Verfahren zur Authentisierung beschrieben, welches ohne ein RSA-Verfahren auskommt. Dazu wird die Erzeugung eines Hashwerts von einem Schlüssel abhängig gemacht. 

Aufgabe ist es, ein erhaltenes Dokument darauf hin zu überprüfen, ob es bei der Übertragung vorsätzlich verfälscht wurde. Ein aktiver Angreifer könnte das Dokument verfälschen und einen neuen Hashwert erzeugen. DSA und ähnlich Verfahren verschlüsseln diesen Hashwert mit einem privaten Schlüssel. HMAC fügt in das Dokument einen geheimen Schlüssel ein und Hashed das so entstandene neue Dokument. Dieses kann von einem Angreifer nicht nachvollzogen werden. Er könnte höchstens den Hashwert fälschen, aber damit wäre die Authentisierung völlig gescheitert, also nicht ein gefälschtes Dokument als echt anerkannt. Ist der geheime Schlüssel nur zwei Parteien bekannt, so können diese anhand dieses Schlüssels die Unverfälschtheit einer Nachricht nachweisen. Das gilt auch, wenn sich eine Instanz vergewissern will, dass ein gespeichertes Dokument nicht absichtlich verfälscht. 

RFC 2104 nennt die folgenden Entwurfsziele:

  1. Vorhandene Hash-Funktionen unverändert einsetzen können, die in Hardware oder Software zur Verfügung stehen, und deren Code frei verfügbar ist. 
  2. Die Schnelligkeit der Hash-Funktionen ohne Leistungseinbußen ausnutzen.
  3. Auf einfache Weise die Schlüssel behandeln können
  4. Eine gut verstandene kryptographische Analyse der Stärken des Algorithmus kennen, die auf vernünftigen Annahmen der zugrundeliegenden Hash-Funktionen beruhen.
  5. Die zugrundeliegend Hashfunktion einfach ersetzen zu können, wenn schnellere oder sicherere Hashfunktionen gefunden oder benötigt werden.

Das Verfahren basiert auf der Sicherheit von bekannten Hash-Verfahren wie MD5, SHA-1 oder RIPEMD. Die Idee ist es, einem Text einen Schlüssel hinzuzufügen, so dass der Fingerabdruck nicht nur vom Text, sondern auch vom Schlüssel abhängt.

Es werden die folgenden Werte eingeführt:
H: Hashalgorithmus,
B: Eingabeblocklänge des Hashalgorithmus H (z.B. 64 Bytes bei MD5 und SHA-1),
L: Länge des Haswerts (Fingerabdrucks) des Hashalgorithmus H (z.B. L=16 Bytes bei MD5 und L=20 Bytes bei SHA-1),
S: Schlüssel der Länge k<B,
K=S+(0016)B-k, oder falls k>B: K=H(S)+(0016)B-L
IPAD = (0011 01102)B = (3616)B, innerer Pad,
OPAD = (0101 11002)B = (5C16)B, äußerer Pad.

Der Schlüssel darf nicht länger als die Länge eines Eingabeblocks sein. Ist er länger, so wird der Wert des Schlüssels zunächst mit H gehasht und der Fingerabdruck der Länge L als Schlüssel verwendet. Wird ein Schlüssel kürzer als B verwendet, so ist der Schlüssel rechts mit 0-Bytes aufzufüllen, d.h. im folgenden ist K=S+(0016)B-k bzw. falls k>B ist K=H(S)+(0016)B-L.

Der Algorithmus berechnet den folgenden Hashwert:

Digest = H(K xor OPAD + H(K xor IPAD + text)).

Es wird somit K mit IPAD verknüpft (xor) und vor den Text gehängt, worauf dann der Hashalgorithmus angewendet wird. Das Ergebnis der Länge L wird an K xor OPAD gehängt und dieser Wert noch einmal gehasht. Die Stärke des Algorithmus hängt im wesentlichen von der Stärke des Hashalgorithmus H ab, solange die Schlüssellänge nicht kürzer als L Bits gewählt wird. Man beachte, dass die Werte (K xor OPAD) und (K xor IPAD) unabhängig von dem Text berechnet werden können, was das RFC 2104 ausdrücklich empfiehlt.

Das RFC 2104 hält dieses Verfahren für sicher, vorausgesetzt die folgenden Voraussetzungen sind erfüllt:

  1. HMAC wird korrekt implementiert.
  2. Die Schlüssel werden rein zufällig bzw. mit einem kryptographischen Zufallszahlengenerator erzeugt.
  3. Der Schlüsselaustauschmechanismus ist sicher.
  4. Die Schlüssel werden häufig ausgewechselt.
  5. Die Schlüssel werden sicher aufbewahrt .

Man beachte, dass das Brechen eines Schlüssels bei HMAC nicht die Folge hat, dass alle bisherigen Anwendungen unsicher werden; lediglich zukünftig müssen entweder neue Hashalgorithmen oder neue Schlüssel verwendet werden.