@knalli
Sicher, es ist richtig, dass einem Kollisionen bei langen Passwörtern einen Strich durch die Rechnung machen können, aber du musst bedenken:
a) um die Kollisionen eines Hashing-Algorithmus‘ voll auszunutzen, müsstest du eine Rainbow-Table erstellen, die für jeden möglichen Hash zumindest einen möglichen Klartext liefert. Das ist absolut unwirtschaftlich.
Ein MD5-Hash ist 128bit lang. Das heißt, du hast einen String bestehend aus 32 Hexadezimalzahlen. Rein rechnerisch müsstest du also eine Datenbank anlegen, die zumindest theoretische 340282366920938463463374607431768211456 Einträge umfasst (frage mich nicht, wie man diese Zahl ausspricht). Als Rainbow-Table bekommst du das wesentlich kompakter hin, aber die Größe ist dennoch immens. Bei SHA1 wächst die Anzahl bereits auf 1461501637330902918203684832716283019655932542976 und von SHA256 will ich gar nicht erst reden (nagut, doch, weil es so schön aussieht: 115792089237316195423570985008687907853269984665640564039457584007913129639936 und SHA512… auch lassen wir das…).
b) irgendwann fällt dir bei der Berechnung der Rainbow-Table deine eigene Reduktionsfunktion auf die Füße, denn auch die produziert selbstverständlich Kollisionen.
c) Kollisionen müssen nicht zwangsläufig auftreten. Es ist durchaus möglich, dass für Klartext-Phrase „foo“ schlicht keine Kollision mit vertretbarem Aufwand zu finden ist. Insbesondere wenn der Hashwert länger ist als das Kennwort (was bei starken Algorithmen meist der Fall ist), wirst du mit Kollisionen nicht unbedingt weit kommen.
d) Kryptographische Funktionen wurden extra dazu designt, kollisionsresistent zu sein. Das heißt, dass dies explizit eine Anforderung an eine solche Funktion ist. Aus diesem Grund ist es nicht einfach möglich, einen Algorithmus zu schreiben, der zu x = hash(y) die Unbekannte x berechnet. Auch bei MD5 nicht. Hier bleibt dir also nur Bruteforce oder eine unglaublich große Rainbow-Table.
Bei schwachen Hash-Algorithmen (wie eben LM-Hashes) bekommst du also schnell eine Rainbow-Table zusammen, die 99% aller möglichen Kombinationen abdeckt, die notwendig sind, um Kennwörter sicher zu knacken. Bei stärkeren Algorithmen gelingt das nicht so einfach.