Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
gf_informatik:umgang_inet_sca:authentifizierung [2023-02-14 21:07] – [Lösungen] sca | gf_informatik:umgang_inet_sca:authentifizierung [2024-02-11 09:45] (aktuell) – gelöscht sca | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Authentifizierung ====== | ||
- | |||
- | * Slides: {{ : | ||
- | * Seite zu Theorie (ignoriere Aufgaben dort): [[gf_informatik: | ||
- | * [[https:// | ||
- | |||
- | |||
- | ==== Aufgabe 1: Brute-Force-Attacke ==== | ||
- | |||
- | Ziel ist, einen Code zu schreiben, der mit Brute-Force versucht, ein geheimes Wort herauszufinden. Dazu geht der Code einfach alle möglichen Kombinationen von Zeichen durch, bis er das richtige Wort gefunden hat. | ||
- | |||
- | === Version 1 === | ||
- | |||
- | Schreibe einen Code, der alle möglichen Wörter, die aus genau zwei Kleinbuchstaben (keine Grossbuchstaben, | ||
- | |||
- | Verwende dazu zwei verschachtelte Schleifen. | ||
- | |||
- | Du kannst dazu die folgende Liste verwenden: | ||
- | <code python> | ||
- | alphabet = [' | ||
- | </ | ||
- | |||
- | === Version 2 === | ||
- | |||
- | * Schreibe einen Code, der ein Passwort, welches aus genau vier Kleinbuchstaben besteht, hacken kann. | ||
- | * Schreibe den Code mit mehreren verschachtelten Schleifen. | ||
- | |||
- | * Deklariere dazu eine Variable `password = input(" | ||
- | |||
- | * Sobald das richtige Wort gefunden wurde, wird das Wort ausgegeben und der Code abgebrochen. | ||
- | |||
- | * 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 | ||
- | </ | ||
- | |||
- | === Version 3 === | ||
- | |||
- | * 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. 5) ein, nach der er abbrechen soll. | ||
- | * Dazu soll der Code der Reihe nach alle 1-stelligen, | ||
- | * Tipp: Verwende die Funktion `itertools.permutations(...)`, | ||
- | * Anstelle selbst eine Liste mit Symbolen festzulegen, | ||
- | |||
- | <code python> | ||
- | import string | ||
- | print(string.ascii_lowercase) | ||
- | print(string.ascii_uppercase) | ||
- | print(string.printable) | ||
- | </ | ||
- | |||
- | === 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 `faculty(n)`, | ||
- | <code python> | ||
- | def faculty(n): | ||
- | ... | ||
- | ... = faculty(n-1) | ||
- | ... | ||
- | </ | ||
- | |||
- | ++++ | ||
- | </ | ||
- | ==== Aufgabe 2: Multifaktor-Authentifizierung ==== | ||
- | |||
- | Überlege dir für jede der drei Kategorien (Wissensfaktoren, | ||
- | |||
- | ==== Aufgabe 3: Eigenes Sicherheitskonzept ==== | ||
- | |||
- | Ziel hier ist, dein eigenes Sicherheitskonzept im Internet zu analysieren und gegebenenfalls Massnahmen zu ergreifen. Mache *Notizen*. | ||
- | |||
- | 1. **Eigenes Verhalten: | ||
- | 1. Wie ist mein Verhalten bzgl. Sicherheit von Authentifizierungen? | ||
- | 1. Sind meine Passwörter noch geheim oder kennt der halbe Zug nach Arbon das Zugangsmuster meines Smartphones? | ||
- | 1. Lasse ich den Laptop unbeaufsichtigt und ungesperrt stehen? | ||
- | |||
- | 1. **Passwörter: | ||
- | 1. Verwende ich sichere Passwörter? | ||
- | 1. Verwende ich unterschiedliche Passwörter? | ||
- | 1. Sind meine Passwörter noch geheim? Wer kennt diese noch? | ||
- | 1. Wie merke ich mir meine Passwörter? | ||
- | |||
- | 1. **Wichtigste Accounts:** | ||
- | 1. Welche meiner **Online-Accounts** sind am wichtigsten? | ||
- | 1. Geld (Online-Banking), | ||
- | 1. persönliche Informationen, | ||
- | 1. andere Accounts (Mail) | ||
- | 1. Lizenzen von gekaufter Software | ||
- | 1. Wurden diese **bereits kompromittiert**? | ||
- | 1. Wie sind diese **aktuell geschützt**? | ||
- | 1. Verwende ich möglichst sicheres Passwort? Wo verwende ich dieses noch? | ||
- | 1. Verwende ich bereits Multifaktor-Authentifizierung? | ||
- | 1. Falls nein, welche sind möglich? | ||
- | 1. **Konkrete Massnahmen**: | ||
- | 1. Was möchte ich konkret verändern in Bezug auf ... | ||
- | 1. **Verhalten**: | ||
- | 1. **Passwörter**: | ||
- | 1. **Einstellungen**: | ||
- | 1. Tue dies! | ||
- | |||
- | |||
- | |||
- | ==== Aufgabe 4: Weitere Programmieraufgaben ==== | ||
- | |||
- | === Aufgabe I === | ||
- | |||
- | Brute-Force Attacken, bei denen alle möglichen Buchstabenkombinationen erzeugt werden, funktionieren nur für relativ kurze Wörter. Eine andere Möglichkeit ist, eine lange Liste mit beliebten Passwörtern durchzugehen und sehen, ob eines davon passt. | ||
- | |||
- | 1. Schreibe ein Programm, in dem man sein Passwort eingeben kann. Das Programm soll dieses dann mit den am meisten verwendeten Passwörtern vergleichen. Listen mit diesen findest du im Internet (siehe unten). | ||
- | 1. Verwendest du selbst Passwörter, | ||
- | 1. Kommt dein Vorname in dieser Liste vor? An welcher Stelle? | ||
- | |||
- | **Top-1 Million** Passwörter: | ||
- | |||
- | Mit dem folgenden Code kann man über die URL auf ein Online-Text-File zugreifen und dieses einlesen. | ||
- | <code python> | ||
- | import urllib2 | ||
- | |||
- | data = urllib2.urlopen(< | ||
- | |||
- | for line in data: | ||
- | print(line) # Achtung: keine gute Idee, wenn File sehr viele Zeilen beinhaltet! Baue z.B. Counter ein, damit nach z.B. 100 Ausgaben abbricht | ||
- | </ | ||
- | |||
- | Alternativ kann ein File auch heruntergeladen und eingelesen werden. | ||
- | === Aufgabe II === | ||
- | |||
- | 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? | ||
- | |||
- | //Tipp:// Hast du einen String `s` mit lauter Grossbuchstaben, | ||
- | |||
- | Du kannst die folgenden zwei Listen mit Konsonanten und Vokalen verwenden: | ||
- | <code python> | ||
- | consonants = [" | ||
- | vowels = [" | ||
- | </ | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | ===== Lösungen ===== | ||
- | |||
- | <nodisp 2> | ||
- | ++++Lösungen| | ||
- | |||
- | ==== Aufgabe 1 ==== | ||
- | |||
- | === Version 1 === | ||
- | |||
- | <code python> | ||
- | alphabet = [' | ||
- | |||
- | for c1 in alphabet: | ||
- | for c2 in alphabet: | ||
- | word = c1 + c2 | ||
- | print(word) | ||
- | </ | ||
- | |||
- | === Version 2 === | ||
- | |||
- | **Lösung 1** (Problem: Bricht nicht ab, wenn Passwort gefunden) | ||
- | |||
- | <code python> | ||
- | import time | ||
- | alphabet = [' | ||
- | |||
- | password = input(" | ||
- | |||
- | t0 = time.time() | ||
- | for c1 in alphabet: | ||
- | for c2 in alphabet: | ||
- | for c3 in alphabet: | ||
- | for c4 in alphabet: | ||
- | for c5 in alphabet: | ||
- | word = c1+c2+c3+c4+c5 | ||
- | if word == password: | ||
- | print(" | ||
- | |||
- | print(time.time() - t0) | ||
- | </ | ||
- | |||
- | **Lösung 2:** Bricht ab, wenn PW gefunden, packe dazu Brute-Force Suche in Funktion, breche mit return ab | ||
- | |||
- | <code python> | ||
- | import time | ||
- | alphabet = [' | ||
- | |||
- | password = input(" | ||
- | |||
- | t0 = time.time() | ||
- | |||
- | def brute_force(pw): | ||
- | for c1 in alphabet: | ||
- | for c2 in alphabet: | ||
- | for c3 in alphabet: | ||
- | for c4 in alphabet: | ||
- | for c5 in alphabet: | ||
- | word = c1+c2+c3+c4+c5 | ||
- | if word == pw: | ||
- | print(" | ||
- | return | ||
- | |||
- | brute_force(password) | ||
- | |||
- | print(time.time() - t0) | ||
- | </ | ||
- | |||
- | === Version 3 === | ||
- | |||
- | |||
- | ==== Aufgabe 4 ==== | ||
- | |||
- | === Aufgabe I === | ||
- | |||
- | <code python> | ||
- | import urllib2 | ||
- | |||
- | data = urllib2.urlopen(" | ||
- | pw = " | ||
- | |||
- | c = 0 | ||
- | for line in data: | ||
- | line = line.split(' | ||
- | if line == pw: | ||
- | print(" | ||
- | print(" | ||
- | break | ||
- | c += 1 | ||
- | if c % 100000 == 0: | ||
- | print(" | ||
- | |||
- | print(" | ||
- | </ | ||
- | |||
- | === Aufgabe II === | ||
- | |||
- | <code python> | ||
- | import random | ||
- | |||
- | consonants = [" | ||
- | vowels = [" | ||
- | |||
- | def random_word(n=6): | ||
- | next_vowel = random.choice([True, | ||
- | word = "" | ||
- | for i in range(n): | ||
- | if next_vowel: | ||
- | word += random.choice(vowels) | ||
- | else: | ||
- | word += random.choice(consonants) | ||
- | next_vowel = not next_vowel | ||
- | return word | ||
- | |||
- | for i in range(20): | ||
- | n = random.randint(3, | ||
- | print(random_word(n).capitalize()) | ||
- | </ | ||
- | |||
- | ++++ | ||
- | </ | ||