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 |
|
|