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-06-11 13:22] – [Aufgabe B4 – Brute Force Version 4 (optional)] gra | 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 170: | Zeile 117: | ||
Deshalb sollten deine Passwörter **mindestens 8-stellig** sein und nicht ein Wort im Wörterbuch sein. Beachte ausserdem die Hinweise im folgenden Kapitel. Am sichersten ist es, wenn neben dem Passwort weitere Faktoren geprüft werden. Siehe [[# | Deshalb sollten deine Passwörter **mindestens 8-stellig** sein und nicht ein Wort im Wörterbuch sein. Beachte ausserdem die Hinweise im folgenden Kapitel. Am sichersten ist es, wenn neben dem Passwort weitere Faktoren geprüft werden. Siehe [[# | ||
- | |||
- | \\ | ||
==== 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 184: | 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 236: | 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 249: | 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? |