Diesen Artikel als PDF kaufen Weitere ADMIN-Magazin Angebote

Passwortsicherheit in Webanwendungen mit Phpass

Nützlicher Fleischwolf

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

01 <?php
02 require_once('PasswordHash.php'); // phpass hinzuholen
03
04 // neues PasswordHash-Objekt anlegen:
05 $hasher = new PasswordHash(8, FALSE);
06
07 // Passwort hashen:
08 $passwort = "test12345"; // Passwort, holt man in einer echten Web-Anwendung aus einem vom Benutzer ausgefüllten Formular
09 $hashwert = $hasher->HashPassword($passwort);
10
11 echo "Passwort: " . $passwort . "\n<br>";
12 echo "Hash: " . $hashwert . "\n<br>";
13
14 // $passwort mit gespeichertem Hash vergleichen:
15 $passwortausdb = '$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0'; // gespeicherter Hash, liegt in echter Web-Anwendung in der Datenbank
16 $ergebnis = $hasher->CheckPassword($passwort, $passwortausdb);
17
18 if ($ergebnis) {
19         echo "Passwort stimmt!";
20 }
21 else {
22         echo "Passwort falsch!";
23 }
24
25 ?>

Diesen Artikel als PDF kaufen

Als digitalen Artikel

Diesen Artikel als PDF kaufen.

Preis € 1,99



Im ADMIN Online-Archiv

Abonnieren Sie das ADMIN Online-Archiv, und Sie erhalten Zugriff auf alle ADMIN-Artikel im HTML- und/oder PDF-Format.

Kommentare

Suche

ADMIN auf Twitter, Facebook, Xing

Auf Twitter folgen   

Unsere Partner:

hackerboard.deUnixboard