Egal, um welchen Dienst es sich dreht, den Benutzern geht es immer zu langsam. Der Schwerpunkt des ADMIN-Magazins 05/2011 verrät, mit welchen Tools man ... (mehr)

Klasse Sache

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!";

Prüfung

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

 

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023