Warum Passwort-Hashes brechen

Eine Wand voller Archivschubladen mit einer offenen Schublade, in der zwei zueinander passende Karten liegen.

Du liest es regelmäßig: „Datenbank von Website X gestohlen, Millionen Passwörter geleakt“. Aber eine gute Seite speichert dein Passwort gar nicht — nur seinen Hash. Und aus einem Hash kannst du das Passwort nicht zurückrechnen, das weißt du seit dem letzten Kapitel. Also… gibt es überhaupt ein Problem? Ja. Und in diesem Kapitel spielst du den Hacker, um zu sehen, warum.

Wörter, die du gleich brauchst

Datenbank
Die große Tabelle, in der eine Website alle ihre Nutzer speichert: Name, E-Mail-Adresse und (wenn es richtig gemacht ist) den Hash des Passworts.
Nachschlagetabelle (oder „Regenbogentabelle“)
Eine Liste, die jemand im Voraus angelegt hat: links Milliarden häufig benutzter Passwörter, rechts ihr Hash. Wer einen Hash vorfindet, sucht ihn rechts und liest links das Passwort ab. Kein Rechnen, nur Nachschlagen.
Salt
Wörtlich „Salz“: ein zufälliges Stück Text, das die Website an dein Passwort klebt, bevor sie es hasht. Für jeden Nutzer ein anderes. Es ist nicht geheim — es steht einfach neben dem Hash — aber es macht jede Nachschlagetabelle wertlos.
PBKDF2
Eine Hashfunktion, die mit Absicht langsam ist: sie wiederholt die Rechnerei hunderttausende Male. Für dich eine halbe Sekunde beim Anmelden. Für einen Hacker, der Milliarden Passwörter durchprobieren will, eine Mauer.

Wie ein „unknackbarer“ Hash doch geknackt wird

Der Hacker rechnet nicht zurück. Er rechnet vorwärts. Er nimmt eine Liste der Milliarde meistbenutzten Passwörter — 123456, azerty, willkommen, die Namen sämtlicher Fußballvereine — und berechnet von jedem den Hash. Das dauert eine Weile, aber er muss es nur ein einziges Mal tun. Danach vergleicht er die gestohlenen Hashes mit seiner Liste. Jeder Hash, der übereinstimmt, ist ein geknacktes Passwort. Keine Mathematik, nur Geduld und eine große Festplatte.

Spiel den Hacker

Alles passiert in deinem Browser. Es wird nichts an den Server geschickt. Tipp hier trotzdem nie ein Passwort ein, das du wirklich benutzt — das ist eine gute Gewohnheit.

  1. Klick Hashen und nachschlagen. Die Demo hasht dein Passwort und sucht den Hash in einer kleinen Tabelle mit ein paar Dutzend häufig benutzten Passwörtern. Gefunden? Dann bist du „geknackt“.
  2. Probier azerty, fussball, arzt. Und dann etwas, das du dir selbst ausdenkst.
  3. Klick Gleiches Passwort, mit Salt. Dasselbe Passwort, zweimal gehasht — und trotzdem zwei völlig verschiedene Hashes. Schlag sie nach: nichts.
  4. Klick Mit PBKDF2 (langsam) und schau auf die Zeit. Rechne mit, was das für jemanden bedeutet, der zehn Millionen Mal probieren muss.

Salt: jeder bekommt sein eigenes Problem

Ein Hash ist einfach eine Funktion, und die kannst du aufschreiben wie jede andere. Nenn dein Passwort x und den Hash y:

y = SHA256(x)

Und genau da steckt das Problem drin. Dasselbe x ergibt immer dasselbe y — das ist die erste Regel aus Kapitel 2. Jeder auf der Welt, der willkommen wählt, steht also mit exakt denselben 64 Zeichen in der Datenbank:

NutzerPasswortHash in der Datenbank
Samwillkommen6cece6c1ea57…
Noorwillkommen6cece6c1ea57…
Juleswillkommen6cece6c1ea57…

Dreimal dieselbe Zeile. Der Hacker schlägt 6cece6c1ea57… ein einziges Mal in seiner Tabelle nach und hat alle drei auf einmal. Bei zehn Millionen Konten funktioniert das genauso gut.

Was Salt daran ändert

Salt löst das, indem es eine Sache vor das Passwort klebt:

y = SHA256(salt + x)

Genau so, wie du es selbst aufschreiben würdest. Pass aber beim + auf: das heißt hier nicht addieren, sondern aneinanderkleben. Salt und Passwort werden ein langer Text, und darüber läuft der Hash. Ein Salt a3f9c2e1… mit dem Passwort willkommen hasht also den Text a3f9c2e1…willkommen.

Jeder Nutzer bekommt ein anderes Salt, das die Website in dem Moment zufällig zieht, in dem du dich registrierst. Gleiche Tabelle, gleiches Passwort:

NutzerSaltWas gehasht wirdHash in der Datenbank
Sama3f9c2e1…a3f9c2e1…willkommend59f2c847043…
Noor7c21e04a…7c21e04a…willkommen7b031d38f117…
Julesf40d8b37…f40d8b37…willkommen2c93620838b6…

Dreimal dasselbe Passwort, drei Hashes, die nichts miteinander zu tun haben. Das ist der Lawineneffekt aus Kapitel 2: die Eingabe unterscheidet sich, also unterscheidet sich die Ausgabe vollständig. An der Datenbank kannst du nicht mehr sehen, wer dasselbe Passwort hat.

Aber das Salt steht doch einfach daneben

Das Salt steht in einer eigenen Spalte, lesbar, in derselben Datenbank, die gestohlen wurde. Der Hacker hat es also. Und trotzdem funktioniert es.

Seine fertige Tabelle enthält die Hashes von SHA256(x). Was er braucht, sind die Hashes von SHA256(a3f9c2e1… + x). Das sind völlig andere Zahlen. Seine Tabelle ist mit einem Schlag wertlos: er muss sie komplett neu berechnen — eine Milliarde Passwörter × ein Hash — und dann hat er nur Sam. Für Noor darf er wieder bei null anfangen, denn ihr Salt ist anders. Und für Jules noch einmal.

Das ist es, was Salt macht. Es macht dein Passwort kein bisschen stärker. Es macht aus einem großen Auftrag — zehn Millionen Konten knacken — zehn Millionen einzelne Aufträge. Klick in der Demo oben auf Gleiches Passwort, mit Salt und du siehst es zweimal mit echten Zahlen passieren.

Langsamkeit: die einzige Waffe, die wirklich zählt

SHA-256 ist rasend schnell — eine gute Grafikkarte schafft Milliarden Hashes pro Sekunde. Das ist praktisch für Dateien und katastrophal für Passwörter. Darum benutzen gute Seiten eine Funktion, die mit Absicht langsam ist. Klick in der Demo auf PBKDF2 und achte auf die Zeit. Ein paar hundert Millisekunden spürst du beim Anmelden kaum. Aber beim Hacker multipliziert sich jeder Versuch mit dieser Zahl — und er hat Milliarden davon.

Was das für dich bedeutet

Für den Fall, dass du später selbst eine Website baust: schreib das niemals selbst. Jede Programmiersprache hat eine eingebaute Funktion, die Salt und Langsamkeit richtig regelt (in PHP heißt sie password_hash()). Selbst etwas mit einem Hash und einem Salt zusammenzubasteln ist der klassische Anfängerfehler — und der Grund hinter der Hälfte der Leaks in den Nachrichten.

Das ist Mathematik: wie groß ist groß?

Ein Passwort aus 8 Kleinbuchstaben hat 268 ≈ 200 Milliarden Möglichkeiten. Klingt nach viel — eine Grafikkarte ist in einer Minute durch. Vier zufällige Wörter aus einem Wörterbuch mit 5000 Wörtern: 50004 = 625 Billionen, und das noch ohne Großbuchstaben oder Ziffern. Das ist der Unterschied zwischen Potenzieren mit einer großen Basis und mit einem großen Exponenten. Wer dieses Gefühl für große Zahlen hat, entwirft bessere Schlösser als wer es nicht hat.