Wenn man sich nun die Frage stellt, wie man einen Hash als Passwort-"Verschlüsselung" denn verwenden kann:
1. Benutzer erstellt ein Konto, vergibt einen Benutzername und ein Passwort (tippt es als Klartext - also unverschlüsselt - in ein Passwort-Feld ein)
2. Das Klartext-Passwort wird (hoffentlich über einen sicheren Kanal wie https übertragen) am Server mittels Hash-Funktion in eine Zeichenkette verwandelt, die (idealerweise) nicht mehr rückgängig gemacht werden kann.
3. Das ge-hashte Passwort kann nun in einem Datenspeicher wie einer Datei oder Datenbank abgelegt werden.
4. Benutzer möchte einen Login vollziehen, dazu wird das Prozedere derart wiederholt, wie in 1 und 2 beschrieben.
5. Das beim Login eingegebene Passwort wird - wenn es das gleiche wie bei der Erstellung des Benutzerkontos ist - den gleichen Hash generieren.
6. Die beiden Hashes (gespeicherter und beim Login eingegebener) werden vergleichen und müssen identisch sein.
Noch besser als Hashing ist Hashing + Salt, also ein Verfahren, das es Brute-Force-Angreifern so gut wie unmöglich macht, ein Passwort in seine Klartext-Version zu "verwandeln", also durch Ausprobieren sämtlicher Möglichkeiten.
Was hat das Salten (salzen) für einen Hintergrund?
Es gibt sog. Rainbow-Tables, also riesengroße Dateien, in denen quasi für einen bestimmten Hash-Algorithmus sehr viele für eine bestimmte Klasse von Passworten (z.B. alles mit Buchstaben und Zahlen für eine Länge von 4 bis 8 Zeichen) vorberechnet werden. Anschließend kann man diese Rainbow-Table nach dem Hash durchforsten und möglicherweise findet man sogar ein Passwort darüber heraus - je nach dem wie sicher ein Passwort (Klein-/Großbuchstaben+Zahlen+Sonderzeichen) vergeben wurde.
Mit dem Salt wird dem Hash eine zusätzliche zufällige Komponente hinzugefügt, die beim Login einfach weg-gerechnet wird und kein großer Rechenaufwand ist. Der Salt macht die Rainbow-Tables jedoch sinnlos, denn man kann nicht für alle existierenden zufälligen Komponenten ein Salt für alle möglichen Kombinationen von Passworten speichern, das übersteigt einfach die Möglichkeiten der Persistenz (Hexa-Byte sind da Peanuts dagegen).
Für ein gut gesichertes Passwort gibt es also mehrere Möglichkeiten:
1. Gute Passworte forcieren, sprich Klein-/Großbuchstaben+Zahlen+Sonderzeichen als Voraussetzung beim Erstellen des Accounts
2. Salzen von Hashes
3. Security-by-obscurity (Ablegen von Passworten an Orten wo es ein Angreifer nicht erwartet)
Natürlich kann man die verschiedenen Tipps auch kombinieren ;-)
Bei Gelegenheit werde ich mal eine Klasse vorstellen, die ich für das Erstellen von gesalzenen Hashes geschrieben habe.