Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Passwörter sicher speichern

Nach dieser Lektion: Ich kann Passwörter und Schlüssel so speichern, dass ein Datendiebstahl wenig Schaden anrichtet.

Lektion, 60 Min.8 BefehleLab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Wie speichert man Passwörter sicher?

Ein Passwort sicher zu speichern heißt: Man legt nie das Passwort selbst ab, sondern einen gesalzenen Hashwert davon. Wird die Datenbank gestohlen, bekommen Angreifende keine nutzbaren Passwörter.

Dasselbe gilt für Schlüssel: Sie gehören nie in den Quelltext. In dieser Lektion lernen Sie, beides richtig zu machen.

Am Ende dieser Lektion

Notiz

Ich kann Passwörter und Schlüssel so speichern, dass ein Datendiebstahl wenig Schaden anrichtet.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Salzein zufälliger Zusatz je Passwort, der vor dem Hashen davorgesetzt wird
Gesalzener Hashwertder Hashwert von Salz und Passwort zusammen
Langsamer Hashein Verfahren, das absichtlich viel Rechenzeit brauchtPBKDF2
WörterbuchangriffAngreifende probieren häufige Passwörter der Reihe nach aus
Geheimnisein Passwort, ein Schlüssel oder ein Token, das niemand sonst kennen darf
Rotationein Geheimnis regelmäßig durch ein neues ersetzen

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Warum reicht ein einfacher Hash nicht?

Ein Passwort im Klartext ist nach einem Diebstahl sofort nutzbar, und viele Menschen nutzen es auch bei anderen Diensten.

Ein einfacher Hashwert ohne Salz hilft nur halb. Wer dasselbe Passwort wählt, erzeugt denselben Hashwert. Angreifende halten Listen mit Hashwerten häufiger Passwörter bereit und schlagen darin nach.

Der Hashwert von „geheim123“ ohne Salz

Befehl
printf 'geheim123' | sha256sum

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Derselbe Text mit dem Salz „x7Q“ davor

Befehl
printf 'x7Qgeheim123' | sha256sum

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Beispiel: Salz verändert den Hashwert

EingabeAnfang des HashwertsBedeutung
geheim123e8c8a741Bei jeder Person mit diesem Passwort gleich
x7Qgeheim123e1075a01Mit Salz anders
k9Zgeheim123ec2bf4f5Mit anderem Salz wieder anders

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

So wählt man ein gutes Salz

Das Salz ist ein Zufallswert, mindestens 16 Byte lang, für jedes Passwort neu. Es kommt aus dem Zufallsgenerator des Betriebssystems und nicht aus einer Zeitangabe.

Man speichert es neben dem Hashwert. Beim Anmelden setzt man es vor das eingegebene Passwort und vergleicht.

Wie lang ist ein Zufallswert als Text?

Befehl
python3 -c "import secrets; print(len(secrets.token_hex(16)))"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Länge steht fest, der Wert nicht

Der Befehl gibt 32 aus: 16 Byte sind 32 Hex-Zeichen. Der Wert selbst ist bei jedem Lauf ein anderer, darum zeigen wir ihn nicht.

Nutzen Sie für Zufall in der Sicherheit immer secrets und nie random.

Warum der Hash langsam sein soll

SHA-256 ist schnell gebaut. Eine Grafikkarte schafft damit Milliarden Versuche je Sekunde. Für Prüfsummen ist das gut, für Passwörter schlecht.

Passwort-Verfahren wie PBKDF2, bcrypt, scrypt und Argon2 sind absichtlich langsam. Sie rechnen den Hash viele tausend Mal. Das stört eine einzelne Anmeldung kaum und bremst Raten stark.

Ein langsamer Hash mit 100000 Runden

Befehl
python3 -c "import hashlib; print(hashlib.pbkdf2_hmac('sha256', b'geheim123', b'salz', 100000).hex())"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Was der Befehl ausgibt

Der Befehl gibt 64 Hex-Zeichen aus, die mit 12ec09b8 beginnen. Mit demselben Salz und denselben Runden ist die Ausgabe auf jeder Maschine gleich.

Ändern Sie 100000 auf 1000, und Sie sehen einen anderen Wert. Die Rundenzahl gehört zum Hashwert und wird mitgespeichert.

Wie viele Passwörter hat „8 kleine Buchstaben“?

Befehl
python3 -c "print(26 ** 8)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Und „8 Zeichen aus Buchstaben und Ziffern“?

Befehl
python3 -c "print(62 ** 8)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Beispiel: wie lange das Raten dauert

PasswortMöglichkeitenSchneller HashLangsamer Hash
8 kleine Buchstaben208827064576Etwa 21 SekundenEtwa 6,6 Jahre
8 Zeichen, Buchstaben und Ziffern218340105584896Etwa 6 StundenEtwa 6900 Jahre

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Die Zahlen sind Annahmen

Wir nehmen zehn Milliarden Versuche je Sekunde beim schnellen und tausend beim langsamen Hash an. Das sind Größenordnungen und keine Messwerte.

Die Aussage bleibt: Ein langsamer Hash und ein langes Passwort schützen viel mehr als ein Sonderzeichen.

Schlüssel gehören nicht in den Quelltext

Ein Schlüssel im Quelltext landet im Versionsverwaltungssystem und auf jedem Laptop, der den Code kopiert. Er bleibt dort auch, wenn Sie ihn später löschen.

Legen Sie Schlüssel in einem Geheimnisspeicher oder in einer Datei ab, die nur das Programm lesen darf. Wechseln Sie sie regelmäßig, und sofort, wenn einer in falsche Hände geraten sein könnte.

Eine Datei nur für sich selbst lesbar machen

Befehl
chmod 600 scratch/old.log

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Modus der Datei ansehen

Befehl
stat -c '%a %n' scratch/old.log

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Der Modus 600 sperrt alle anderen aus

Der erste Befehl gibt nichts aus. Der zweite gibt 600 scratch/old.log aus. 6 heißt lesen und schreiben für Sie, die beiden Nullen heißen: nichts für die Gruppe und nichts für alle anderen.

Für Schlüsseldateien ist 600 der übliche Modus.

Ein häufiger Fehler

Warnung

Viele verschlüsseln Passwörter, um sie zu speichern. Wer den Schlüssel stiehlt, liest dann alle. Man speichert gesalzene, langsame Hashwerte. Das Passwort muss man nie zurücklesen, nur prüfen.

Weiterführend: eine Anmeldung ohne Zeitvorteil

Wer Hashwerte mit == vergleicht, braucht bei einem frühen Unterschied etwas weniger Zeit. Daraus kann man in Ausnahmefällen Rückschlüsse ziehen.

Suchen Sie in der Python-Dokumentation hmac.compare_digest. Beschreiben Sie in zwei Sätzen, warum diese Funktion bei einem Vergleich vorzuziehen ist.

Über dieses Lab und seinen Quellcode: Lab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.