Inputvalidierung von Passwörtern, Hashing, Rainbow Tables und Salting

Bei einem Passwort will man den Benutzer geradezu ermuntern, viele Sonderzeichen zu verwenden. Kann das zu einer Sicherheitslücke führen?

Nein. Ein Passwort wird in der Realität als erstes in einen Hash umgewandelt und niemals als Plaintext in der Datenbank gespeichert. Ob der Benutzer dann ein „script“ oder „onload“ in seinem Passwort hat, ist nicht wichtig, da es nie zur Ausführung kommt.

Ein Passwort gehasht sieht dann vielleicht so aus: YTM0NZomIzI2OTsmIzM0NTueYQ==

Eine Hashfunktion ist eine Einwegfunktion. Der Hashwert kann also nie in das Passwort zurückgeführt werden. Dies ist auch der Grund, warum auf allen Internetseiten ein zufälliges, neues Passwort erstellt wird, wenn man sein altes Passwort vergessen hat. Gibt der Benutzer sein Passwort ein, wird es ebenfalls gehasht und mit dem gespeicherten Hash in der Datenbank verglichen.

Wenn nun ein Angreifer eine Tabelle mit Passwörtern ergattert hat, kann er alle möglichen Passwörter hashen und dann den Hash mit der Tabelle vergleichen. Beziehungsweise nimmt er nicht alle möglichen Kombinationen, sondern verwendet dafür eine sogenannte Rainbow Table, auf der die meistgenutzten Passwörter stehen. Der Angreifer hasht also ein Passwort der Rainbow Table nach dem anderen und schaut, ob der Hash in seiner geklauten Tabelle vorkommt.

Um es einem Angreifer nun zusätzlich schwer zu machen, kann man ihm die Suppe gehörig versalzen (Brüllwitz). Der Benutzer gibt ein Passwort ein und an dieses Passwort hängen wir noch einen sogenannten „Salt“, bevor wir das alles verhashen und in der Tabelle speichern. So wird aus aus dem Passwort „MeineEhefrau“ zum Beispiel „MeineEhefrau))%*ç%kkkk“. So wird das Anwenden einer Rainbow Table enorm erschwert.

Inputvalidierung, Blacklist, Whitelist

Eine wichtige Massnahme gegen Angreifer ist die Validierung jeglichen Inputs, der in einer Webapplikation eingegeben werden kann. Für die Inputvalidierung gibt es zwei Vorgehen: Entweder mit einer Blacklist oder mit einer Whitelist.

Blacklist bedeutet, man stellt eine Liste von Symbolen zusammen, die der User >nicht< eingeben darf.

Whitelist bedeutet, man erstellt eine Liste von Symbolen, welche der User eingeben darf.

Eine vollständige Blacklist ist dabei viel schwerer zu machen als eine Whitelist. Nimmt man etwa einen Benutzernamen, sind gültige Zeichen die Buchstaben A-Z in Gross- und Kleinschreibung sowie vielleicht noch ein Underscore. Dies zu validieren ist viel einfacher, als auf alle Zeichen zu prüfen, welche nicht vorkommen. Dies kann einfach mit einem regulären Ausdruck passieren. Auch die Mischung von Black- und Whitelist macht nicht viel Sinn: Wenn ich bereits festgestellt habe, welche Symbole der Benutzer eingeben darf, muss ich nicht noch zusätzlich sagen, welche er nicht darf.

Aus diesem Grund sollte man praktisch immer eine Whitelist für die Inputvalidierung erstellen.