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 speichern und Sitzungen sichern

Nach dieser Lektion: Ich kann im Code Passwörter als Hash speichern und eine Sitzung mit Ablauf prüfen.

Lektion, 60 Min.4 BefehleSQL-Injection-Lab: eine schwache Shop-Suche angreifen, die Abfrage reparieren und die Reparatur belegen

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

BegriffWas er bedeutet
Hashein fester Fingerabdruck eines Textes, aus dem man den Text nicht zurückrechnen kann
Salzein Zufallstext, der vor dem Hashen zum Passwort kommt; auf Englisch Salt
Sitzungdie Zeit, in der das Programm einen angemeldeten Menschen wiedererkennt; auf Englisch Session
Sitzungszeichenein Zufallswert, den der Browser bei jeder Anfrage mitschickt; auf Englisch Session Token
Ablaufder 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

Code: python
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

Code: python
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

ZeichenAusgestellt vorZuletzt aktiv vorErgebnis
32 Hexzeichen1 Stunde5 Minutengültig
32 Hexzeichen9 Stunden5 Minutenabgelaufen: Gesamtdauer 8 Stunden
32 Hexzeichen2 Stunden45 MinutenLeerlauf: Frist 30 Minuten
zu kurz1 Stunde1 Minuteungü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.

Über dieses Lab und seinen Quellcode: SQL-Injection-Lab: eine schwache Shop-Suche angreifen, die Abfrage reparieren und die Reparatur belegen

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.