Benutzer:Kwschneider/Softwareentwicklung/Python/Übungen/Passwortverwaltung
=Python-Übungsaufgabe: Verwaltung von Benutzernamen und Passwörtern=
Teil 1: Manuelle Eingabe und Dateispeicherung
Lernziel Schüler lernen, wie man Benutzernamen und Passwörter per Konsole abfragt, in einer Datei speichert und grundlegende Dateizugriffe in Python nutzt.
Wichtige Hinweise zu Dateizugriffen
- Beim Lesen/Schreiben von Dateien sollte stets ein Context Manager (with open(...) as f:) verwendet werden.
- Verwende den Modus "a" (append) zum Hinzufügen neuer Einträge, ohne vorhandene zu überschreiben.
- Achte auf Zeichencodierung (z. B. encoding="utf-8"), um Umlaute oder Sonderzeichen korrekt abzulegen.
- Sensible Daten niemals in öffentlich einsehbaren Dateien ablegen.
Beispielcode {{{def teil1_neuer_eintrag(dateipfad):
benutzer = input("Benutzername: ")
passwort = input("Passwort: ")
eintrag = f"{benutzer}:{passwort}\n"
with open(dateipfad, "a", encoding="utf-8") as file:
file.write(eintrag)
print("Eintrag gespeichert.")
}}}
Teil 2: Passwortregeln prüfen
Lernziel Schüler implementieren eine Funktion, die Passwörter gegen aktuelle Sicherheitsstandards validiert.
Vorgeschlagene Regeln
- Mindestens 12 Zeichen Länge
- Mindestens ein Großbuchstabe
- Mindestens ein Kleinbuchstabe
- Mindestens eine Ziffer
- Mindestens ein Sonderzeichen (!@#$%^&*()_+-=[]{};:,.<>/?)
- Keine Leerzeichen
- Keine Wiederholungen (z. B. “aaa”, “111”)
Beispielcode {{{import re
def pruefe_passwort(pw):
if len(pw) < 12:
return False, "Passwort zu kurz (mind. 12 Zeichen)."
if not re.search(r"[A-Z]", pw):
return False, "Mindestens ein Großbuchstabe fehlt."
if not re.search(r"[a-z]", pw):
return False, "Mindestens ein Kleinbuchstabe fehlt."
if not re.search(r"[0-9]", pw):
return False, "Mindestens eine Ziffer fehlt."
if not re.search(r"[!@#$%^&*()_+\-=\[\]{};:,.<>/?]", pw):
return False, "Mindestens ein Sonderzeichen fehlt."
if " " in pw:
return False, "Passwort darf keine Leerzeichen enthalten."
if re.search(r"(.)\1\1", pw):
return False, "Drei gleiche Zeichen hintereinander sind nicht erlaubt."
return True, "Passwort erfüllt alle Regeln."
- Integrierte Nutzung im Hauptprogramm
pw = input("Passwort wählen: ") ok, meldung = pruefe_passwort(pw) print(meldung) }}}
Teil 3: Hash-Verfahren und MD5
Lernziel Schüler verstehen, was Hash-Funktionen sind und wie man MD5 in Python anwendet.
Allgemeines zu Hash-Verfahren
- Hash-Funktionen wandeln Eingaben beliebiger Länge in eine fixe Bitfolge um.
- Sie sind Einbahn: aus dem Hash kann man normalerweise nicht das Originalpasswort rekonstruieren.
- Kollisionen (zwei Eingaben mit demselben Hash) sind unerwünscht, treten aber teilweise auf.
- Für echte Anwendungen werden heute stärkere Verfahren (z. B. SHA-256, bcrypt) empfohlen.
MD5 in Python {{{import hashlib def md5_hash(pw):
hasher = hashlib.md5()
hasher.update(pw.encode("utf-8"))
return hasher.hexdigest()
- Beispiel:
klare_passwort = "MeinSicheres!123" hash_wert = md5_hash(klare_passwort) print("MD5-Hash:", hash_wert) Anwendung im Speichern
def teil3_neuer_eintrag(dateipfad):
benutzer = input("Benutzername: ")
pw = input("Passwort wählen: ")
hashed = md5_hash(pw)
eintrag = f"{benutzer}:{hashed}\n"
with open(dateipfad, "a", encoding="utf-8") as f:
f.write(eintrag)
print("Benutzer und Hash gespeichert.")
}}}
Teil 4: Passwortprüfung bei bestehendem Benutzer
Lernziel Schüler erweitern ihr Programm um eine Login-Funktion: Eingabe von Benutzername und Passwort wird gegen die gespeicherten MD5-Hashes geprüft.
Beispielcode {{{def lade_passwortdatei(dateipfad):
daten = {}
with open(dateipfad, "r", encoding="utf-8") as f:
for zeile in f:
name, hashwert = zeile.strip().split(":", 1)
daten[name] = hashwert
return daten
def login_pruefung(dateipfad):
daten = lade_passwortdatei(dateipfad)
benutzer = input("Benutzername: ")
if benutzer not in daten:
print("Benutzer nicht gefunden.")
return
pw = input("Passwort: ")
if md5_hash(pw) == daten[benutzer]:
print("Login erfolgreich.")
else:
print("Falsches Passwort.")
- Beispielaufruf
login_pruefung("passwoerter.txt") }}}
Weiterführende Anregungen
- Salted Hashes einführen: Für jeden Benutzer einen zufälligen Salt vor dem Hashen nutzen.
- Bessere Algorithmen einsetzen: z. B. hashlib.sha256, bcrypt oder scrypt.
- Verwaltung in einer SQLite-Datenbank statt in einer Textdatei.
- Zwei-Faktor-Authentifizierung (2FA) simulieren.
- Passwort-Blacklist implementieren, um häufige Passwörter zu verbieten.
