Zum Inhalt springen

Salted Hash

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 9. Juni 2004 um 00:37 Uhr durch AlexR (Diskussion | Beiträge) (wikified; Computer-Menschen sollten vielleicht nochmal drüberschauen). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Salted Hash ist eine Verschlüsselungsmöglichkeit für Computer-Passwörter.

Passwörter als Salted Hash speichern

Einleitung

Will man Passwörter speichern, so sollte man diese vor unerlaubtem Zugriff schützen. Bei einem Projekt, welches Benutzerdaten in einer Datenbank speichert, sollte man sich überlegen wie man dies bewerkstelligt. Verschlüsselungsverfahren gibt es ja viele. Man muß daher abwiegen welches Verfahren von den vielen zur Anwendung kommen soll. Stellen wir uns einen konkreten Fall vor. Unsere Aufgabe ist es Benutzerdaten zu speichern, welche einen Benutzernamen und ein zugehöriges Passwort enthalten. Da man nie sichergehen kann, daß die Datenbank vor unerlaubtem Zugriff geschützt bleibt, speichern wir die Passwörter nicht im Klartext ab. Das Passwort soll also mit einem Algorithmus verschlüsselt werden. In unserem Fall bietet sich ein Hash-Algorithmus an, wie zum Beispiel MD5, SHA1.

Hashen? Salten?

Ein Hash (auch bekannt als Message Digest) ist eine mathematische Funktion, die einen Eingabewert - in unserem Fall das Passwort - in eine einzigartige Zeichenkette konvertiert. Mit "einzigartig" ist gemeint, daß zwei unterschiedliche Eingabewerte nie den gleichen Hash produzieren. Wenn man nur den Hash kennt, ist es unmöglich mit Hilfe einer Umkehrfunktion auf den ursprünglichen Wert zurückzugelangen.

Jetzt haben wir aber das Problem, daß unser gehashtes Passwort zwar auf den ersten Blick zum Einloggen unbrauchbar, aber somit eindeutig geworden ist. Dies öffnet Dictionary Attacken eine Chance mit Hilfe von unfangreichen Wörterbüchern auf unseren Hash beziehungsweise das Passwort zu kommen. Diese "Wörterbücher" enthalten eine Vielzahl von gängigen Passwortmöglichkeiten von denen dem Angreifer der Hash bekannt ist. Je nach verwendetem Algorithmus kann man jetzt die Hashes miteinander vergleichen. Das kann je nach enthaltener Wortanzahl lange dauern, aber die Möglichkeit ist nicht ausgeschlossen.

Das Salten des Hashes

Abhilfe ist hier das Salten des zuvor generierten Hashes. Der "Salt" ist ein möglichst statistisch zufällig generierte Abfolge von Daten, das heißt die Abfolge der Zeichen sollte unvorhersehbar sein und zusätzlich einzigartig sein. Das Generieren eines Salts kann in Einbezug dieser Randbedingungen auf viele Arten geschehen. Eine einfache Möglichkeit die diese Kriterien erfüllt, ist das Generieren eines GUID (Global Unique Identifier). Ein GUID ist ein 128-bit Wert der sich aus Hardwareinformationen, der aktuellen Uhrzeit und Datum und einer Sequenz von Zahlen zusammensetzt. Aufgrund dessen kann man garantieren, daß ein GUID nie zweimal vorkommen kann.

"Einfach" ist die Erstellung deshalb, weil die meisten Betriebsysteme einen GUID in Form eines API-Calls (Application Programming Interface) zur Verfügung stellen oder weil die Erstellung in manchen Sprachframeworks (SDKs, Software Development Kit) als Methodenaufruf enthalten ist.

Was ist für ein Programm zu implementieren?

Was müssen wir also tun um ein Passwort als gesalteten Hash abzuspeichern? Zuerst wählt man den Hash-Algorithmus. Nehmen wir zum Beispiel den SHA1 (Secure Hash Algorithm), den es fertig implementiert entweder als Programmbibliothek zum Downloaden gibt oder in einem Sprachframework (zum Beispiel Java SDK) enthalten ist. Gehen wir nun die Erstellung des Hashes wie man sie in einer Applikation implementieren würde etwas detaillierter durch.

Nehmen wir an, wir verwenden ein Framework (zum Beispiel Java) welches uns bereits den Hash-Algorithmus zur Verfügung stellt. Das geht natürlich auch in jeder anderen Programmiersprache und wenn das Sprachframework nicht zur Verfügung stellt kann man sich die Programmbibliothek oder den Algorithmus von der jeweiligen Webseite downloaden.

Zuerst erstellen wir eine Instanz des Objektes für den Hash, welches uns unter anderem eine Methode zur Verfügung stellt, die es ermöglicht den jeweiligen Hash zu erzeugen. Nachdem der Benutzer sein neues Passwort eingegeben hat, übergeben wir es der Methode die uns den Hash erzeugt. Diesen Hash können wir in einer Variable vom Datentyp String abspeichern. Da wir jetzt einen Hash von dem Passwort erzeugt haben müssen wir ihn noch salten. Wie vorher erwähnt können wir uns das Salten einfach machen indem wir eine GUID verwenden. Da die Erzeugung von GUIDs standardisiert ist, erstellen wir die GUID entweder durch einen API Call oder wenn es das Sprachframework zur Verfügung stellt rufen wir die Methode auf die uns eine GUID erstellt. Die von der Methode zurück gelieferte GUID speichern wir wie den Hash des Benutzerpasswortes in einer String-Variablen ab.

Nun haben wir den Hash des Passwortes und die GUID - Was wir jetzt nur noch zu tun brauchen ist den GUID an den String des Passwortes anzuhängen und den zusammengesetzten String nochmals zu Hashen. Dadurch erhalten wir einen neuen Hash der durch Zusammensetzung mit der GUID nicht in einer Passworttabelle zu finden ist, da ja der GUID in seiner Form einzigartig ist. Nun kann man den gesalteten Hash in einer Datenbank ablegen. Beim Einlogvorgang werden jetzt nur mehr die Hashes verglichen, das heißt das vom Benutzer im Loginformular eingegebene Passwort wird wieder als gesalteter Hash erstellt und mit dem Hashwert in der Datenbank verglichen. Da man nur mehr Hashes vergleicht eignet sich die Methode auch hervorragend für Webapplikationen da nur ein Hash, mit dem ein Angreifer nichts anfangen kann, an den Server geschickt werden muß.

Zu beachten ist, daß wie eingangs erwähnt das Hashen nicht umkehrbar ist, das heißt sollte der Benutzer sein Passwort vergessen haben muß man ihm ein neues erstellen lassen nach dem er sich beim System authentifiziert hat.

Resümee

Zusammenfassend kann man sagen, daß die Methode Passwörter als gesalteten Hash zu speichen einfach und nahezu sicher ist. Die Hash-Algorithmen werden entweder in einem Sprachframework zur Verfügung gestellt oder man findet sie im Web.

Links: