Erst letztens bin ich mal wieder aus allen Wolken gefallen. Ich habe mich bei einem  Online-Service angemeldet und bei der Anmeldung sollte ich standardmäßig meinen Gewünschten Benutzernamen und mein Passwort eingeben.

Dann habe ich die auch noch obligatorische Bestätigungs-E-Mail bekommen in der auch der Link zum Bestätigen meines Accounts stand. Bis dahin war auch soweit alles in Ordnung.  Doch was ich in dieser E-Mail gelesen habe, das hat mich doch glatt umgehauen.


Der Schock

Dort Stand nicht nur mein Benutzername und der Link zur Bestätigung, sondern auch noch einmal meine kompletten Login-Informationen inkl. meines selbst vergeben Passwortes im Klartext.

Ich dachte eigentlich bis dato, dass es in den letzten Jahren bis zum letzten Software- und Anwendungsentwickler durchgedrungen seine muss, dass man Passwörter niemals im Klartext abspeichern darf.

Dieses Vorgehen ist nicht nur ein Vertrauensbruch gegenüber dem User, sondern auch ein eklatantes Sicherheitsproblem. Niemand, aber auch wirklich Niemand darf eine vom Benutzer eingegebenes oder vom System Initial generiertes  Passwort lesen können. Nicht einmal der mit den am meisten Rechten behaftete Admin oder Datenverwalter.

Es hat nicht nur niemanden zu interessieren, wie das Passwort eines Benutzers lautet, es zerstört auch wie gesagt das Vertrauen. Ein Passwort ist und bleibt persönlich. Es könnte sein, dass ein Passwort vom Benutzer bei unterschiedlichen Anbietern mehrmals benutz wird, oder das die Passwort-Struktur auf weitere vom User verwendete Passwörter schließen lässt. Zudem kann sich jeder (auch z.B. der Admin), der das Passwort lesen kann auch als dieser User offiziell und anonym einloggen und Daten lesen oder stehlen.


Passwort verschleiern

Ein Passwort sollte (und so wird es auch in den meisten Fällen gemacht) immer verschleiert (nicht verschlüsselt) in der Datenbank gespeichert werden.  Verschlüsselt deshalb nicht, weil natürlich auch dieser Wert mit dem Verschlüsselungs-Key wieder entschlüsselt werden kann.

Am meisten verbreitetest ist der Verschleierung-Algorithmus Message-Digest Algorithm 5 kurz MD5 . Es handelt sich hierbei um eine kryptographische Hashfunktion,  welche aus einer beliebigen Zeichenfolge einen 128-Bit Hashwert generiert.  Das Ergebnis ist üblicherweise ein 32 stelliger Hexadezimalwert.

Der MD5 von www.news-und-tests.de lautet z.B. 79b78255e4951678e03de7c3933a6be1

In fast jeder Hochsprache gibt es für die Benutzung von z.B. MD5 entsprechende Methoden. In PHP wäre das die gleichnamige Methode md5. Hier mal ein exemplarisches Beispiel für eine “Passwort vergessen”-Funktion:

<?php
 // Benutzer aus der DB holen
 $user = $userManager->getUserByNickname($nickname);
 if ($user == null)
 return false;

 // neues Passwort erzeugen - müsste natürlich dynamisch generiert werden
 $newPassword = "st1Xcb6G";

 // Hash-Wert erzeugen
 $newMD5Password = md5($password);

 // neues Passwort zuweisen
 $user->setPassword($newMD5Password);

 // Benutzer speichern
 if (!$userManager->save($user))
 return false;

 //E-Mail mit neuen Login-Infos verschicken
 sendNewPasswordNotification($user);
?>

Hier würde am Ende 6a67899131c57e5e100d387cb70d5a4d in der Datenbank als Passwort stehen.

Das besondere an einer Hashfunktion ist es, das es im Gegensatz zu einer Verschlüsselungs-Funktion zu unterschiedlichen Eingaben identische Ausgaben geben kann. Das bedeutet im Umkehrschluss, dass die Ursprüngliche Eingabe nicht wieder reproduzierbar ist.

Allerdings solltet Ihr daran denken, dass die MD5-Methode durchaus per Brute-Force-Methode knackbar ist. Hierbei verwandelt man einfach alle nur denkbaren Passwörter in einen MD5-Hash und vergleich das Ergebnis mit dem Hash-Wert des Passworts. Bei Gleichheit hat man halt das Passwort erkannt.


Validierung und die Verantwortung des Benutzers

Hier ist es immer wieder anzuraten ein langes und wirklich sicheres Passwort zu verwenden. Aber das Liegt natürlich in der Verantwortung des Benutzers und kann maximal durch einfache Restriktionen während der Eingabe-Validierung des vom Benutzer gewählten Passworts beeinflusst werden.  Hier könnte z.B. eine Mindestlänge von 7 Zeichen und/oder eine Mischung aus Buchstaben und Zahlen  erzwungen werden.

Validierung, aber auch  Verschlüsselung und Verschleierung in der DB hin oder her, ein Passwort welches test123 lautet, kann halt von jedem erraten werden. Ein Herr Max Mustermann geboren im Jahre 1968 sollte sich tunlichst auch kein Passwort der Art Max68 auswählen.

Speichern wir also unser Passwort nun als MD5 in der Datenbank, so  können außer mit der Brute-Force-Methode keine Rückschlüsse auf das Klartext-Passwort mehr gezogen werden. Es ist verschleiert und von keinem mehr Lesbar.


Passwort prüfen

Jetzt haben wir also in unserer Datenbank das Passwort unseres Benutzers  unleserlich gespeichert und keine Referenz mehr auf das originale lesbare Passwort. Da wird sich der ein oder andere zu Recht fragen wie man denn nun feststellen kann, ob der Benutzer das richtige Passwort eingegeben hat.

Ganz einfach. Ihr nehmt einfach das vom Benutzer bei der Authentifizierung (Login) eingegebene Passwort und generiert davon wiederum einen MD5. Dieser Wert wird nun mit dem gespeicherten Hashwert in der Datenbank verglichen und voila, Ihr habt den Wahrheitswert der Prüfung und könnt den Benutzer entsprechend passieren lassen, oder abweisen. Niemand außer dem Benutzer muss dafür das Passwort kennen.


Passwort vergessen (siehe obigen Besipiel-Code)

Natürlich könnt Ihr bei der Benutzung der oft (zum Glück ;) ) üblichen “Passwort vergessen”- Funktion nicht einfach dem User das in der Datenbank stehende Passwort zusenden. Hier müsst Ihr dann Serverseitig ein neues Passwort generieren, dieses dem User per E-Mail zusenden und es (ganz wichtig) wieder mittels der MD5-Hashfunktion verschleiert in der Datenbank abspeichern.


Fazit

Also bitte liebe Software- und Anwendungsentwickler und natürlich auch liebe Datenbankdesigner (das Passwort-Feld in der DB muss schließlich mindestens 32 Zeichen fassen ;) ). Denkt daran niemals ein Passwort im Klartext zu speichern, oder gar einem Benutzer ein von Ihm selbst eingegebenes Passwort per E-Mail zuzusenden.

Hier heißt die Devise verschleiern und vergessen.

Ähnliche Artikel: