Kleine Ergänzung bzw. Konkretisierung zu Rainbow-Tables und Salts: anders als ein Wörterbuch, listet eine Rainbow-Table nicht bloß typische Trivialpasswörter, sondern im Idealfall einen Großteil aller möglichen Kombinationen (sofern bei einem Hashing-Verfahren wie LM-Hashes die maximale Passwortlänge begrenzt ist). Dies schließt nicht bloß Trivialpasswörter ein. Da hierdurch aber natürlich ab einer bestimmten Schlüssellänge die Festplattenkapazität der Menschheit überschritten würde, nutzt man ein intelligentes Verfahren, das in etwa so aussieht:
Man nimmt sich ein Klartextkennwort und schickt das durch die Hash-Funktion. Diesen generierten Hash schickt man durch eine Reduktionsfunktion, die aus dem Hash einen beliebigen weiteren Klartext erzeugt (z.B. indem es die ersten x Zeichen das Hash-Werts nutzt). Dieser neue Klartext wird dann wieder gehasht usw. Nach einer bestimmten Anzahl an Iterationen hört man auf und speichert den letzten Hash zusammen mit dem Klartext, mit dem man begonnen hat. Dann fängt man mit der nächsten (Chain) an, mit der man auf dieselbe Art verfährt.
So hat man hinterher eine umfangreiche Liste von Anfangs-Klartext-Kennwörtern und End-Hash-Werten. Alle Zwischenschritte werden nicht gespeichert.
Will man nun einen Hash knacken, guckt man in der Spalte mit den Hash-Werten, ob dieser dort vorhanden ist. Wenn nicht, wird der Hash durch die Reduktionsfunktion geschickt und wieder gehasht. Dann wird wieder geprüft usw. usf. Hat man irgendwann einen Treffer, muss man nur noch den gespeicherten Anfangs-Klartext der jeweiligen Chain entsprechend oft durch die Hash- und Reduktionsfunktion laufen lassen, bis man den Klartext zum Hash hat.
Ist ein Hash jedoch gesalzen, dann klappt das nicht mehr so gut. Der Angreifer müsste jetzt für jeden Hash eine neue Rainbow-Table errechnen, da dasselbe Kennwort plötzlich unterschiedliche Hashes produziert.
Den Aufwand kann sich der Angreifer auch sparen und gleich per Bruteforce stumpf alle Kombinationen durchprobieren.
Weitere Möglichkeiten, um Rainbow-Tables ineffektiv zu machen, sind stärkere Hashing-Algorithmen, Key-Strengthening durch wiederholtes Hashing und natürlich längere Passphrasen, da mit ihnen auch die Größe der Tabelle steigt.