SkillGridInformatik durch Machen lernen

Authentifizierung: Passwörter, Faktoren und Token

Passwortspeicherung, die einen Datenbankabzug übersteht, warum TOTP nicht SMS ist, was ein JWT wirklich kostet und warum OAuth Delegation ist und kein Login.

15 Min. · 50 XP

Du kennst bereits den Unterschied zwischen Hashing und Verschlüsselung: Ein Hash lässt sich nicht in seine Eingabe zurückverwandeln, eine Verschlüsselung schon. Genau deshalb speichert eine Seite einen Hash deines Passworts und nicht das Passwort selbst. Was jene Lektion nicht abdeckte, ist der Teil, der entscheidet, ob der gespeicherte Hash in der Praxis überhaupt jemanden schützt. Um diesen Teil geht es hier, und um alles, was rund um das Passwortfeld passiert. Alles oben setzt voraus, dass der Angreifer draußen sitzt. Der unbequeme Teil dieser Lektion ist, dass der häufigste Weg hinein ein gültiges Konto ist, das von jemandem benutzt wird, der es nicht sollte, oder ein gültiges Passwort, das auf einer Seite eingegeben wurde, die nicht die echte war. Deshalb leisten die unglamourösen Maßnahmen, also Passwortmanager, zweiter Faktor und kurze Sitzungsdauer, in der Praxis mehr als jedes clevere kryptografische Design.

SHA-256 ist das falsche Werkzeug für Passwörter, und zwar nicht, weil es schwach wäre. Es ist hier schwach, weil es schnell ist. Eine moderne Grafikkarte probiert in der Größenordnung von 10^11 SHA-256-Hashes pro Sekunde durch, also fällt jedes mögliche achtstellige Passwort in Sekunden. Ein Passwort-Hash braucht die entgegengesetzte Eigenschaft: Er muss absichtlich langsam sein, und zwar so langsam, dass man das nicht mit mehr Hardware wegkaufen kann. Genau das leisten scrypt und argon2id. Die Kostenparameter sind keine Zierde, sie sind die gesamte Verteidigung, und sie müssen nach oben angepasst werden, sobald die Hardware schneller wird.

GPU, single card, offline guessing against a leaked dump

algorithm        cost setting        guesses/sec     one 8-char password
---------------  -----------------  --------------  ---------------------
SHA-256          plain               10^11           seconds
MD5              plain               10^11           seconds
bcrypt           cost 12             10^3            ~ 30 years
scrypt           N=2^15, r=8, p=1  10^2            ~ 300 years
argon2id         m=64 MiB, t=3       10^1            ~ 3000 yearsGrobe Größenordnungen für das Offline-Durchprobieren eines abgeflossenen Datenbestands auf einer modernen Grafikkarte. Nimm die Zahlen als Form, nicht als Dogma: Die genauen Raten ändern sich jährlich, die Abstände zwischen den Zeilen nicht.
UserAppDatabaseusername and passwordsalt = random 16 bytesstored = scrypt(password, salt, N=2^15)save username, salt, storedsalt is stored next to the hash, so it is not a secretsame password againread salt and stored valuerecompute with the same salt and compareone guess still costs the attacker 100 ms

Multi-Faktor-Authentifizierung heißt, zwei Dinge unterschiedlicher Art nachzuweisen: etwas, das du weißt, etwas, das du hast, oder etwas, das du bist. Passwort plus Sicherheitsfrage ist ein Faktor, zweimal gefragt. In der Praxis zählt eine engere Frage als die nach der Anzahl der Faktoren: Kann ein Angreifer, der gerade mit dir spricht, deinen zweiten Faktor an die echte Seite weiterreichen, solange er gültig ist? Codes lassen sich weiterreichen. Schlüssel nicht. Der praktische Unterschied ist nicht abstrakte Stärke, sondern ob es ein kurzlebiges Geheimnis gibt, das der Angreifer weitergeben kann.

Nach der Anmeldung muss der Server sich daran erinnern. Er kann ein undurchsichtiges Zufallstoken speichern und es bei jeder Anfrage nachschlagen, oder er kann dir ein signiertes Bündel von Aussagen aushändigen und statt einer Datenbank die Signatur prüfen. Letzteres ist ein JWT, und es ist aus einem echten Grund beliebt: Jeder Server in einem Verbund kann es prüfen, ohne ein gemeinsames Speichersystem zu kontaktieren. Der Preis wird seltener genannt. Ein JWT gilt bis zum Ablauf, denn der Server kann nur eine Signatur prüfen, und eine Signatur weiß nicht, dass du auf Abmelden gedrückt hast. Vorzeitiges Zurückziehen bedeutet eine Sperrliste, also genau den Zustand, den du vermeiden wolltest. Der Kompromiss in einer Tabelle. Ein JWT ist kein besseres Sitzungstoken; es ist ein Sitzungstoken, das Zustandslosigkeit mit Widerrufbarkeit bezahlt hat. Angemeldet bleiben ist kein Bequemlichkeitskästchen, sondern eine Ablaufentscheidung, die für den Nutzer getroffen wird. Ein langlebiges Token, das das Schließen des Browsers übersteht, sind Anmeldedaten auf einem Gerät, das du nicht kontrollierst, und so muss man es behandeln: an ein Gerät gebunden, von einer Kontoseite aus widerrufbar und ungültig, sobald das Passwort wechselt. Die ehrliche Variante hält die Sitzung lang und fragt vor allem Zerstörerischen erneut nach dem Passwort. Die unehrliche Variante hält ein dauerhaftes Token, das nur ein Passwort-Reset töten kann, und niemand erinnert sich daran, bis ein Laptop verkauft wird. OAuth beantwortet eine Frage, die nichts damit zu tun hat, wer du bist: Wie lasse ich einen Dienst in meinem Namen bei einem anderen Dienst handeln, ohne ihm mein Passwort zu geben? Du schickst den Nutzer zum Anbieter, der Anbieter lässt ihn einen konkreten Satz von Berechtigungen bestätigen und gibt einen Code zurück, den nur die anfragende Anwendung gegen ein Token tauschen kann. Das Token trägt einen Geltungsbereich und ein Ablaufdatum. Was OAuth bewusst nicht festlegt, ist der Nachweis von Identität, weshalb OpenID Connect als dünne Identitätsschicht darüber existiert. Die Konsequenz ist es wert, sich zu merken: Ein Dienst, der dich allein anhand eines rohen OAuth-Tokens anmeldet, trifft eine Authentifizierungsentscheidung aufgrund eines Autorisierungsmechanismus.

Praxis

  1. Eine Datenbank mit Passwort-Hashes fließt ab. Jeder gespeicherte Wert ist scrypt(Passwort, Salt) mit Parametern, die rund 100 ms pro Berechnung kosten. Welche Aussage stimmt?

    Hinweise
    • Der Angreifer hat die gespeicherten Werte bereits. Das Salt liegt direkt daneben, kann also kein Geheimnis sein.
    • Einen Passwort-Hash teuer für Angriffe zu machen, leistet nicht Geheimhaltung, sondern die absichtliche Kosten pro Rateversuch.
  2. Ordne jedem Mechanismus zu, was er tatsächlich liefert.

    Hinweise
    • Stelle bei jedem Tokenformat eine Frage: Kann der Server es nach der Ausgabe noch zurückholen, bevor es abläuft?
    • Stelle bei jedem zweiten Faktor eine andere Frage: Gibt es einen kurzlebigen Wert, den der Angreifer innerhalb seiner Gültigkeit an die echte Seite weiterreichen könnte?
  3. Bringe den OAuth-Autorisierungscode-Ablauf in die richtige Reihenfolge.

    1. 1der Anbieter gibt ein Zugriffstoken mit bestätigtem Geltungsbereich und Ablauf zurück
    2. 2die Anwendung tauscht den Code und legt dabei ihr Client-Secret vor, und der Code ist einmalig verwendbar
    3. 3der Anbieter authentifiziert den Nutzer und zeigt, was angefragt wird
    4. 4die Anwendung ruft die API mit diesem Token auf, und das Passwort des Nutzers war nie beteiligt
    5. 5der Nutzer bestätigt, und der Anbieter gibt einen kurzlebigen Autorisierungscode zurück
    6. 6die Anwendung schickt den Nutzer mit client_id und angefragtem Geltungsbereich zum Anbieter
    Hinweise
    • Nichts kann ausgegeben werden, bevor der Dienst entschieden hat, wer fragt und ob der Nutzer zugestimmt hat.
    • Das Client-Secret wird einmal benutzt, in dem Moment, in dem die Anwendung den kurzlebigen Code gegen ein Token tauscht, und das Token kommt zuletzt.

Fragen zu dieser Lektion

Ist das kostenlos?

Ja. Die erste Ebene jedes Fachs ist kostenlos und braucht kein Konto. Tiefere Ebenen und die höheren Stufen sind kostenpflichtig — genau das hält das Projekt am Leben.

Für welches Alter ist das gedacht?

Für neugierige Jugendliche ab etwa 12 Jahren und für Erwachsene, die bei null anfangen. Programmiererfahrung wird nicht vorausgesetzt; die Lektionen zu Netzwerken und Physik brauchen keine Mathematik über Schulniveau.

Muss ich schon programmieren können?

Nein. Logik, Physik und Netzwerke beginnen bei null. Code schreibst du im Bereich Programmiersprachen — und auch der fängt vorne an.

Muss ich etwas installieren?

Nein. Alles läuft im Browser: Theorie, Übungen und die interaktiven Simulationen. Es gibt nichts herunterzuladen und nichts einzurichten.

Wie lange dauert ein Fach?

Eine Lektion dauert 10 bis 15 Minuten. Eine Junior-Stufe umfasst etwa 12 bis 20 Lektionen, also einige Wochen regelmäßiger Übung statt eines Abends.

Muss ich der Reihenfolge folgen?

Innerhalb einer Stufe öffnen sich die Ebenen nacheinander, weil jede auf der vorherigen aufbaut. Zwischen den Fächern bist du frei: beginne mit Logik, Physik oder Netzwerken.