Bei der Benutzerverwaltung sollte man von Anfang an Wert auf eine sichere Verwahrung der Passwörter legen. Natürlich ist zu beachten, Passwörter im Klartext weder in die Datenbank oder in ein Log zu speichern noch per Email zu senden. Bevor das Benutzerpasswort gespeichert wird, kann es etwa mit einem Hash-Algorithmus verschlüsselt werden. Im Gegensatz zum Encodieren können aus Hashwerten die originalen Nachrichten bzw. Passwörter nicht wiederhergestellt werden. Bei der Benutzerauthentifizierung muss also zunächst der Hashwert des übergebenen Passworts erzeugt und dann mit dem Hashwert des Passworts aus der Datenbank verglichen werden. Es stehen verschiedene Hash-Algorithmen zur Verfügung, welche sich z.B. in Hinsicht auf Größe und Sicherheit unterscheiden. Die bekannte Funktion MD5 gilt mittlerweile als unsicher, da es zwei verschiedene Nachrichten m1 und m2 geben kann, für die gilt md5(m1)=md5(m2). Auch wenn dies hinsichtlich Passwörter nicht bedeutet, dass die Hashwerte der Passwörter unsicher sind, kann man auf Alternativen zurückgreifen: etwa SHA256 oder SHA512 (256 Bit bzw. 512 Bit großer Hashwert, im Gegensatz zum 128 Bit großen MD5-Hash).
Beispiel einer PHP-Funktion, welche einen SHA256-Hashwert zurückgibt:
1 | hash_hmac('sha256', $salt . ':' . $password, $appSalt); |
Sicher versalzen
Um die gespeicherten Passwörter noch sicherer zu verwahren, empfiehlt sich das “beimischen” eines zufallsgenerierten Wertes, genannt Salt. Dieser wird dem Passwort angehängt und dann der Hashfunktion übergeben. Für jeden Benutzer sollte ein eigener Salt generiert und neben dem Hashcode des Passworts in der Datenbank gespeichert werden. Das hat den Vorteil, dass vorberechnete Hashtabellen eines Angreifers nutzlos sind, da jedes Passwort mit einem eigenen Salt versehen wurde. Zusätzlich kann noch ein globaler Anwendungs-Schlüssel (Application Salt) beigestreut werden.
Beispielfunktion zum Generieren eines Salts (PHP-Code):
1 2 3 4 5 6 7 8 | function genSalt($saltLen) { $chars64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; $salt = ""; for ($i=0;$i < $saltLen;$i++) { $salt .= substr($chars64, rand()%64, 1); } return $salt; } |
Starke Passwörter
Alle hier aufgeführten Maßnahmen betreffen jedoch nur die Speicherung von Passwörtern. Sicher sind Passwörter nur, wenn der Benutzer selbst ein starkes Passwort eingibt. Um dies zu erreichen können bei der Passworteingabe folgende Regeln definiert werden: Eine Kombination aus Buchstaben, Zahlen und Sonderzeichen sowie eine Mindestlänge des Passworts. Eine Anzeige der Passwortstärke während der Eingabe (etwa mittels Auswertung via Javascript) kann dem Benutzer darüber hinaus helfen, ein sicheres Passwort zu wählen.
Links:
Hashfunktionen