# Password-QualitĂ€t **🎓 Benotetes Assignment 🎓** 📆 **FĂ€llig: 14.04.2026** 📆 „War ja klar“, denken Sie sich, „die Aliens lĂŒgen wie gedruckt! Von wegen zurĂŒck auf die Erde...“ Ihre Implementierung der Zahlen zur Basis vier war der absolute Knaller und die Aliens sind mehr als glĂŒcklich, Ihre Implementierung in das neue Software-System einbauen zu können. Sie werden in Zukunft von den Außerirdischen nur noch ᎼᏈᏍáŽčᏅᏇᏅᏅᎹ genannt, was so viel wie „Checker mit dem leckeren Gehirn“ bedeutet. Da man einem Checker das Gehirn nicht aussaugt, ist auch Ihr Leben fĂŒrs Erste gerettet. Leider dĂŒrfen Sie aber auch nicht zurĂŒck auf die Erde, sondern mĂŒssen auf dem Raumschiff bleiben – Sie können einfach zu gut programmieren. Eine Analyse des großen Cyberangriffs auf den Planeten der Aliens, die sich ĂŒbrigens selbst Kryptonier nennen, hat gezeigt, dass neben dem von der KI generierten Code, mit all seinen SicherheitslĂŒcken, auch schwache Passwörter ein Problem waren. Deswegen sollen Sie jetzt eine Software entwickeln, welche die QualitĂ€t von Passwörtern bewerten kann. „Pah, Erstsemesterkram“, rufen Sie und sind im Geiste schon fertig, als das Kommandant der Aliens Sie zur Seite nimmt. „Wir erwarten von dir ein modernes, objektorientiertes Design“, sagt es, „wir wollen in der Lage sein, neue Regeln jederzeit hinzuzufĂŒgen, ohne unser Hauptprogramm anpassen zu mĂŒssen. Das Hauptprogramm ist fertig und darf nicht verĂ€ndert werden!“ Da die Kryptonier große Freunde von klarer Kommunikation sind, fĂŒgen sie noch hinzu „falls du dich nicht an die Regeln hĂ€lts, denk an dein Gehirn.“ Dabei schmatzen Sie wieder verdĂ€chtig. ## Paket Gehen Sie in das Paket [pr2.vererbung.password](../sources/src/main/java/pr2/vererbung/password/). ## Implementierung Alle Regeln befinde sich um Paket [pr2.vererbung.password.rules](../sources/src/main/java/pr2/vererbung/password/rules) und leiten von der abstrakten Klasse `Rule` ab. Jedes Passwort wird in eine von drei Kategorien eingeordnet: * `BAD` -> Passwort ist unbrauchbar * `FAIR` -> Passwort ist nicht gut aber noch akzeptabel * `GOOD` -> Passwort ist gut Diese Bewertung wird als Zahl (siehe Konstanten in der Klasse `Rule`) reprĂ€sentiert. Wenn mehrere Regeln kombiniert werden, gilt immer die schlechteste Bewertung. Implementieren Sie Password-PrĂŒfungen fĂŒr folgende Tests, die alle von der abstrakten Klasse `Rule` abgeleitet sind: * **Zeichensatz** (`RuleChars`): Das Password muss mindestens einen Großbuchstaben, einen Kleinbuchstaben, eine Zahl und ein Sonderzeichen enthalten, um gut zu sein (`GOOD`). Fehlt eine der Kategorien, ist es noch akzeptabel (`FAIR`), ansonsten schlecht (`BAD`). * **Wörterbuch** (`RuleDictionary`): Das Password darf kein Wort aus einem Wörterbuch enthalten. Das Wörterbuch ist der Einfachheit halber als „mutti“, „papi“, „dackel“ und „password“ festgelegt. Groß- und Kleinschreibung haben keine Relevanz, d.h. „Mutti“ und „mutti“ sind beide verbotene Wörter. * **LĂ€nge** (`RuleLength`): Das Passwort muss eine MindestlĂ€nge von 8 Zeichen haben (`BAD`), oberhalb einer optimalen LĂ€nge von 12 ist es gut (`GOOD`), darunter `FAIR`. * **Entropie** (`RuleEntropy`): Die Shannon Entropie des Passwortes muss in einem bestimmten Bereich liegen: - `< 1.0`: Schlecht (`BAD`) - `< 2.0`: Akzeptabel (`FAIR`) - `>= 2.0`: Gut (`GOOD`) * **Kombination** (`RuleCombined`): Beliebige Regeln können zu einer komplexeren Regel kombiniert werden. FĂŒr den Anfang werden einfach alle Regeln benutzt, um die Kombination zu realisieren. *Achtung:* Die Klassen liegen in einem eigenen Paket und sind nicht von außerhalb des Paketes sichtbar. Überschreiben Sie in jeder Ihrer Regelklassen die Methode `toString()`, welche den Namen der Regel und möglicherweise Zusatzinfos zur jeweiligen Regel ausgibt. Instanzen der Regeln werden ĂŒber die Klasse `RuleFactory` und deren Methode `createRule` erzeugt. Dort finden Sie Konstanten, welche die verschiedenen Regeln reprĂ€sentieren. Eine Klasse `PasswordChecker` ist vorgegeben, bei der man ein Passwort auf der Konsole eingibt und die dann dieses Password gegen die verschiedenen Regeln prĂŒft. Diese Klasse **dĂŒrfen Sie nicht verĂ€ndern**, d.h. Ihre Lösung muss so gebaut sein, dass Sie mit der unverĂ€nderten Klasse funktioniert. Die Klasse `Rule` sollen Sie ebenfalls nicht verĂ€ndern. ## Tests ÜberprĂŒfen Sie die FunktionalitĂ€t Ihrer Implementierung mit entsprechenden JUnit-Tests und weisen Sie mit diesen Tests nach, dass die implementierten Operationen richtig funktionieren. Testen Sie alle Methoden und Konstruktoren. **Abgabe**: Source-Code der Tests als `PasswordCheckerTest`. ## Abgabe Alle Abgaben fĂŒr die Vorlesung erfolgen ĂŒber `git` und das Ihnen zugeordnete Repository. Hierzu gehen Sie wie folgt vor: 1. Öffnen Sie eine Kommandozeile (Terminal). 2. Gehen Sie in Ihr Working Directory. 3. Rufen Sie mit `bin/submit.sh` das Skript auf, das die Lösungen testet und kompiliert. Wenn Maven eine Fehlermeldung zeigt, beheben Sie diese zuerst, bevor Sie mit dem nĂ€chsten Schritt fortfahren. 4. Wenn Sie Meldung "✅ Projekt gebaut" bekommen, checken Sie Ihre Änderungen in `git` **auf der Kommandozeile** ein (comitten), d.h. mit `git add` und `git commit`. Verwenden Sie **nicht** Eclipse fĂŒr diesen Schritt. 5. Rufen Sie mit `bin/submit.sh` erneut das Skript auf. Wenn alles klappt, bekommen Sie die Anzeige "✅ Aktuelle Lösungen eingereicht" und Ihre Lösung ist im System angekommen. 6. ÜberprĂŒfen Sie ĂŒber das Web-Frontend, ob alles so im Repository liegt, wie Sie es erwarten. **Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **JavaDoc** versehen mĂŒssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.