Passwörter unknackbar speichern

Seite 4: Selbsttest

Inhaltsverzeichnis

Wie die eigene Installation eines Content-Management-Systems Passwörter speichert, lässt sich durch eine Quellcode-Analyse feststellen oder durch einen Blick in die Datenbank. Am einfachsten ist letzteres, wozu man sich einfach mit dem Datenbankserver verbindet, beispielsweise so: mysql -u <user> -p. Der Parameter user ist der eingetragene Datenbanknutzer, in dessen Kontext sich das CMS anmeldet. Der Befehl show databases; listet alle verfügbaren Datenbanken auf. Um beispielsweise die Datenbank typo3 auszuwählen, gibt man use typo3; ein (Semikolon am Ende nicht vergessen). Anschließend lässt man sich alle angelegten Tabellen der Datenbank mit show tables; anzeigen.

Unter Typo3 sind insbesondere die Tabellen be_users und fe_users von Interesse. Mit select * from be_users; bekommt man alle Inhalte der Tabelle angezeigt. Steht dort bei den Nutzerpasswörter nur eine Zeichenkette wie 1ee9e0daf4a2b81fe4064aa5ae31aae4, so handelt es sich um einen einfachen MD5-String ohne Salt.

In aktuellen Drupal-Installationen sieht ein in der Datenbank abgelegter Passwort-Hash (Tabelle users) beispielsweise so aus: $S$CbkCbEtqypgcggWPee9c6wpgwUYqKjMb0pUR9YTgdwdYkxztRmWj. Die am Anfang stehenden Dollarzeichen umrahmem die Angabe für den Hash-Typ, daran schließt sich das Salt und der eigentliche Hash an. Der Typ 2a würde bcrypt signalisieren. Bei Wordpress (Tabelle wp_users) findet man Einträge wie $P$Bz0ZwGCmWuvcurZbj4CaptBFir8gQv1 – der Hash-Typ P steht für sogenannte portierbare Hashes – also die MD5-Lösung.

Der unter PHP gemessene Verlangsamungsfaktor der verschiedenen Algorithmen.

Phpass lässt sich auf sehr einfache Weise in eigene PHP-Anwendungen integrieren. Es besteht aus einer einzigen PHP-Datei mit einer Klasse und diversen Methoden. Zwar kann man mit einer modernen PHP-Version auch alle Hash-Algorithmen direkt aufrufen, einer der Vorteile von phpass ist aber, dass man sich nicht selbst um das Erzeugen eines zufälligen Salts und das Zusammenbauen der Zeichenkette kümmern muss. Die zurückgelieferte Hash-Zeichenkette kann man direkt in der Datenbank abspeichern.

Phpass erzeugt das Salt auf Unix-Systemen durch Auslesen von /dev/urandom und unter Windows mit der PHP-Funktione microtime(). Für das Erzeugen eines sicheren Passwort-Hashes genügen zwei Zeilen:

$t_hasher = new PasswordHash(8, FALSE);
$hash = $t_hasher->HashPassword($password);

Der Parameter FALSE im Konstruktor signalisiert phpass, den sichersten Algorithmus zuerst zu wählen -- auf modernen Systemen normalerweise bcrypt. Durch Übergabe von TRUE erzwingt man den Einsatz der unsicheren, dafür aber kompatibleren MD5-Implementierung; so macht es beispielsweise WordPress. Der Konstruktor erzeugt zudem das Salt. Der Parameter**8 signalisiert bei bcrypt den Exponenten für die Zahl der gewünschten Iterationen, womit man bei bcrypt auf 256 Runden kommt. Der maximale Exponent ist 31.

Die Methode HashPassword erzeugt dann aus dem Passwort und dem Salt den Hash. Die Prüfung eines eingegebenen Passworts ist ähnlich simpel:

$check = $t_hasher->CheckPassword($password, $hash);

Die Variable $check enthält das Ergebnis des Vergleichs, also 1 für wahr.

Administratoren sollten sich nicht auf die Standardeinstellungen ihrer Systeme verlassen, sondern die sichersten Methoden einsetzen -- und dies seinen Anwender mitteilen. Als Nutzer eines Forums oder eines Online-Shops hat man jedoch keinen Einfluss darauf, ob der Anbieter eine sichere Methode benutzt. Schlimmer noch: Man kann nicht mal abschätzen, womit er die Passwörter überhaupt verschlüsselt. Für den Anwender liegt der beste Schutz deshalb in der Wahl verschiedener Passwörter. Das Autoren-Kennwort für das Typo3-CMS sollte nicht das gleiche wie für das PayPal-Konto sein. Grundsätzlich gilt: Länge ist Trumpf – sofern das Wort in keinem Wörterbuch steht. Dabei dürfen die Passwörter für nicht ganz so wichtige Konto ruhig etwas kürzer sein als die für Bezahldienstleister. (dab) (dab)