Nachricht für neue Nutzer.
Nachricht für engagierte Nutzer.

Benutzer:Kwschneider/Softwareentwicklung/Python/Übungen/Passwortverwaltung

Aus ZUM-Unterrichten
< Benutzer:Kwschneider
Version vom 7. Januar 2026, 20:06 Uhr von Kwschneider (Diskussion | Beiträge) (initiale Fassung)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

=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."

  1. 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()

  1. 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.")

  1. 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.