Wie speichert man Passwörter sicher?
Ein Passwort speichern Sie nie selbst, sondern nur seinen Hash mit einem Salz. Das ist wichtig, weil ein Datenleck sonst jedes Passwort verrät, und viele Menschen nutzen dasselbe Passwort bei mehreren Diensten.
Nach der Anmeldung merkt sich das Programm den Besucher mit einem Sitzungszeichen. Auch dieses muss zufällig, geheim und befristet sein.
Am Ende dieser Lektion
Notiz
Ich kann im Code Passwörter als Hash speichern und eine Sitzung mit Ablauf prüfen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Hash | ein fester Fingerabdruck eines Textes, aus dem man den Text nicht zurückrechnen kann |
| Salz | ein Zufallstext, der vor dem Hashen zum Passwort kommt; auf Englisch Salt |
| Sitzung | die Zeit, in der das Programm einen angemeldeten Menschen wiedererkennt; auf Englisch Session |
| Sitzungszeichen | ein Zufallswert, den der Browser bei jeder Anfrage mitschickt; auf Englisch Session Token |
| Ablauf | der Zeitpunkt, ab dem eine Sitzung nicht mehr gilt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Hash ist ein Fingerabdruck und keine Verschlüsselung
Ein Hash macht aus einem Text einen festen Fingerabdruck. Derselbe Text ergibt immer denselben Hash. Aus dem Hash lässt sich der Text nicht zurückrechnen.
Beim Anmelden hasht das Programm das getippte Passwort und vergleicht die Fingerabdrücke. Das Passwort selbst liegt nirgends.
Gleicher Text, gleicher Hash
import hashlib
def fingerabdruck(text):
return hashlib.sha256(text.encode()).hexdigest()
# Ändern Sie das Passwort um einen Buchstaben und führen Sie den Block aus.
passwort = "Sommer2025"
print(fingerabdruck(passwort)[:16])
print(fingerabdruck(passwort)[:16])
Salz und langsames Verfahren schützen
Ein einfacher Hash genügt nicht. Gleiche Passwörter ergäben gleiche Hashes, und Angreifende rechnen Listen vor. Ein Salz macht jeden Hash einmalig.
Außerdem soll das Verfahren absichtlich langsam sein. Python bietet dafür pbkdf2_hmac an: Es wiederholt das Hashen sehr oft.
Salz und Wiederholungen
import hashlib
import secrets
def speichere(passwort):
salz = secrets.token_hex(8)
hash_wert = hashlib.pbkdf2_hmac("sha256", passwort.encode(), salz.encode(), 100000).hex()
return salz + ":" + hash_wert
def stimmt(passwort, gespeichert):
teile = gespeichert.split(":")
neu = hashlib.pbkdf2_hmac("sha256", passwort.encode(), teile[0].encode(), 100000).hex()
return neu == teile[1]
# Ändern Sie das zweite Passwort und führen Sie den Block aus.
eintrag = speichere("Sommer2025")
print(stimmt("Sommer2025", eintrag))
print(stimmt("Winter2025", eintrag))
Wie der Shop des Labs Passwörter ablegt
Der Shop des Labs hat eine Tabelle mit Konten. Die Runs fragen nur nach der Länge der Passwortspalte, nie nach dem Passwort selbst. Die Länge 7 und 10 sind genau die Längen der getippten Passwörter: Sie liegen im Klartext.
Danach folgen drei Zeilen aus der Werkstatt: ein Hash, ein abgeleiteter Wert und ein Zufallszeichen.
Die eine Regel
Warnung
Dieses Lab ist ein Shop, der absichtlich unsicher ist. Sehen Sie nur Ihre eigene, private Kopie an und nichts sonst. Sie hat keine Verbindung ins Internet.
Die Länge der Passwörter im Shop
docker exec app python -c "import sqlite3; print(sqlite3.connect('/tmp/app/shop.db').execute('SELECT username, length(password) FROM users').fetchall())"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 Hash des Textes abc
docker exec app python -c "import hashlib; print(hashlib.sha256(b'abc').hexdigest())"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 eines abgeleiteten Werts in Byte
docker exec app python -c "import hashlib; print(len(hashlib.pbkdf2_hmac('sha256', b'abc', b'salz', 1000)))"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 Zufallszeichen aus 16 Byte
docker exec app python -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.
Ein Sitzungszeichen ist zufällig, geheim und befristet
Ein Sitzungszeichen darf niemand erraten. Nehmen Sie das Modul secrets, nie eine laufende Nummer oder die Uhrzeit.
Es gilt nur begrenzt. Zwei Fristen helfen: eine für die Gesamtdauer und eine für Leerlauf. Beim Abmelden löscht das Programm das Zeichen auf dem Server.
Beispiel: eine Sitzung prüfen
| Zeichen | Ausgestellt vor | Zuletzt aktiv vor | Ergebnis |
|---|---|---|---|
| 32 Hexzeichen | 1 Stunde | 5 Minuten | gültig |
| 32 Hexzeichen | 9 Stunden | 5 Minuten | abgelaufen: Gesamtdauer 8 Stunden |
| 32 Hexzeichen | 2 Stunden | 45 Minuten | Leerlauf: Frist 30 Minuten |
| zu kurz | 1 Stunde | 1 Minute | ungültig |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele glauben, ein verschlüsseltes Passwort sei so sicher wie ein Hash. Das stimmt nicht. Verschlüsseln lässt sich umkehren, wer den Schlüssel hat, liest jedes Passwort. Ein Hash mit Salz lässt sich nicht umkehren. Speichern Sie Hashes.