Sichere Passwort-Verschlüsselung

Die Tageszeitungen überschlagen sich mit den Meldungen, dass wieder und immer wieder Server bekannter Firmen geknackt wurden. Nach Sony hielt nun auch der Server des japanischen Videospielanbieters Sega einem Hackerangriff nicht stand. Und nicht selten ist zu lesen, dass diese Server die Passwörter ihrer Nutzer im Klartext gespeichert haben. Der Mensch neigt dazu, für viele Systeme das gleiche Passwort zu verwenden. Und so haben die Passwortdiebe meist schnell Zugriff auf andere Accounts des Bestohlenen. Hand aufs Herz: Haben Sie bei Paypal nicht das gleiche Passwort wie bei vielen anderen Webseiten? Es muss nicht weiter aufgeführt werden, was passieren kann, wenn der Server einer dieser Webseiten gehackt und die Passwörter, Namen und Email-Adressen gestohlen werden.

Kein Webserver ist wirklich zu 100 Prozent sicher. Tagtäglich finden Hacker irgendwelche Möglichkeiten, einen Server zu knacken. Dies wird sich nie ändern. Und ein guter Administrator weiß das. Und gerade, weil der Administrator dies weiß, ist es ein Unding, dass viele Webseiten die Passwörter nach wie vor im Klartext speichern. Ein kleiner Test zeigt, ob dies der Fall ist. Schauen Sie sich bei einer Webseite Ihrer Wahl um den Logindialog um, ob Sie einen Link finden, der Ihnen Ihr Passwort zuschickt. Dies ist eine gute Möglichkeit wieder Zugriff auf eine Webseite zu erhalten, falls man das Passwort vergessen hat. Wird jedoch mir genau das Passwort zugeschickt, das ich ursprünglich eingegeben habe, bedeutet dies, dass das Passwort nicht ausreichend verschlüsselt oder gar im Klartext in der Datenbank gespeichert wurde. Besser: Der Server setzt das Kundenpasswort zurück und verschickt ein Einmalpasswort.

Dabei ist es ein Einfaches, Passwörter verschlüsselt abzulegen. In der Regel funktioniert diese Technik so. Das Passwort wird intern immer verschlüsselt, also ein „Hash“ generiert. Der Hash aus dem „Einweg-Hash-Verfahren“  ist als solches für ein gleiches Passwort immer gleich. Rückschlüsse aus dem Hash zum ursprünglichen Passwort zu ziehen, ist nicht möglich.

<?php
// Passwort setzen
$passwort = 'mein_Pwd';

// Hash generieren
$hash = crypt($passwort);
?>

Beispiele von Hashs:

Standard DES: rl.3StKT.4T8M
Extended DES: _J9..rasmBYk8r9AiWNc
MD5:          $1$rafvgdfgle$rISCgZzpwk3UhDidwXvin0

Dies galt lange Zeit als sicher, da dieser Hash nicht zurückrechenbar ist. Wenn nun das Passwort überprüft werden muss, erfolgt die Generierung des Hashs der Benutzereingabe. Und diese wird mit dem gespeicherten Hash aus der Datenbank vergleichen.

if (crypt($benutzer_eingabe) == $hash_aus_datenbank) {
echo "Passwort stimmt überein!";
}

Erfolgt nun ein Angriff auf den Server und die Passwörter werden gestohlen, erhält der Dieb nur die Hashs der Passwörter. Eine Rückrechnung der Passwörter ist nach wie vor nicht möglich. Wohl aber das Durchprobieren (Brute Force) aller Passwortkombinationen mit Crackern wie beispielsweise John the Ripper ist möglich. Nicht ohne Grund wird für ein „sicheres“ Passwort eine Mindeststellenanzahl von acht angesehen. Wörter aus dem Lexikon sind zu vermeiden. So ein Passwort er entschlüsseln bedeutet eine Rechnerlaufzeit von Monaten bis hin zu Jahre. Findige Hacker optimieren diese Entschlüsselung, indem sie ganz einfach bereits bekannte Hashs in riesigen Tabellen (Rainbow Tables) speichern und diese Tabellen mit ihrem Hash vergleichen. So lassen sich „schwache Passwörter“ binnen Minuten entschlüsseln.
Doch auch in Sachen Hardware hat sich vieles getan. Einerseits ist es heute ohne Probleme möglich, sich Rechnerleistung nahezu beliebig via Internet zu mieten („Cloud-Computing“), andererseits sind speziell auf das Entschlüsseln von Passwörtern optimierte Server erhältlich. Wie man auch mit wenig finanziellem Aufwand seinen Rechner derart beschleunigen kann, zeigen die viele Beispiele der Bitcoin-Generierung. Das „Bitcoin-Mining“ ist nur lukrativ, wenn der Rechner deutlich mehr Rechenoperationen pro Sekunde durchführen kann, als ein normaler Standardrechner.

Wie kann man aber doch sicher ein Passwort ablegen?
Wenn ein Administrator das Standard MD5-Hash-Verfahren einsetzt, ist dies schon mal wesentlich besser, als Passwörter im Klartext zu speichern. Doch aufgrund von Rainbow Tables und der gestiegenen Rechenleistung kann dieses Verfahren ebenfalls nicht mehr als sicher angesehen werden. Eine gute Möglichkeit aus Nutzersicht die Sicherheit zu erhöhen, ist ein möglichst langes Passwort zu wählen. Für lange Passwörter ist es unwirtschaftlich, Rainbow Tables durch Vorberechnung anzulegen. Gleiches gilt für das direkte Ausprobieren (Brute Force).
Da aber das Nutzerverhalten zu möglichst kurzen Passwörtern neigt und keine Webseite seine Kunden zwingen kann, beispielsweise ein zwölfstelliges Passwort zu erzeugen, muss der Administrator dies für seine Nutzer machen. Das Passwort wird mit einer zufälligen Zeichenkette verlängert, auch Salt genannt. Erst von diesem neuen Passwort wird der Hash erzeugt. Für den Vergleich der Hash muss dieser Salt allerdings bekannt sein. Also wird der zufällig erzeugte Salt dem Hash einfach vorangestellt und gespeichert. Klingt Widersprüchlich? Ja, aber es funktioniert. Das Ziel des Salt ist es, das Passwort aufzublähen und somit den Aufwand zum Anlegen von Rainbow Tables massiv zu vergrößern. Ein zufällig generierter Salt erfüllt diesen Zweck.

Salz in der Suppe: Salt und Hash
Das Passwort ist somit immer noch nicht zu 100 Prozent sicher geschützt. Die Konzentration des Hackers auf ein bestimmtes Passwort lassen den Hacker je nach Rechenleistung in vertretbarer Zeit zum Ziel kommen. Mehrere oder gar alle Passwörter einer Datenbank zu entschlüsseln, die mit Salt verschlüsselt wurden, ist derzeit fast unmöglich.
Aber auch dieses Verfahren lässt sich noch verbessern. Aktuell ist die beste Methode, ein Passwort zu verschlüsseln, den per Salt gewürzten Hash immer und wieder zu wiederholen. Diese gewollte Verlangsamung hat den Vorteil, dass der Hacker dies ebenfalls für jede Passwortkombination wiederholen müsste. Die Webanwendung, die den Hash bei der Passwortüberprüfung so ermitteln muss, benötigt so viel länger. Von einer Mikrosekunde auf vielleicht eine Millisekunde. Dies merkt der Nutzer nicht. Der Administrator lediglich durch seine höhere Serverlast. Wer aber wirklich massiv ausgebremst wird, ist der Hacker. Aktuell schaffen optimierte Passwortgeneratoren rund 100 Millionen Passwörter pro Sekunde. Wenn ein Passwort beispielsweise 1000 mal gehasht wird, kann der Passwortgenerator lediglich 100.000 Passwörter pro Sekunde erzeugen und vergleichen. Dies bedeutet, dass ein Brute-Force-Angriff auf ein einfaches achtstelliges Passwort von bisher 18 Tagen auf 48 Jahre verlängert wird. Aktuell kann dies für den Hacker als unwirtschaftlich angesehen werden.

Schreibe einen Kommentar