Rechnernetze
Home Nach oben

HMAC und die Pseudorandom-Funktion

Authentisierung in verschiedenen Anwendungen in TLS 
HMAC als Hash-Standard 
HMAC mit MD5 und SHA-1 spezifiziert, 
weitere Algorithmen optional 
MD5 und SHA-1 im Hand-Shaking-Verfahren verwendet.
Verfahren, um aus gegebenem "Geheimnis" zweier Kommunikationspartner systematisch aber nicht reproduzierbar ohne Kenntnis des Geheimnisses Datenblöcke vorgegebener Länge zu generieren.
  P(PRF) berechnet Ausgabe vorgegebener Länge aus 
einem Geheimnis, 
einem Folgewert und 
einem Funktionswert (identifying label) 
zwei Hash-Algorithmen 
Funktion möglichst sicher machen
Sicherheit von einem Hash-Algorithmen reicht aus.
Der Algorithmus im Standard wie folgt beschrieben:
Datenerweiterungsfunktion P_hahs(secret,data) definiert, 
einzelne Hashfunktion zur Erweiterung eines Geheimnisse und 
einen Anfangswert (seed) in einen beliebig großen Ausgabewert:

P_hash(secret, seed) = 
    HMAC_hash(secret, A(1) + seed) +
    HMAC_hash(secret, A(2) + seed) +
    HMAC_hash(secret, A(3) + seed) + ...

Dabei bedeut + Konkatenation.

A() ist definiert als
    A(0) = seed
    A(i) = HMAC_hash(secret, A(i-1))

P_hash so oft wie benötigt iteriert 
benötigte Menge an Daten erzeugen
beispielsweise mit P_SHA-1 64 Bytes Daten erzeugen
viermal iterieren 
(bis A(4)), 80 Bytes Ausgabedaten 
restlichen 16 Bytes verwerfen 
64 Bytes Ausgabedaten bleiben übrig 
PRF 
Geheimnis in zwei Hälften aufgeteilt 
mit der einen Hälfte Daten mit P_MD5 erzeugt
mit der anderen Hälfte Daten mit P_SHA-1
Ausgaben beider Expansionsfunktionen ge-x-odert 
S1 und S2 sind die beiden Hälften des Geheimnisses, 
jede hat gleiche Länge. 
S1 wird von der ersten Hälfte des Geheimnisse, 
S2 von der zweiten genommen. 
Länge durch Rundung der halben Gesamtlänge des Geheimisses 
ursprüngliche Geheimnis ungerade Anzahl von Bytes
letzte Byte von S1 gleich erstem von S2.

L_S = length in bytes of secret;
L_S1 = L_S2 = ceil(L_S / 2);

Das Geheimnis wird wie oben erläutert in zwei Hälften zerlegt (wobei ein Byte beiden angehören könnte), wobei S1 aus den ersten L_S1 Bytes, S2 aus den letzten L_S2 Bytes besteht. 
PRF definiert als 
Ergebnis der Mischung der beiden Pseudozufallsströme, 
ge-x-odert 

PRF(secret, label, seed) = P_MD5(L_S1, label + seed) XOR P_SHA-1(L_S2, label + seed);

Label  
ASCII-String
muss in genau dieser Form übernommen werden
Längenbyte oder angehängte null. 
Label "slithy toves" durch Hashen der folgenden Bytes verarbeitet

73 6C 69 74 68 79 20 74 6F 76 65 73

MD5 16 Bytes Ausgabe 
SHA_1 20 Bytes Ausgaben
Grenzen der internen Iteration stimmen nicht überein
80 Byte Ausgabe erzeugen, 
P_MD5 bis A(5) iterieren
P_SHA-1 bis A(4) iterieren