Christoph Zurnieden: Clientseitig MD5-Hash von Passwörtern erzeugen sinnvoll?

Beitrag lesen

Hi,

Macht es also Sinn, wie im Beispiel beschrieben vorzugehen?

Nein.
Der Server -- nennen wir ihn mal ganz unverbindlich Bob -- muß jedesmal einen individuellen Seed mitschicken. Das kann z.B. die Uhrzeit sein, zusammen mit einer Zufallszahl und/oder einem eigenem Schlüssel.

Seed = MD5(time() + random() + PrivKey)

Dieser Wert wird von Bob behalten und auch in's Loginformular gesteckt. Beim User -- denn nennen wir mal Alice --  passiert dann folgendes:

Return = MD5(MD5(password) + Seed)

Das schickt sie an Bob zurück, dort wird dann verglichen:

userHash = searchDBforHash("Alice")
Seed     = searchDBforActualSeed("Alice")
Have     = MD5(userHash + Seed)
Given    = parsePOSTFor(Return)
if(Have == Given){
  SUCCESS(user)
}

Da Bob nie das Paßwort kennen sollte, sondern stets nur einen kryptographischen Hash davon (in diesem Beispiel MD5) gibt searchDBforHash(user) nur den MD5-Hash des Paßwortes von 'user' zurück. Damit nun Bob aus dem bekanntem Seed und dem unbekanntem Paßwort etwas Sinnvolles verglichen werden kann, wird bei Alice zuerst das Paßwort gehashed und dann der daraus resultierende Hash mit dem Seed zusammen nochmal gehashed. So zeigt beide Rechnung das gleiche Ergebnis, wenn das Paßwort korrekt ist.

Return = MD5(MD5(password) + Seed)
Have   = MD5(userHash + Seed)

So nun ein Lauscher -- nennen wir sie mal Eve -- auf der Leitung sitzt und unser schon so an's Herz gewachsene Pärchen Alice&Bob aufmerksam beobachtet, so kann sie folgendes erkennen: den Seed von Bob und einen Schlüssel von Alice, das dieser Schlüssel sie zum Zutritt berechtigt und das das immer nur einmal mit dem gleichem Schlüssel funktioniert.
Da im idealem kryptographischem Hash das Endergebnis vollkommen von der Eingabe verschieden ist, auch wenn sich dort auch nur ein Bit ändert, dann kann auch mit dem Teilklartext "Seed" weder der Hash des Paßwortes noch das Klartextpaßwort erkannt werden. Das Bob in den Seed noch einen geheimen privaten Schlüssel hinzufügt dient nur noch marginal der Sicherheit, da die Zufallsdaten schon ausreichend sicher sind.

Da dieses Vorgehen aktive Inhalte auf der Serverseite erfordert (Skripte o.ä.) wäre es angebrachter ein paar Euro draufzulegen und sich Webspace mit SSH anzumieten. Nein, es sind _wirklich_ nur ein paar Euro mehr!
Zumal Eve ja dann zwar nicht das Paßwort erfährt, jedoch alle Inhalte falls die unverschlüsselt sind. Denn der restliche Transfer erfolgt ja über unverschlüsselte Leitung.

so short

Christoph Zurnieden

PS:
MD5 gilt offiziell als gebrochen und ist nicht mehr mit gutem Gewissen als kryptographische Hashfunktion benutzbar. Empfehlenswert ist z.B. SHA-256. Auch AES-128 ist bis jetzt ohne Makel und hätte den Vorteil der gleichen Hashlänge wie MD5. Eine Javascriptimplementation von SHA-256 (BSD-Lizenz):http://anmar.eu.org/projects/jssha2/files/sha2.js. Eine AES-128 in JS habe ich auf die Schnelle nicht gefunden.
CZ