Beim Speichern von Passwörter in einer PHP Anwendung sollte man generell darauf achten, keine Passwörter im Klartext abzuspeichern. Dabei ist es egal ob die Passwörter in einer Datei, oder in einer Datenbank abgelegt werden. Wenn man immer nur den sog. Hash-Wert eines Passwortes abspeichert, erschwert man einem Angreifer, der sich Zugang zum System verschafft hat, mit den Passwörtern weiteren Schaden anzurichten.
Wie macht man das nun aber im Detail und wie stellt man sicher, dass ein eingegebenes Passwort korrekt ist? Herbei helfen die Hash und Verschlüsselungsfunktionen von PHP.
Im Regelfall müssen sich Benutzer im ersten Schritt an der PHP Anwendung registrieren. Hiebei entsteht ein Datensatz mit Benutzername, Passwort und ggf. noch weiteren benutzerbezogenen Daten. Bevor man den Datensatz im System speichert, geht man her und nutzt z.B. die Funktion md5() und errechnet den Hash-Wert des Passwortes:
$hash = md5($passwort); |
Diesen Hash-Wert nimmt man nun und speichert ihn als Passwort des Benutzers in der PHP Anwendung ab. Ein Hash-Wert beschreibt eine Zeichenkette, ohne dass man auf die Zeichenkette an sich Rückschlüsse ziehen kann. Versucht es einmal selbst und nehmt verschiedene Zeichenketten zum Test. Egal wie lang oder kurz die Zeichenkette ist, als Hash-Wert wird immer eine gleich lange kryptische Zeichenkette erzeugt. Beispiel:
Der Hash-Wert von der Zeichenkette „Hund“ sieht so aus:
06e2b745f3124f7d670f78eabaa94809
Und der Hash-Wert von der Zeichenkette „Hund, Katze, Maus“ sieht so aus:
312556f49376051619bace2b4cf0a73e
Man sollte trotz der Verschlüsselung immer darauf achten, dass die Anwender entsprechend komplexe Passwörter verwenden. Auch wenn die Passwörter verschlüsselt sind, kann man sie „erraten“.
Wenn wir nun davon ausgehen, dass der Hash-Wert als Passwort des Benutzerkontos abgelegt haben, muss man natürlich bei der Authentifizierung (Log-In) der Anwender nun darauf achten, nur den Hash-Wert zu vergleichen. D.h. das eingegebene Passwort des Anwenders beim Log-in, muss mit dem gleichen Hash-Algorithmus gewandelt werden und erst im nächsten Schritt mit dem abgespeicherten Hash-Wert verglichen. Da es sich bei den beiden Has-Werten lediglich um Zeichenketten handelt, kann man die bekannten Vergleichsoperatoren von PHP nutzen um die beiden Hash-Werte zu überprüfen.
PHP unterstützt noch weitere Hash-Algorithmen wie SHA-1, ripemd160 und weitere. Alle Hash-Funktionen sind in PHP über die Funktion hash() zusammengefasst. D.h. man gibt der Funktion hash() den gewünschten Algotrithmus und die „zu-hashende“ Zeichenkette an und PHP liefert den Hash-Wert zurück:
$hash = hash('md5', $passwort); |
Es gibt keinen Vor- oder Nachteil wenn man die Funktion md5() direkt oder die Funktion hash().
Generell sollte man aber verstehen, dass sich die vorbeschriebene Absicherung von Passwörtern nur dafür eigenet, eine abgespeicherte Informationen gegen eine Benutzereingabe überprüft. Es eigenet sich nicht um die ursprungszeichenkette über den Hash-Wert weiterzuverwenden. Hierfür muss man die Möglichkeit schaffen und das Passwort ggf. verschlüsselt abzulegen. Ein verschlüsseltes Passwort läst sich mit anderen Funktionen wiederum entschlüsseln und kann damit weiterverwendet werden. Überlegt daher bei der Absicherung von Passwörtern, wozu diese in der Anwendung eigentlich verwendet werden soll.
Ein „ge-hashtes“ Passwort läst sich nicht ohne weiteres wiederherstellen. D.h. denkt bei der Auswahl vorallem an die Benutzer der PHP Anwendung. Wenn Passwörter vergessen werden, hat man in der Anwendung keine Chance das Passwort wiederherzustellen. D.h. man muss bei einer solchen Variante sicherlich darüber nachdenken wie Anwender ein neues Passwort erhalten können.
Ein weitere Aspekt ist sicherlich die Sicherheit der Hash-Algorithmen. Ähnlich wie bei Verschlüsselungsalgorithmen, gibt es von offiziellen Stellen Empfehlungen und Einschätzungen der Sicherheit von Algorithmen. Schaut euch das ganze im Netz an und macht euch euere eigenen Gedanken über die Sicherheit der Anwendung.