Ein einfaches Protokoll basierend auf einer Hashfunktion f wäre:
Challenge-Response Protokoll ≘ Herausforderung- und Antwortprotokoll
Alice |
unsicherer Kanal |
Bob |
|---|---|---|
Gibt Benutzerkennung ID ein |
→ sendet ID |
sucht zu ID Schlüssel K in der Datenbank |
↓ |
||
Gibt Passwort K' ein |
sendet r ← |
wählt zufällige Zahl r |
↓ |
||
berechnet: \(Res'=f(K',r)\) |
→ sendet Res' |
\(f(K,r) ?= Res'\) |
Die Idee ist, dass man jemanden davon überzeugen möchte, dass man eine bestimmte Information hat, ohne diese Information zu offenbaren.
Viele Zero-Knowledge Protokolle basieren darauf, dass man im Prinzip ein Spiel spielt, das man auch zufällig gewinnen kann. Durch die Wiederholung des Spiels wird die Wahrscheinlichkeit jedoch für permanentes zufälliges Gewinnen sehr schnell sehr klein (exponentiell). Somit kann man für praktische Zwecke hinreichend sicher sein, dass der Beweisführende (im Beispiel Peggy) über das Wissen verfügt, das er vorgibt zu besitzen, wenn er immer gewinnt.
Nach 20 Runden ist die Wahreinschlichkeit nur noch \(1/2^{20} = 1/1 048 576\).
Mit 128 Runden erreicht man ein Sicherheitsniveau, das vergleichbar ist mit anderen kryptographischen Verfahren (AES-128, SHA-256, ...).
Voraussetzungen
gegeben zwei zufällige Primzahlen p und q und \(n = p \cdot q\)
Peggys geheimer Schlüssel s wird dann zufällig bestimmt; \(s \in \mathbb{Z}_n^*\) und s coprimal zu n.
Der öffentliche Schlüssel wird dann wie folgt berechnet: \(v = s^{-2} \bmod n\). Der öffentlichen Schlüssel besteht dann aus den zwei Zahlen \(v\) und \(n\).
Protokoll
Peggy berechnet \(x\) unter Verwendung einer beliebigen Zufallszahlen \(r \in \mathbb{Z}_n^*\):
\(x = r^2 \bmod n\)
Peggy sendet die Zahl an Victor.
Victor wählt zufällig ein Bit \(b \in \{0, 1\}\)
Peggy berechnet \(y = r \cdot s^b \bmod n\)
Peggy sendet y an Victor.
Victor testet: \(x \cdot v^{-b} \bmod n \stackrel{?}{=} y^2 \bmod n\)
Beispiel: Fiat-Shamir-Protokoll mit kleinen Zahlen
Zwei Parteien, Peggy (die sich authentifizieren möchte) und Victor (der Prüfer), führen das Fiat-Shamir-Protokoll durch. Verwenden Sie die folgenden Werte:
\(p = 3\), \(q = 7\) → \(n = p \cdot q = 21\)
Peggys geheimer Schlüssel ist \(s = 2\)
Peggy wählt die Zufallszahl \(r = 4\)
Victor wählt die Herausforderung \(b = 1\)
Beantworten Sie folgende Fragen:
Berechnen Sie den öffentlichen Schlüssel v.
Berechnen Sie den Wert x, den Peggy an Victor sendet.
Berechnen Sie die Antwort y, die Peggy an Victor sendet.
Führen Sie die Verifikation als Victor durch
unverschlüsselte Übertragung von Passwörtern (telnet, ftp, ...)
Verwendung von Einmal-Passwörtern (S/Key, ...)
Passwörter werden verschlüsselt übertragen (ssh, https, ...)
Zusätzliche Absicherung durch Zwei-Faktor-Authentifizierung (basierend auf Einmalpassworten: TOTP, ...)
Unverschlüsselte Passworte können leicht mittels eines Sniffers, der den Netzwerkverkehr mitschneidet (z. B. Wireshark), abgefangen werden.
Die Idee ist, dass Passwörter nur genau einmal gültig sind und nicht wiederverwendbar sind.
Tokens (z. B. RSA SecurID)
Codebuch: Liste von Einmal-Passwörtern, die das gemeinsame Geheimnis sind.
S/Key: Passwort „wird mit einem Zähler kombiniert“ und dann gehasht.
Einmal-Passwort-System nach Codebuch-Verfahren.
Initialisierung
Der Nutzer gibt sein Passwort \(W\) ein; dies ist der geheime Schlüssel.
(Sollte \(W\) bekannt werden, dann ist die Sicherheit des Verfahrens nicht mehr gewährleistet.)
Eine kryptografische Hash-Funktion \(H\) wird n-mal auf \(W\) angewandt, wodurch eine Hash-Kette von n einmaligen Passwörtern entsteht. \(H(W), H(H(W)), \dots, H^{n}(W)\)
Das initiale Passwort wird verworfen.
Der Benutzer erhält die \(n\) Passwörter, die in umgekehrter Reihenfolge ausgedruckt werden: \(H^n(W), H^{n-1}(W), ..., H(H(W)), H(W)\).
Nur das Passwort \(H^n(W)\), das an erster Stelle der Liste des Benutzers steht, der Wert von \(n\) und ggf. ein Salt, wird auf dem Server gespeichert.
Anmeldung
Identifiziere das letzte verwendete Passwort \(n\).
Der Server fragt den Nutzer nach dem Passwort \(n-1\) (d. h. \(H^{n-1}(W)\)) und übermittelt ggf. auch den Salt.
Der Server hasht das Passwort und vergleicht es dann mit dem gespeicherten Passwort \(H^n(W)\).
Ist das Passwort korrekt, dann wird der Nutzer angemeldet und der Server speichert das Passwort \(H^{n-1}(W)\) als neues Passwort \(H^n(W)\) und dekrementiert n.
Im Original basiert S/Key auf der kryptographischen Hashfunktion MD4. Ein Austausch wäre aber selbstverständlich möglich!
Intern verwendet S/KEY 64-bit Zahlen. Für die Benutzbarkeit werden diese Zahlen auf sechs kurze Wörter, von ein bis vier Zeichen, aus einem öffentlich zugänglichen 2048-Wörter-Wörterbuch (\(2048 = 2^{11}\)) abgebildet. Zum Beispiel wird eine 64-Bit-Zahl auf "ROY HURT SKI FAIL GRIM KNEE" abgebildet.
ermöglicht die Erzeugung von Einmal-Passwörtern auf Basis eines geheimen Schlüssels und eines Zählers; Parameter:
Ein kryptografisches Hash-Verfahren \(H\) (Standard ist SHA-1 mit 160 Bit)
einen geheimen Schlüssel \(K\), der eine beliebige Bytefolge ist
Ein Zähler \(C\), der die Anzahl der Iterationen zählt
Länge des Passworts: \(d\) (6-10, Standardwert ist 6, empfohlen werden 6-8)
Zur Authentifizierung berechnen beide das Einmalpasswort (HOTP) und dann vergleicht der Server den Wert mit dem vom Client übermittelten Wert.
Berechnung aus dem Schlüssel \(K\) und dem Zähler \(C\):
\(HOTP(K, C) = truncate(HMAC_H(K, C))\)
\(truncate(MAC) = extract31(MAC, MAC[(19 \times 8 + 4):(19 \times 8 + 7)])\)
\(HOTP\; value = HOTP(K, C)\; mod\; 10^d\qquad\) (führende Nullen werden nicht abgeschnitten)
\(truncate\) verwendet die 4 niederwertigsten Bits des MAC als Byte-Offset \(i\) in den MAC. Der Wert \(19\) kommt daher, dass ein SHA-1 \(160\) Bit hat und \(160/8 = 20\) Byte.
\(extract31\) extrahiert 31 Bit aus dem MAC. Das höchstwertig Bit wird (wenn es nicht 0 ist) entsprechend maskiert. Eine Schwäche des Algorithmus ist, dass beide Seiten den Zähler erhöhen müssen und, falls die Zähler aus dem Tritt geraten, ggf. eine Resynchronisation notwendig ist.
Erzeugung von zeitlich limitierten Einmal-Passwörtern (z. B. 30 Sekunden)
Basierend auf einem vorher ausgetauschten geheimen Schlüssel und der aktuellen Zeit
Z. B. Unix-Zeit in Sekunden (ganzzahlig) und danach gerundet auf 30 Sekunden.
Es wird das HOTP Verfahren mit der Zeit als Zähler verwendet und entweder SHA-256 oder SHA-512 als Hashverfahren, d. h. TOTP \(value(K)\) = HOTP \(value(K, C_T)\), wobei \(T\) die „aktuelle Zeit“ ist.
\(C_T = \lfloor { T - T_0 \over T_X } \rfloor\)
\(T_X\) ist die Länge eines Zeitintervalls (z. B. 30 Sekunden)
\(T\) ist die aktuelle Zeit in Sekunden seit einer bestimmten Epoche
\(T_0\) ist bei Verwendung der Unix-Zeit \(0\)
\(C_T\) ist somit die Anzahl der Dauern \(T_X\) zwischen \(T_0\) und \(T\)
Das Verfahren verlangt somit, dass die Uhren von Server und Client (hinreichend) synchronisiert sind.
S/Key
Welche Vorteile bieten Einmalpasswortsysteme gegenüber Systemen mit mehrfach zu verwendenden Passworten?
Welchen Angriffen sind Einmalpasswortsysteme weiterhin ausgesetzt?
Generieren Sie eine Liste von Einmalpassworten mit Initialwert \(r = 769\). Generieren Sie \(H(r)\) bis \(H^6(r)\) wenn die Einwegfunktion hier der Einfachheit halber \(H(x) = x^2\; mod\; 1000\) ist.
Wie oft kann sich der Benutzer anmelden? Wie sieht seine Liste aus?
Welchen Wert speichert der Server vor dem ersten Anmeldevorgang?
Spielen Sie zwei Anmeldevorgänge durch.
Wenn ein Passwort \(H^L(W), 1 < L < N\) bekannt ist, welche Auswirkungen hat dies auf die Sicherheit des Verfahrens?
HOTP
Gegeben sei der folgende MAC:
Offset |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Mac |
bc |
9f |
aa |
ae |
1e |
35 |
d5 |
2f |
3d |
ea |
96 |
51 |
da |
12 |
cd |
36 |
62 |
7b |
84 |
03 |
Berechnen Sie den HOTP Wert für \(d = 6\).
TOTP
Identifizieren Sie die Vor- und Nachteile von TOTP gegenüber S/Key und fragen Sie sich an welcher Stelle es (aus Sicherheitsperspektive) mögliche Schwächen gibt?
Die Standardzeitspanne ist 30 Sekunden. Welcher Konsequenzen hätte eine deutliche Verlängerung bzg. Verkürzung der Zeitspanne?