Wie speichere ich Passwörter sicher in der Datenbank?

Wie fatal es ist, Nutzerpasswörter nicht sicher zu speichern, kann man beinahe täglich in der Fachpresse lesen. Immer wieder gelingt es Profis, an Firmendaten zu gelangen, weil Sie Zugriff auf die Passwörter bestimmter User bekommen. In den meisten Fällen werden dazu zwar Trojaner oder andere schadhafte Programme verwendet, welche die Passworteingabe direkt mitschneiden, aber in einigen Fällen gelingt es Angreifern auch, die Passwörter nach dem „trial and error“ Prinzip zu ermitteln. Hier erfahren Sie, wie Sie zumindest letztere Möglichkeit stark einschränken können, indem Sie Passwörter sicher in der Datenbank speichern.

Es müssen verschiedene Maßnahmen ergriffen werden, um einen soliden Schutz der Passwörter zu gewährleisten, deshalb gleich die wichtigste Regel zuerst: Speichern Sie Passwörter niemals im Klartext in der Datenbank ab. Sollte ein Angreifer Zugriff auf Diese erhalten, könnte er in diesem Fall alle Passwörter direkt einsehen. Benötigt wird demnach also eine Möglichkeit, Passwörter verschlüsselt in der Datenbank zu speichern. Zum Glück gibt es dafür passende Funktionen in den meisten Programmiersprachen. In diesem Beispiel beschränken wir uns jedoch auf PHP.

Schritt 1: Hashwert generieren

In PHP gibt es mit der Funktion hash() eine bequeme Möglichkeit, den Hashwert einer Zeichenkette zu erzeugen. Das besondere daran ist, dass man die ursprünglich eingegebenen Daten nicht aus dem generierten Hashwert rekonstruieren kann. Bekommt ein Angreifer also Zugriff auf eine Datenbank, kann er mit den darin gespeicherten Hashwerten der Passwörter nichts anfangen. Hier der Code, um den Hashwert in PHP zu erzeugen:

Im ersten Übergabeparameter der Funktion wird der zu verwendende Algorithmus angegeben. In diesem Fall verwenden wir „sha1“. Im zweiten Parameter wird dann das zu verschlüsselnde Passwort eingetragen. Hier können Sie testen, welcher Hashwert bei Ihrem Passwort erzeugt werden würde. Analog zu der oben genannten Funktion gibt es auch noch andere Funktionen in PHP, die den selben Zweck erfüllen, z.B. sha1() oder md5().

Wir sind nun einen Schritt weiter und haben unsere Passwörter verschlüsselt in der Datenbank abgespeichert. Leider reicht dies aber heutzutage nicht mehr aus. Computerhardware ist über die Jahre exponentiell leistungsfähiger geworden und benötigt für Millionen von Kombinationen nur einen Sekundenbruchteil. Dazu kommen in der Szene weit verbreitete, sogenannte „Rainbowtables„. Dies sind Tabellen mit vorberechneten Hashwerten zu häufig verwendeten Passwörtern, mit dessen Hilfe man noch schneller auf das verwendete Passwort schließen kann, falls der Hashwert bekannt ist. Um diese Möglichkeiten ebenso auszuschließen müssen wir dem Passwort ein sogenanntes „Salt“ hinzufügen.

Schritt 2: Passwort salzen

Die Theorie zum salzen eines Passwortes ist denkbar einfach: Man nehme ein Passwort und hänge an das Passwort eine beliebige Zeichenkette an. Erzeugt man nun aus dieser neuen Zeichenkette einen Hashwert, ergibt dies natürlich einen ganz anderen Wert. Ob das Salt im Klartext gespeichert wird, spielt dabei überhaupt keine Rolle. Nach dem bereits oben gezeigten Beispiel kann dies nun also folgendermaßen realisiert werden:

Der Vorteil an dieser Herangehensweise leigt auf der Hand. Passwörter können in Rainbowtables nun nicht mehr so einfach nachgeschlagen werden, da nicht mehr so einfach von den verschlüsselten Werten auf die entschlüsselten Passwörter geschlossen werden kann. Diese Technik hat sich in der Vergangenheit bewährt und sollte deshalb auch unbedingt eingesetzt werden.
Für Security-Enthusiasten bietet sich auch noch die Möglichkeit an, das ganze noch zu verfeinern, indem man zwei Salts benutzt. Dabei wird dem generierten Hash aus Passwort und Salt noch ein weiteres Salt angehängt und aus dem Ganzen dann noch einmal ein Hashwert generiert. Falls man statische Salts benutzt, bietet diese Methode eine gute Möglichkeit, diese zu schützen. Benutzt man jedoch dynamisch generierte Salts, spielt es eigentlich keine Rolle, ob man diese mehrfach nutzt, da schon aus einem Passwort und einem dynamischen Salt kein Rückschluss auf das eigentliche Password gezogen werden kann.

Passwortsicherheit reloaded

Zur Veranschaulichung haben Sie nun die grundlegenden Vorgehensweisen kennengelernt, mit denen sichere Passwörter in einer Datenbank abgespeichert werden. Wenn man nun im PHP Manual nachliest, wird man dennoch folgende Zeilen entdecken:

Hashalgorithmen wie MD5, SHA1 und SHA256 sind auf Geschwindigkeit und Effizienz optimiert. Mit modernen Techniken und leistungsstarker Hardware ist es aber trivial geworden diese Hashalgorithmen mit „brute force“ Attacken anzugreifen. Weil moderne Computer diese Hashalgorithmen leicht brechen können, werden diese von Sicherheitsspezialisten nicht für die Speicherung von Passwörtern empfohlen.

Aus diesem Grund gibt es seit der PHP Version 5.5.0 neue Funktionen, wie password_hash() oder password_verify(), die genau für diese neuen Anforderungen ausgelegt sind. Um also auf Nummer Sicher zu gehen verwenden Sie in Zukunft am besten nur noch diese. Unser Code müsste nach obigem Beispiel nun also folgendermaßen aussehen, wenn die neue Funktion zum Erzeugen des Passwort-Hashs berücksichtigt werden soll:

Wie sie sehen, ist die Eingabe eines Salts hier bereits obsolet. Die Funktion generiert nämlich ein zufälliges Salt und hängt dieses an unser Passwort an. Somit ist diese Methode nicht nur sicherer, sondern auch noch leichter anwendbar. Hier werden zwei Fliegen mit einer Klappe geschlagen.

Sie kennen nun die aktuell wichtigsten Methoden, um Ihre Benutzerkennwörter sicher in Ihrer Datenbank zu speichern. Nutzen Sie die entsprechenden Funktionen für die jeweiligen Sprachen und seien Sie somit auf der sicheren Seite.

0 Kommentare

Dein Kommentar

Want to join the discussion?
Feel free to contribute!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.