Phpass besteht im Wesentlichen aus einer kleinen PHP-Klasse, die sich kinderleicht in eigene PHP-Anwendungen einbinden lässt: Zunächst angelt man sich das Archiv von der etwas unübersichtlichen Homepage
[1]
, entpackt es und integriert die Datei
»PasswordHash.php
«
in das eigene Skript:
require('PasswordHash.php');
Als Nächstes instanziiert man die darin ausgelieferte Klasse
»PasswordHash
«
:
$hasher = new PasswordHash(8, FALSE);
Der erste Parameter des Konstruktors gibt an, wie oft Phpass die Hashfunktion aufrufen soll. Der Wert ist eine Potenz von 2, im Beispiel würde Phpass also die Hashfunktion 2^8 und somit 256 Mal hintereinander aufrufen. Der höchstmögliche Wert ist 31. Steht der zweite Parameter auf
»TRUE
«
, nutzt Phpass grundsätzlich immer das alte, wenn auch diesmal gesalzene MD5-Verfahren. Damit sind die Ergebnisse zwar portabel und auf älteren PHP-Installationen lauffähig, im Gegenzug aber auch etwas weniger sicher. Bei einem
»FALSE
«
versucht Phpass hingegen zunächst immer erst Bcrypt heranzuziehen. Web-2.0-Anwendungen, die Phpass nutzen, erlauben häufig, diese beiden Einstellungen entweder in einer Konfigurationsdatei oder direkt in der Administrationsoberfläche zu ändern. Über das Objekt
»$hasher
«
lässt man jetzt das Passwort durchdrehen:
$passwort = "geheim123"; $hashwert = $hasher->HashPassword($passwort);
Der Hashwert in
»$hashwert
«
wandert in die Datenbank. Diese Zeichenkette enthält übrigens nicht nur den eigentlichen Hashwert, sondern auch gleich noch alle Zusatzinformationen, die Phpass später bei der Passwortprüfung benötigt:
$2a$08$zEIaPFIg...
Die beiden Zeichen hinter dem ersten Dollarzeichen verraten die verwendete Hashfunktion. Hier weist
»2a
«
auf Bcrypt hin. Die Zahl nach dem zweiten Dollarzeichen gibt an, wie oft diese Hash-Funktion hintereinander aufgerufen wurde (als Potenz von 2, im Beispiel also 2^8 = 256 mal). Anschließend folgt das Salt, dessen Länge vom Hashverfahren abhängt, bei Bcrypt ist es 16-stellig. Dahinter steht schließlich der eigentliche Hashwert.
Das von
»HashPassword()
«
ausgespuckte Ergebnis ist immer mindestens 20 Zeichen lang. Mit diesem Wissen kann man ganz nebenbei prüfen, ob die Hashfunktion erfolgreich war:
if (strlen($hashwert) < 20) echo "Hashing schlug fehl!";
Wenn sich der Benutzer später erneut am System anmeldet, holt man den in der Datenbank gespeicherten Hashwert, legt ihn in einer Variablen ab, etwa
»$passwortausdb
«
, und startet die Prüfung:
$passwort = "geheim123"; $passwortausdb = holeHashAusDB(); $ergebnis = $hasher->CheckPassword($passwort, $passwortausdb);
Die Funktion
»CheckPassword()
«
liefert
»TRUE
«
zurück, wenn die beiden Hashwerte übereinstimmen und somit das Passwort gültig ist.
Listing 1
zeigt noch einmal ein durchgehendes Beispiel, das sich ohne Datenbank direkt aufrufen lässt. Ein noch ausführlicheres Beispiel liegt dem Phpass-Archiv in der Datei
»test.php
«
bei.
Listing 1
Beispiel für den Einsatz von phpass