Naja, jain. Es ist richtig, dass es bisher keine verwertbaren Angriffe auf MD5 _bekannt_ sind, um Passwörter zu knacken. Es sind aber strukturelle Schwächen in MD5 bekannt. Und damit sollte der Algorithmus gemieden werden.
Die Schwächen sind aber für kurze Zeichenketten wie Passwörter völlig nebensächlich, da man hier mit Brute-Force wesentlich schneller zum Ziel kommt als mit einem Pre-Image-Angriff, der dann eine Zeichenkette liefert die ziemlich sicher nicht das gesuchte Passwort ist und noch dazu womöglich ewig lang. Grade bei einer vergleichsweise kurzen Zeichenkette ist ist eine Kollision mit einer anderen kurzen Zeichenkette sogut wie ausgeschlossen - wenn man also durch ausprobieren eine weitere kurze Zeichenkette findet, die denselben Hash produziert, ist das mit fast 100%iger Sicherheit das gesuchte Passwort.
Der tatsächliche Grund ist, dass MD5 zu schnell und zu kurz ist, um damit effektiv kurze Zeichenketten wie Passwörter zu schützen
Das gilt für alle Hashing-Algorithmen.
bcrypt erfüllt diese Kriterien (ja, im Grunde ist es kein blanker Hashing-Algorithmus, das ist Blowfish) aber das Gesamtpaket erfüllt diese Kriterien.
Nein, das ist nicht richtig. PHPs
md5()
sieht vielleicht keinen Salt vor, aber es zwingt dich auch keiner, diese Funktion zu nutzen. Nutze haltcrypt
(http://php.net/manual/en/function.crypt.php) mit entsprechendem Salt. Oder salte von Hand.
Es ging mir um die blanke Verwendung von MD5 die vielerorts gang und gäbe ist - in meinem ursprüngliche Beitrag steht ja bereits, dass es mir ein rätsel ist, warum man nicht mit crypt arbeitet.
Ein Hashing-Algorithmus muss per se kein Salting unterstützen, das gängige Vorgehen ist das Einstreuen des Salts an einer Stelle des Klartexts, meistens vorne weg. Wenn du z. B. 12345678 hashen wolltest, mit salt, dann würdest du nicht
md5('12345678')
aufrufen, sondernmd5('$meinunglaublichersalt$12345678')
. So funktioniert salting.
Der Salt allein macht die Sache aber nicht signfikant sicherer - er verhindert nur das massenhafte "Entschlüsseln" von Passwörtern unter Zuhilfenahme vorgenerierte Listen oder Rainbow-Tables. MD5 ist einfach zu schnell dafür und kann auf modernen GPUs in jeder Sekunde Millardenfach erzeugt werden - selbst wenn man das ganze dann durch 1000 Iterationen schickt, wie das Apache-MD5 macht, wird es dadurch nur unwesentlich sicherer.
Darum gibt es ja Algorithmen wie bcrypt die mit dem Ziel in die Welt gesetzt wurden absichtlich extrem langsam zu sein, damit man sie eben nicht per Brute-Force schnell mal durchprobieren kann.