Partner & Ads


media-products.de Partner-Banner
matpo.de Partner-Banner

Flattr this

Codeschnipsel

Zurück zur Übersicht

Passwörter immer als Hash speichern

Fragen oder Anmerkungen zum diesem Codeschnipsel?
Im zugehörigen Diskussionsthema im Support-Forum wird Ihnen weitergeholfen!

Wenn man eine Anwendung programmiert in der von Benutzern Passwörter gespeichert werden sollen (zum Beispiel in einer Datenbank), so ist immer darauf zu achten, dass diese Passwörter NIE im Klartext in der Datenbank oder an irgendeiner anderen Stelle gespeichert werden.

Warum?
Damit weder ihr selbst noch potentielle Eindringlinge in die Datenbank direkt an die Passwörter der Benutzer gelangen können. Viele Nutzer verwenden auf unterschiedlichen Internetseiten immer die gleichen Passwörter. Wird bei euch ein Passwort entwendet kann damit auch an anderer Stelle großer Schaden entstehen.
Deshalb: Egal um was für eine Anwendung es sich handelt und wie verbreitet sie ist: Passwörter sollten prinzipiell in keinem Fall als Klartext in der Datenbank gespeichert werden.
Denn: Gegen Einbruch ist niemand gefeit - wie man momentan auch bei einigen Branchengrößen (Yahoo, LastFM, etc.) sieht.
Aktuellster Fall: Passwort-Diebstahl von unverschlüsselten Passwörtern bei Mister Spex.
Diesbezüglich auch ein interessanter englischer Artikel zum Thema Online-Sicherheit bei vermeintlich sicheren Internetseiten:
Lessons in website security anti-patterns by Tesco

Deshalb: Hash-Werte speichern

Wenn die Passwörter also nicht im Klartext abgelegt werden sollen - wie dann? Und wie kann dann die Login-Eingabe eines Benutzers verglichen werden?

Ganz einfach: Wir speichern in der Datenbank nur den Hash-Wert eines Passworts. Ein Hash ist dabei eine berechnete, eindeutige Repräsentation, die keinen Rückschluss auf den ursprünglichen Text bzw. in diesem Fall auf das Passwort ermöglicht.
Es ist ebenfalls nicht möglich einen Hash zu "entschlüsseln". Hash-Funktionen arbeiten immer nur in eine Richtung.

Es bietet sich in PHP zum Beispiel an ein eingegebenes Passwort mit der sha1()-Funktion zu hashen:

<?PHP
$passwort = "Test-Passwort";
$pw_hash = sha1($passwort);
?>

Wie mit dem Hash-Generator auf dieser Seite selber getestet werden kann, entspricht der Hash-Wert der Eingabe "Test-Passwort" folgendem String:

83698cdc1ef286db917bf0015e397ce00ccdd1ba

Diesen Wert könnten wir nun bereits in der Datenbank speichern.
Um bei einem Login-Formular dann den Wert aus der Datenbank mit der Passwort-Eingabe des Benutzers zu vergleichen, verwenden wir einfach folgenden Code:

<?PHP
// Passwort-Hash aus Datenbank: $pw_hash
// User-Eingabe: $_POST['passwort']
// Login-Abfrage:
if($pw_hash == sha1($_POST['passwort'])){
    // Login success
    }
else {
    // Login falied
    }
?>

Aber auch das wäre noch nicht wirklich sicher. Wie bereits vorher kurz erwähnt, existieren sog. Rainbow Tables. Vereinfacht gesagt handelt es sich dabei um große Tabellen, die zu vielen einfachen Passwörtern bereits den entsprechend berechneten Hash-Wert aufweisen.
Bei so einem einfachen Wort wie "Test-Passwort", dass aus zwei Worten besteht, die in einem Wörterbuch vorkommen, ist die Chance sehr groß, dass der Hash-Wert bereits in einer entsprechenden Tabelle steht.

Erbeutet nun jemand den gerade eben ermittelten Hash 83698cdc1ef286db917bf0015e397ce00ccdd1ba, bringt ein einfaches Nachschlagen in einer entsprechenden Tabelle bereits das korrekte Passwort hervor.

Wie können wir uns dagegen besser schützen?
Zwei Möglichkeiten, die kombiniert angewendet werden können, möchte ich kurz zeigen. Zum Einen wenden wir die Hash-Funktion auf das ursprünglich eingegebene Passwort nicht nur 1x an, sondern z.B. 50 mal.
Zum Anderen verwenden wir zusätzlich zum vom Benutzer eingegebenen Passwort einen sog. Salt. Dabei handelt es sich um einen beliebig langen String, der nur der eigenen Anwendung bekannt ist und sich nicht ändert. Dieser String wird zusammen mit dem Passwort verschlüsselt und führt dazu, dass Angriffe mit Rainbow Tables quasi ins Leere laufen. Eine PHP-Funktion die beide Varianten vereint könnte z.B. so aussehen:

<?PHP
function pwhash($password){
// Zufälliger String, der sich für die Anwendung nicht ändern darf und der nicht veröffentlicht wird.
$salt = "aflsdfuasdf6aj9sdf7845guchbausdh67fg57";

// mehrmaliges Anwenden der Hash-Funktion
for($i=0;$i<=50;$i++){
	$password = sha1($password.$salt);
	}
return sha1($password.$salt);
}
?>

Rainbow_Table
Die Rainbow Table (zu Deutsch: Regenbogentabelle) ist eine von Philippe Oechslin entwickelte Datenstruktur, die eine schnelle, probabilistische Suche nach einem Element des Urbilds (i. d. R. ein Passwort) eines gegebenen Hashwerts ermöglicht. Der sogenannte Time-Memory-Tradeoff gestattet die Suche nach fast allen Klartexten eines bestimmten Zeichenraums innerhalb einer erheblich kürzeren Zeit, als diesen komplett zu bruteforcen und ohne alle für diesen Zeichenraum möglichen Hashwerte speichern zu müssen.
Dieses funktioniert bei Hashfunktionen ohne Salt, wie es z. B. bei den Passwörtern für die Windows-Familie oder vielen Routern der Fall ist. Vergleichsweise umfangreiche Tabellen wurden für LM Hashes und MD5 berechnet und stehen aus diversen Quellen zur Verfügung.
Verwendung finden Rainbow Tables bei der Wiederherstellung von Passwörtern, innerhalb der IT-Forensik, bei Penetrationstests und beim Passwortcracken.

Dies ist ein Auszug aus dem Artikel Rainbow_Table aus der freien Enzyklopädie Wikipedia und steht unter der GNU-Lizenz für freie Dokumentation. In der Wikipedia ist eine Liste der Autoren verfügbar.

Hashfunktion
Eine Hashfunktion oder Streuwertfunktion ist eine Abbildung, die zu jeder Eingabe aus einer oft sehr großen Quellmenge eine Ausgabe aus einer kleineren Zielmenge erzeugt, den sogenannten Hashcode (oder Hashwert).
Ein Hashwert wird [...] auch als Fingerprint bezeichnet, da er eine nahezu eindeutige Kennzeichnung einer größeren Datenmenge darstellt, so wie ein Fingerabdruck einen Menschen nahezu eindeutig identifiziert.
Hashfunktionen werden vor allem in Hashtabellen, der Datenverarbeitung und der Kryptologie verwendet.

Dies ist ein Auszug aus dem Artikel Hashfunktion aus der freien Enzyklopädie Wikipedia und steht unter der GNU-Lizenz für freie Dokumentation. In der Wikipedia ist eine Liste der Autoren verfügbar.

Zurück zur Übersicht

Zum Diskussionsthema

Dieser Beitrag ist unter der Creative Commons Namensnennung 3.0 Deutschland lizensiert.
Bearbeitung, Nutzung & Verbreitung ist ausdrücklich gestattet.