Passwörter unknackbar speichern

Seite 2: Ausgebremst

Inhaltsverzeichnis

Glücklicherweise gibt es auch Fortschritte in der Hash-Technik, die das schnelle Knacken eines Kennwortes erschweren und das Vorberechnen von Tabellen aus Sicht eines Angreifers unwirtschaftlich machen -- selbst wenn das zu knackende Passwort eigentlich eher schwach ist. Ab einer bestimmten Kennwortlänge lassen sich Rainbow-Tables in keinem sinnvollen Zeitrahmen mehr berechnen und speichern. Daher versieht man vom Nutzer eingegebene Passwörter mit einer zusätzlichen, zufälligen Zeichenkette, auch Salt genannt. Die so entstandene neue Zeichenkette wird durch einen Hash-Algorithmus gejagt und der resultierende Hash beispielsweise in der Datei /etc/shadow abgelegt. Damit ein System spätere Passworteingaben mit dem Hash vergleichen kann, muss das Salt jedoch bekannt sein. Deshalb wird es im Klartext dem gespeicherten Hash vorangestellt. Die Speicherung des Salts im Klartext klingt zwar auf den ersten Blick widersprüchlich, es muss aber gar nicht geheim sondern nur zufällig sein. Es soll ja nur die Anzahl der Kombinationen für jedes einzelne mögliche Passwort aufblähen und so den Aufwand für das Anlegen der Rainbow-Tables immens vergrößern.

Spezielle Online-Dienste versprechen WPA-Schlüssel anhand eines Wörterbuch mit 136 Millionen Einträgen in 20 Minuten zu knacken.

Brute-Force-Angriffe auf ein einziges Passwort bremst ein Salt jedoch nur geringfügig aus. Herkömmliche Hash-Algorithmen etwa zum digitalen Signieren oder dem Erstellen von Dateifingerprints sind auf Geschwindigkeit getrimmt. Bei der Passwort-Prüfung ist dies jedoch kontraproduktiv, denn man will ja die Arbeit des Passwort-Knackers ausbremsen. Brute-Force-Angriffe lassen sich durch das gewollte Verlangsamen des benutzten Hash-Algorithmus beziehungsweise durch viele Wiederholungen des Hash-Vorgangs unattraktiv machen. Für den Anwender ist die Geschwindigkeit dagegen kaum von Belang: Ob die Prüfung eines eingegebenen Passwortes auf einem System beim Login nun 1 Mikrosekunde oder 1 Millisekunde dauert, merkt er nicht. Einen Passwortknacker würde es aber um den Faktor 1000 ausbremsen – statt 100 Millionen Passwörter pro Sekunde kann er nur noch 100.000 pro Sekunde durchprobieren. Ein Brute-Force-Angriff auf das Kennwort "P4ssW0r7" würde so 48 Jahre statt 18 Tage dauern.

Ursprünglich stammt die Technik der künstlichen Verlangsamung aus der Ableitung eines Kryptoschlüssels aus einem Passwort. Weil Nutzerpasswörter oft zu kurz sind und zu wenig Entropie aufweisen, muss man beispielsweise für eine Verschlüsselung mit AES und 256 Bit den Schlüssel kryptografisch sicher verlängern. Kryptologen bezeichnen diesen Vorgang als Key Stretching. Dafür wird das Passwort mehrere Runden durch einen Hash-Algorithmus geschickt. Das Verfahren ist als Password-Based Key Derivation Function 2 (PBKDF2) standardisiert und findet etwa bei WLANs mit WPA-PSK-Schlüssel Anwendung. Auch Smartphones nutzen PBKDF um Backup-Dateien vor dem Export mit einem Passwort zu verschlüsseln. Auch hier bremst es Knackversuche erfolgreich aus.

Eine einfache Rundenfunktion zum mehrfachen Hashen des Passworts kann beispielsweise so aussehen:

key = hash(password)
for 1 to runden do
  key = hash(key)

Der entstandene Hash-Wert wird einfach immer wieder als Parameter an die Hash-Funktion übergeben. Bei komplexeren Rundenfunktionen geht beispielsweise das Passwort zusätzlich immer wieder in den zu hashenden Wert ein. Den Aufwand muss ein Betriebssystem oder eine Anwendung nur einmal pro Passwort pro Anwender treiben. Das Knackprogramm muss dies jedoch für jede Zeichenkombination durchexerzieren -- und jede Runde kostet zusätzliche Rechenzeit, was insgesamt den Vorgang pro Passwort enorm verlangsamt.