Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
gf_informatik:authentifizierung [2024-03-04 12:37] – [Aufgabe B4 – Brute Force Version 4 (optional)] hof | gf_informatik:authentifizierung [2025-03-23 16:15] (aktuell) – [Lösungen zu den Programmieraufgaben] hof | ||
---|---|---|---|
Zeile 22: | Zeile 22: | ||
==== Brute-Force-Attacke ==== | ==== Brute-Force-Attacke ==== | ||
- | Wir schreiben einen Code, der mit der [[https:// | + | Wir schreiben einen Code, der mit der [[wpde>Brute-Force-Methode]] versucht, ein geheimes Wort herauszufinden. Dazu geht der Code einfach alle möglichen Kombinationen von Zeichen durch, bis er das richtige Wort gefunden hat. |
=== Python-Kenntnisse auffrischen === | === Python-Kenntnisse auffrischen === | ||
- | Bevor du wieder loslegst mit Programmieren: | + | Bevor du wieder loslegst mit Programmieren: |
- | === Aufgabe | + | === Aufgabe |
Schreibe einen Code, der alle möglichen Wörter, die aus genau zwei Kleinbuchstaben (keine Grossbuchstaben, | Schreibe einen Code, der alle möglichen Wörter, die aus genau zwei Kleinbuchstaben (keine Grossbuchstaben, | ||
Zeile 51: | Zeile 51: | ||
print(letter) | print(letter) | ||
</ | </ | ||
- | === Aufgabe B2 – Brute Force Version 2 === | ||
- | * Schreibe einen Code, der ein Passwort, welches aus genau vier Kleinbuchstaben besteht, hacken kann. | + | ==== Brute-Force Hacking ==== |
- | * Schreibe den Code mit mehreren verschachtelten Schleifen. | + | |
- | * Deklariere dazu eine Variable `password = input(" | + | Hacking now! [[.:authentifizierung:hacking]] |
- | * Sobald das richtige Wort gefunden wurde, wird das Wort ausgegeben und der Code abgebrochen. | + | ==== Bessere und schlechtere |
- | + | ||
- | * Messe nun noch, wie lange die Suche dauert. Verwende dazu das **Time-Modul: | + | |
- | + | ||
- | <code python> | + | |
- | import time # fuege diese Zeile ganz am Anfang ein | + | |
- | t0 = time.time() # bestimmt aktuelle Zeit in Anzahl Sekunden seit 1.1.1970 und speichert in Variablen t0 | + | |
- | + | ||
- | # hier mein anderer Code | + | |
- | + | ||
- | t = time.time() - t0 # bestimme nach Ausführen des Codes Zeit erneut und subtrahiere Zeit von vorher. Damit erhält man Zeit, die Code dazwischen benötigt hat | + | |
- | </ | + | |
- | * Dein Code soll (zusätzlich zum ermittelten Passwort) eine Nachricht wie folgt ausgeben: '' | + | |
- | === Aufgabe B3 – Brute Force Version 3 (optional) === | + | |
- | + | ||
- | * Schreibe nun einen Code, der Passwörter mit einer unbekannten Länge bestimmen kann. Der Code soll also Passwörter wie " | + | |
- | * Gebe eine obere Grenze an Stellen (z.B. $n=5$) ein, nach der er abbrechen soll. | + | |
- | * Dazu soll der Code der Reihe nach alle 1-stelligen, | + | |
- | * Tipp: Verwende die Funktion `itertools.product(..., | + | |
- | * Anstelle selbst eine Liste mit Symbolen festzulegen, | + | |
- | + | ||
- | <code python> | + | |
- | import string | + | |
- | print(string.ascii_lowercase) | + | |
- | print(string.ascii_uppercase) | + | |
- | print(string.printable) | + | |
- | </ | + | |
- | + | ||
- | === Aufgabe B4 – Brute Force Version 4 (optional) === | + | |
- | + | ||
- | Schreibe deine eigene `permutation(...)` Funktion. Tipp: Verwende dazu **Rekursion**. | + | |
- | + | ||
- | <nodisp 1> | + | |
- | ++++Tipps zu Rekursion| | + | |
- | + | ||
- | Rekursive Funktionen sind solche, die *sich selbst aufrufen*. | + | |
- | + | ||
- | Beispiel Fakultät: Die Fakultät berechnet sich wie folgt: | + | |
- | $$n! = n \cdot (n-1) \cdot \ldots \cdot 3 \cdot 2 \cdot 1$$ | + | |
- | Zum Beispiel $5! = 5 \cdot 4 \cdot 3 \cdot 2 \cdot 1$. Offensichtlich gilt also $5! = 5 \cdot 4!$. Um die Fakultät von $5$ zu berechnen, kann man also zuerst die Fakultät von $4$ berechnen und das Resultat mit $5$ multiplizieren. An die Fakultät von $4$ kommt man über die Fakultät von $3$ usw. Ganz wichtig ist, eine Abbruchbedingung einzubauen. Für die Fakultät ist diese, dass $1! = 1$. | + | |
- | + | ||
- | Tipp: Schreibe die Funktion `factorial(n)`, | + | |
- | <code python> | + | |
- | def factorial(n): | + | |
- | ... | + | |
- | ... = factorial(n-1) | + | |
- | ... | + | |
- | </ | + | |
- | + | ||
- | ++++ | + | |
- | </ | + | |
- | + | ||
- | \\ | + | |
- | ==== Bessere und schlechtere | + | |
=== Aufgabe C – Wie lange dauert es mit und ohne Sonderzeichen? | === Aufgabe C – Wie lange dauert es mit und ohne Sonderzeichen? | ||
Zeile 171: | Zeile 116: | ||
* Wenn dein Passwort eine bekanntes Wort enthält, kann es nochmals viel schneller gehen. Denn der Code könnte zuerst einfach eine Liste mit bekannten Wörtern durchsuchen und jeweils prüfen, ob es im Passwort vorkommt. | * Wenn dein Passwort eine bekanntes Wort enthält, kann es nochmals viel schneller gehen. Denn der Code könnte zuerst einfach eine Liste mit bekannten Wörtern durchsuchen und jeweils prüfen, ob es im Passwort vorkommt. | ||
- | Deshalb sollten deine Passwörter **mindestens | + | Deshalb sollten deine Passwörter **mindestens |
- | + | ||
- | \\ | + | |
==== Wenn nur das Passwort geprüft wird – Tipps für eine bessere IT-Sicherheit ==== | ==== Wenn nur das Passwort geprüft wird – Tipps für eine bessere IT-Sicherheit ==== | ||
Zeile 186: | Zeile 129: | ||
- Passwörter müssen nicht gemerkt oder irgendwo aufgeschrieben werden. | - Passwörter müssen nicht gemerkt oder irgendwo aufgeschrieben werden. | ||
- | \\ | + | ===== Mehrfaktor-Authentifizierung |
- | ===== Mehrere Faktoren | + | |
Angenommen, du hast einen Gegenstand (z.B ein Tagebuch, ein Foto oder ein Superkräfte verleihender Trank), der **auf keinen Fall** in die Hände von jemand anderem gelangen darf. Du verschliesst den Gegenstand in einem bombensicheren Safe. Um den Safe zu öffnen, braucht es einen Pin Code. | Angenommen, du hast einen Gegenstand (z.B ein Tagebuch, ein Foto oder ein Superkräfte verleihender Trank), der **auf keinen Fall** in die Hände von jemand anderem gelangen darf. Du verschliesst den Gegenstand in einem bombensicheren Safe. Um den Safe zu öffnen, braucht es einen Pin Code. | ||
Was aber, wenn irgendjemand den Code herausfindet? | Was aber, wenn irgendjemand den Code herausfindet? | ||
Zeile 238: | Zeile 180: | ||
**Top-1 Million** Passwörter: | **Top-1 Million** Passwörter: | ||
- | Mit dem folgenden Code kann man über die URL auf ein Online-Text-File zugreifen und dieses | + | Mit dem folgenden Code kann man über die URL auf eine Online-Text-Datei zugreifen und sie einlesen. |
**Hinweis**: | **Hinweis**: | ||
Zeile 251: | Zeile 193: | ||
</ | </ | ||
- | Alternativ kann ein File auch heruntergeladen und eingelesen werden. | + | Alternativ kann eine Datei auch heruntergeladen und eingelesen werden. |
=== Aufgabe G === | === Aufgabe G === | ||
- | In der Brute-Force Aufgabe weiter oben hast du gesehen, wie man alle möglichen Wörter erzeugen kann. Dies kann nicht nur für Hacker praktisch sein sondern kann dazu verwendet werden, um Fantasiewörter (z.B. Namen für Fantasy-Story) zu erfinden. Hier lohnt es sich aber, die Buchstaben zufällig auszuwählen (Stichwort: random-Modul) und gewisse Regeln zu implementieren, | + | In der Brute-Force Aufgabe weiter oben hast du gesehen, wie man alle möglichen Wörter erzeugen kann. Dies kann nicht nur für Hacker praktisch sein sondern kann dazu verwendet werden, um Fantasiewörter (z.B. Namen für Fantasy-Story) zu erfinden. Hier lohnt es sich aber, die Buchstaben zufällig auszuwählen (Stichwort: random-Modul) und gewisse Regeln zu implementieren, |
Implementiere einen Code, der zufällige Fantasiewörter generiert. Was sind deine besten Kreationen? | Implementiere einen Code, der zufällige Fantasiewörter generiert. Was sind deine besten Kreationen? | ||
Zeile 271: | Zeile 213: | ||
===== Lösungen zu den Programmieraufgaben ===== | ===== Lösungen zu den Programmieraufgaben ===== | ||
- | < | + | < |
++++Lösungen| | ++++Lösungen| | ||