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.
Alle Angebote zum ADMIN-Magazin im Online-Shop
Versandartikel |
Onlineartikel |




