de.comp.lang.php.* FAQ

12.9. Wie kann ich Passwörter sicher speichern?

Antwort von Alex Kiesel

Um Passwörter nicht im Klartext in eine Datenbank speichern zu müssen, gibt es die Möglichkeit diese vorher mit einer Einweg-Verschlüsselung zu versehen, bzw. nur einen Hash des Passworts abzuspeichern. Die Funktionen crypt() und md5() können hierfür benutzt werden.

Crypt verschlüsselt auf den meisten Systemen das Passwort mit DES, es werden jedoch nur die ersten 8 Zeichen zur Verschlüsselung benutzt, längere Passwörter werden also einfach abgeschnitten.

MD5 ist eine kryptographische Hash-Funktion. Sie berechnet für einen beliebigen Eingabestring einen Hash, der 128 Bit lang ist.

Beide Funktionen haben Eigenschaften, die uns hier sehr nützlich sind:

  • Sie sind determiniert: sie geben für eine bestimmte Eingabe immer das gleiche Ergebnis zurück.

  • Es lässt sich nicht vom Ergebnis auf die Eingabe schliessen. Damit ist eine "Rückrechnung" des Passwort-Hashes auf das echte Passwort des Benutzers nicht möglich (außer durch Brute-Force).

  • Es ist sehr unwahrscheinlich (wenn auch nicht unmöglich), dass zwei verschiedene Eingaben genau denselben Hash-Wert ergeben.

Um die Passwörter der Benutzer also sicher zu speichern, wird vor dem Speichern in z.B. einer Datenbank erst der Hash des Passworts berechnet und dieser dann gespeichert. Da wir (und vor allem andere) nicht in der Lage sind, aus dem gespeicherten String das wirkliche Passwort zu berechnen, kann bei der Prüfung der Passworteingabe nicht das Passwort direkt verglichen werden. Wir berechnen zunächst also wieder den Hash der Eingabe und vergleichen diesen mit dem gespeicherten Hash. Wegen der o.g. Eigenschaft wird der Hash der Eingabe (i.A.) genau dann gleich dem gespeicherten Hashwert sein, wenn die ursprünglich eingegebenen Passwörter gleich sind.

Auch wenn die Passwörter nun sicher in der Datenbank gespeichert sind, sollte hier nicht übersehen werden, dass die Eingaben des Benutzers, also auch das Passwort, bei einer normalen HTTP-Übertragung unverschlüsselt über die Leitung gehen und somit nicht sicher sind. Eine mögliche clientseitige Verschlüsselung z.B. durch Javascript, bei der nur das Passwort verschlüsselt wird, ist keine Abhilfe dagegen. Hier würde zwar das Passwort nicht ersichtlich sein, zum Anmelden würde es aber reichen, den mitgesnifften Hash an den Server zu schicken. Letztlich bleibt für eine sichere Authentifizierung nur die Übertragung über HTTPS.

Valid HTML 4.01! Valid CSS!

12.9. Wie kann ich Passwörter sicher speichern?
http://www.php-faq.de/q/q-safe-password.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team