Passwort-Hashing

Mit Hilfe von Passwort-Hashing ist es nicht mehr nötigt, die Passwörter von Nutzern im Klartext in einer Datenbank zu speichern. Ist die Hashing-Funktion schlecht umzukehren, kann auf diese Art und Weise eine zusätzliche Sicherheit erworben werden, so dass in dem Moment, wo die Datenbank gestohlen wird, trotzdem sich ein Angreifer mit den beinhaltenden Passwörtern nicht einloggen kann, da diese gehasht sind.

Mit der Funktion md5() wird ein MD5-Hash eines Strings berechnet. Dies ist ein 32-Zeichen langer String. Mit der Funktion sha1() kann ein SHA1-Hash berechnet werden. Ein Passwort kann mit diesen Funktionen gehasht in die Datenbank abgelegt werden. Wird eine Prüfung des Passwortes benötigt, so ist das zu prüfende Passwort ebenso mit der Hash-Funktion zu verarbeiten. Stimmen beide Ergebnisse überein, so wurde das korrekte Kennwort übermittelt. Beide Funktionen sind nicht mit normalen Mitteln umkehrbar. Es kann allerdings eine Brute-Force-Attacke durchgeführt werden, so dass diese Algorithmen dennoch als unsicher eingestuft werden.

crypt() stellt eine weitere Hashing-Funktion zur Verfügung. Um einen sehr schwer zu knackenden Hash zu erstellen, kann der Funktion als zweiter Parameter ein sogenanntes ,,Salt“ übergeben werden. Dieses ,,Salt“ befindet sich im Quelltext der PHP-Applikation. Ein Angreifer muss, um eine Chance zu haben, die Hashes zu knacken, sowohl Datenbank wie auch den PHP-Code mit dem ,,Salt“ stehlen.

Die Password-Hashing-API baut auf die crypt()-Funktion auf. Mit Hilfe der Funktion password_hash() wird ein übergebenes Passwort gehasht. Das zu hashende Passwort wird als erster Parameter übergeben. Der zweite Parameter ist der zu nutzende Algorithmus. Zur Zeit wird mit PASSWORD_DEFAULT der bcrypt-Algorithmus verwendet und mit PASSWORD_BCRYPT ein Blowfish-Algorithmus, der mit crypt() kompatibel ist. Es sei darauf hingewiesen, dass sich der Algorithmus hinter PASSWORD_DEFAULT in zukünftigen PHP-Versionen ändern kann. Aus diesem Grunde sollte man auch in der Datenbank genügend Platz zur Speicherung des gehashten Passwortes reservieren. Empfohlen werden 255 Zeichen. Der Funktion kann als letzter ein optionaler Parameter mit Optionen übergeben werden. Die Optionen stellen sich als ein Array mit den Schlüssel salt, welchen das ,,Salt“ darstellt und cost, welchen die Kosten, die für die Verschlüsselung aufgewandt werden sollen, beinhaltet. Der genutzte Algorithmus wird diese Anzahl an Schleifen durchlaufen werden. Mit jeder zusätzlichen Schleife steigt die Sicherheit.

Mit der Funktion password_get_info() ist es möglich, Informationen über ein gehashtes Passwort abzufragen. Zurückgegeben wird ein Array mit den Informationen.

Diese Funktion wird jedoch normalerweise nicht benötigt, denn mit der Funktion password_needs_rehash() ist es möglich, zu prüfen, ob ein schon gegebener Hash neu gehasht werden muss. Von Zeit zu Zeit kann es Sinn machen, die Sicherheit des Systems durch stärkeres Hashing auf diese Weise zu erhöhen. Übergeben wird der Funktion als erster Parameter der alte Hash und die neue Algorithmuskonstante PASSWORD_DEFAULT oder PASSWORD_BCRYPT als zweiter Parameter. Der dritte optionale Parameter stellen wieder die Optionen in einem Array dar.

Durch die Funktion password_verify() kann schließlich ein neu eingegebenes Passwort verifiziert werden. Den ersten Parameter stellt das zu prüfende Passwort da. Der zweite Parameter den Hash aus der Datenbank. Die Funktion stellt selbständig fest, welchen Algorithmus sie zur Prüfung des Passwortes verwenden soll. Sie gibt ein true zurück, wenn die Verifizierung erfolgreich war, das heißt, das Passwort korrekt war und ein false, wenn der Benutzer das falsche Kennwort eingegeben hat.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert