Das nigelnagelneue, hochpolierte Content-Management-System wartet nur darauf, von zahlreichen Nutzern mit Inhalten gefüttert zu werden. Damit die keinen Schabernack treiben, müssen sie sich vorher mit einem Passwort authentifizieren. Dessen Überprüfung scheint zunächst trivial: Die Web-Anwendung sucht in ihrer Datenbank das zum Benutzer gehörige Passwort und vergleicht es mit dem eingegebenen. Dazu müsste sie jedoch die Passwörter im Klartext in der Datenbank ablegen – während dem sicherheitsbewussten Entwickler bei diesem Gedanken die Haare zu Berge stehen, knallen bei den Angreifern die Sektkorken.
Man könnte jetzt selbst geeignete Sicherheitsmaßnahmen ergreifen – oder besser gleich zu fertigen Softwarekomponenten von Sicherheitsprofis greifen. Eine solche Lösung ist das Passwort Hashing Framework, kurz Phpass [1]. Es verschlüsselt Passwörter knacksicher und kommt in bekannten Webanwendungen wie dem Content-Management-System Drupal oder der Blog-Software Wordpress zum Einsatz – dort teilweise allerdings mit einigen Einschränkungen (dazu später mehr). Bevor man Phpass mit wenigen Handgriffen in die eigene Anwendung integrieren kann, ist ein kurzer Blick auf seine Arbeitsweise notwendig.
Phpass steckt jedes übergebene Passwort in eine spezielle mathematische Funktion. Wie ein Fleischwolf macht sie aus dem Passwort ein Pfund gehackte Zeichenkette. Die Funktion ist so aufgebaut, dass sie für ein Passwort immer das gleiche Ergebnis liefert, aus dem sich nur mit großem Aufwand das originale Passwort rekonstruieren lässt. Eine solche Funktion bezeichnet man als Hash-Funktion, die chaotische Ausgabe als Hash-Wert (oder auch Fingerabdruck des Passworts).
Die Webanwendung muss jetzt nur noch diesen unleserlichen Hashwert in der Datenbank speichern (Abbildung 1). Sobald sich ein Benutzer später mit seinem Passwort anmeldet, berechnet Phpass aus der Zeichenkette erneut den Hashwert und vergleicht ihn mit dem in der Datenbank hinterlegten.
Nach diesem Prinzip arbeiten schon länger alle großen Web-Anwendungen. Wie das Content-Management-System Joomla benutzen sie als Hash-Funktion allerdings durchweg den Message Digest Algorithm 5, kurz MD5. Er ist sogar praktischerweise in jeder PHP-Umgebung mit einer eigenen Funktion vertreten:
$hashwert = md5($passwort);
MD5 wurde jedoch von seinen Erfindern für eine schnelle Verarbeitung optimiert. Mit genügend großer Rechenkraft und ein paar Tricks lassen sich mittlerweile aus den von ihr berechneten Hash-Werten die Passwörter herausfinden. Moderne Mehrkernprozessoren oder Grafikchips (Stichwort GPGPU) rechnen für ein Passwort mehrere Millionen MD5-Hashes pro Sekunde durch und vergleichen sie mit dem gespeicherten Hash. Dank Clouds und billigen Terabyte-Platten kann man sogar einfach für jedes mögliche Passwort vorab den zugehörigen Hashwert berechnen und in einer langen Tabelle ablegen (sogenannte Rainbow Tables). Wie in einem Telefonbuch muss man dann nur nachschlagen, welcher Hashwert zu welchem Passwort gehört.
Glücklicherweise bietet die PHP-Umgebung über die etwas umständlich zu nutzende Funktion »crypt()
«
noch weitere, bessere Hashfunktionen an [2]. Welche dabei tatsächlich zur Verfügung stehen, hängt von der PHP-Version und dem Betriebssystem ab. Phpass fährt deshalb notgedrungen eine mehrstufige Strategie: Zunächst versucht es den wesentlich sichereren Bcrypt-Algorithmus zu verwenden, der wiederum auf dem Blowfish-Verfahren basiert [3].
Sollte Bcrypt nicht greifbar sein, zieht Phpass das Extended-DES-Verfahren heran. Kann es auch dies nicht nutzen, fällt es als Notlösung auf MD5 mit ein paar eigenen Sicherheitserweiterungen zurück. Der Phpass-Entwickler hat Blowfish und Extended-DES bewusst zu seinen Favoriten gekürt, da sie in den meisten Systemen besonders effizient in C implementiert sind.