Sicherheit ist ein komplexes Thema. Kleines Beispiel: Mein Passwort lautet „apfel“. Wenn ich das mit MD5 hashe, bekomme ich als Hash „f9961ecb53c5204496032f79774ee057“.
Sieht auf den ersten Blick sicher aus, nur ist MD5 ein so verbreitetes Verfahren, dass riesige Datenbanken (Rainbow Table) existieren, die einen Hash in den „Originalwert zurückrechnen“.
Demo:
[noparse]http://md5.gromweb.com/?md5=f9961ecb53c5204496032f79774ee057[/noparse]
Das ist gerade bei kurzen, „lesbaren“ Passwörtern ein Problem.
Abhilfe schafft es, das Passwort künstlich zu verlängern.
Ich schicke nicht „apfel“ sondern „schwuppdiwupp“ + „apfel“ durch die Hash-Funktion. Die Rainbow-Table-Datenbank müsste nun einen Eintrag für „schwuppdiwuppapfel“ enthalten, was aufgrund der Länge dieses Strings unwahrscheinlich ist.
Ein Angreifer, der diesen „schwuppdiwupp“-String kennt, kann jetzt aber hergehen und sich eine eigene Rainbow Table erstellen, die nicht die eigentlichen Wörter enthält, sondern jeweils „schwuppdiwupp“ + $eigentlichesWort.
Das dauert zwar eine Weile, ist aber bei einem Verfahren wie MD5 technisch auch auf einem normalen Heim-PC problemlos machbar. Wir reden hier eher von Stunden/Tagen als von Wochen.
Der nächste Ansatz ist es, einen dynamischen Salt zu verwenden, also für den einen Nutzer „schwuppdiwupp“, für den nächsten „bibabubbobbeb“. Ein Angreifer müsste dann für jeden Nutzer eine eigene Rainbow Table erstellen, was dann nicht einmal Stunden/Tage dauert, sondern für jeden Nutzer diese Zeit.
Das ist es, was gemeinhin genutzt wird. Zusätzlich zu Nutzername legst du für jeden Nutzer ein Feld „Salt“ an und speicherst das Passwort als Hash von $salt + $passwort. Beim Login würdest du dann nachsehen, ob der Nutzername in deiner Datenbank/XML-Datei existiert, den entsprechenden Hash aus $salt + $eingegebenesPasswort bilden und überprüfen, ob dieser String identisch mit dem ist, was für den Nutzer als $passwortHash hinterlegt ist.
Zusätzlich dazu gibt es noch den Ansatz, die Hash-Funktion nicht einmal, sondern 100- oder 1000-mal auf die Eingabe anzuwenden. Die Idee dahinter ist wiederum, dass das Generieren einer Rainbow Table in die Länge gezogen wird.