Hashfunktionen
🎯 Um was geht es?
Eine Hashfunktion erzeugt effizient aus einem Eingabewert, etwa einer Nachricht, einen Ausgabewert fester Länge: den Hashwert. Es ist eine Einwegfunktion! (d.h zwar sehr einfach zu berechnen, jedoch schwierig umzukehren).
Passwörter
Passwörter können sicher sein, aber auch sehr unsicher. Ausschlaggebend ist die Länge des Passwortes.
Einstiegsaufgabe I
Nutze den Online-Dienst https://www.passwortcheck.ch. Gib unterschiedliche Passwörter ein. Teste Passwörter, welche kurz und lang sind, nur Buchstaben beinhalten, Zahlen, Zeichen, ...
Sammle deine Beobachtungen mit deinem Banknachbarn, deiner Banknachbarin.
Brute Force Attack
Ein Brute-Force-Angriff ist ein Versuch, ein Kennwort herauszufinden, indem systematisch alle möglichen Kombinationen von Buchstaben, Zahlen und Symbolen ausprobiert werden, bis die eine richtige Kombination gefunden wird, die funktioniert.
Einstiegsaufgabe II
Wie viele Möglichkeiten müsste bei einem Brute-Force-Angriff ausprobiert werden, wenn man ein Passwort mit 5 Kleinbuchstaben knacken möchte?
Wie viele Möglichkeiten, wenn die Passwortlänge 7 ist sowohl Gross- wie auch Kleinbuchstaben sowie Zahlen verwendet werden können?
Wie lange würden die Brute-Force Attacks dauern, wenn man 100 Milliarden Versuche pro Sekunde ausführen könnte?
Wie lange müsste das Passwort sein (nur Kleinbuchstaben), um eine Knackdauer von mind. 5 Jahren zu haben (andere Analysen, z.B. Wörterbuchabgleiche, werden in diesem Beispiel nicht gemacht)?
Lösung
26^5 = 11 881 376
(26 + 26 + 10)^7 = 3 521 614 606 208
100 000 000 000 (100 Milliarden) Versuche / Sekunde
11 881 376 / 100 000 000 000 = 0.0001188 Sekunden
3 521 614 606 208 / 100 000 000 000 = 35.21 Sekunden
(26^x) / 100000000000 >= 157 700 000 -> solve for x, x >= 13.5676
Passwörter erstellen
Passwort-Generator: Lasse deine Passwörter vom Zufallszahlengenerator erzeugen und verwalte sie mit einem vertrauenswürdigen Passwortverwaltungsdienst. Die effektivste Stellschraube bei der Sicherheit ist die Länge des Passworts. Mit jeder zusätzlichen Stelle steigt die Anzahl der möglichen Kombinationen, die ein Angreifer potenziell durchprobieren muss, um einen Faktor zwischen 40 und 80. Du kannst davon ausgehen, dass die Passwort-Knacker zunächst alle Wörter aus diversen Wörterbüchern durchprobieren und auch Zeichenfolgen, die man daraus kombinieren kann. Diese gilt es also zu meiden.
Eselsbrücken: „Wer vier Mal hinfällt, sollte fünf Mal wieder aufstehen“, daraus wird: „Wer 4 x hinfällt, sollte 5 x wieder aufstehen.“ Oder als Passwort: W4xh$5xwa. Beachte auch hier, dass das Passwort mit 9 Zeichen immer noch zu kurz ist!
Würfelmethode: Bei der Würfelmethode wählt man aus einer Wortliste mit Würfeln mindestens 4 (besser sind 5 oder 6) zufällige Wörter aus, die aneinander gereiht das Passwort ergeben.
Anfangsbuchstaben: «Jeden Abend vor dem Schlafen trinke ich eine Tasse Kräutertee!» = JA4dStieTKt!
Individualisierung: Wähle ein gutes Passwort, welches du dir merken kannst. Füge für jeden Webdienst eine Zeichenfolge in dein Passwort ein, z.B. «ZA» für Zalando, «TM» für Teemondo (Siehe Beispiel rechts).
Passwortmanager
Am sicherstent ist es, zufällige Passwörter zu verwenden, welche du in einem Passwortmanager verwaltest. So musst du dir nur ein Passwort merken, dasjenige für den Passwortmanager. Im Manager kannst du für jeden Dienst automatisch ein sicheres Passwort erzeugen lassen.
Passwörter Speichern
Wie speichern Google, Instagram, Amazon, OrellFüssli, ... deine Passwörter? Etwa so?
hanna.meier:12345
max.mueller:keinpasswort
sepp.blumewiese:seppli
Es gibt immer weider Hackerangriffe, welche zu grösseren Datenlecks führen und so die Zugangsdaten von Nutzern öffentlich machen. Da das eine tatsächlcihe Gefahr ist, wäre die obige Variante, wie Utnernehmen deine Passwöerter speichern würden, unglaublich fahrlässig.
Um die Sicherheit von Passwörtern zu erhöhen, werden diese nicht im Klartext abgelegt. Stattdessen wird nur quasi ein Fingerabdruck des Passworts, ein sogenannter Hash gespeichert. Damit geht das ursprüngliche Passwort zwar verloren und ist nicht mehr wiederherstellbar, jedoch kann es immer noch überprüft werden. Dazu wird vom eingegebenen Passwort zuerst der Hash-Code berechnet und dieser dann mit dem Code in der Passwortablage verglichen.
hanna.meier:827ccb0eea8a706c4c34a16891f84e7b
max.mueller:2e1e9ab1fb615c2176f4ea84dca08353
sepp.blumewiese:a8e1118f9711b4909a917a878666afbf
Das tönt jetzt alles sehr abstrakt, lass uns die Idee von einem Hash an einem einfacheren Beispiel erarbeiten.
Idee
Anstelle des Passwortes im Klartext, sollte eine Prüfsumme gespeichert werden.
Die iterierte Quersumme ist die Quersumme, die entsteht, wenn man solange immer wieder die Quersumme ausrechnet, bis nur noch eine einzige Ziffer übrig bleibt. Für die Zahl 97 lautet die normale Quersumme 16, berechnet man davon wiederum die Quersumme, so entsteht die iterierte Quersumme: 7.
Die Alternierende Quersumme entsteht durch abwechslungweises Addieren und Subtrahieren der einzelnen Ziffern (für 1234 lautet diese 1 - 2 + 3 - 4 = -2).
Aufgabe
Vervollständige die oben stehende Tabelle. Ersetze Buchstaben in Passwörtern durch die Stelle, welche der Buchstaben im Alphabet innehat.
Welche der beiden Funktionen würdest Du wählen, um die Passwörter zu speichern?
Lösung
2. Die zweite Funktion. Bei der iterierten Quersumme sind nur 10 verschiedene Werte möglich (Ziffern 0-9).
Aufgabe
Wenn jetzt ein Anbieter überprüfen möchte, ob es tatsächlich dein Passwort ist, welches Du eingegeben hast, macht er folgendes: Dazu wird vom eingegebenen Passwort zuerst der Hash-Code berechnet und dieser dann mit dem Code in der Passwortablage verglichen. D.h. in unserem Beispiel, würde vom eingegebenen Passwort die iterierte Quersumme oder die alternierende Quersumme berechnet werden und dann in der Passwortablage verglichen.
Was für ein Problem haben wir dann?
Hashfunktion
Eine Hashfunktion ist eine Einwegfunktion ("leicht" berechenbar, aber "schwer" umzukehren) sowie ist sie kollisionsresistent (d.h. wenn es „schwer“ ist, verschiedene Eingaben zu finden, die auf denselben Wert abgebildet werden), weiter muss sie für dieselben Eingaben immer denselben Hashwert generieren.
Als Analogie kann man das klassische Papier-Telefonbuch einer grösseren Stadt vorstellen: Kennt man den Namen, dann findet man sehr schnell die dazugehörige Telefonnummer. Kennt man jedoch nur die Telefonnummer, so ist es sehr aufwändig, den zugehörigen Namen zu finden.
Es gibt verschiedene kryptographische Algorithmen, z.B. MD5, SHA-256, SHA-512, SHA-384,...
Aufgabe
Bestimmte den MD5-Hashwert deines Vornamens, einmal normal und einmal nur mit Kleinbuchstaben. https://www.md5hashgenerator.com/
Von einer guten Hash-Funktion erwartet man, dass sie nicht umkehrbar ist und dass aus dem Hashcode der ursprüngliche Text nicht wiederhergestellt werden kann. Beim MD5-Verfahren ist es zwar nicht unmöglich, aber nur mit viel Rechenaufwand anzustellen. Hingegen ist es einfach, in einem entsprechenden Wörterbuch nach einem Hashcode zu suchen, dazu reicht es oft schon, den Hash-Code in Google einzugeben. Prüfe, ob du mit Google die vorher berechneten MD5-Hash-Codes deines Vornamens finden kannst.
Für Schnelle:
Damit die Passwörter aus geklauten Passwortdateien nicht ohne weiteres über Wörterbücher oder ähnliches geknackt werden könne, werden Passwörter erst einmal künstlich mit einem Vorspann verlängert. Man spricht von salting. Erst dann wird das Passwort gehasht:
i Passwort : MeiNPassWor1
ii Modifikation : $1$89kkfmeu39r$MeiNPassWor1
iii Md5 : 9428843ab1b2ae548e0edb3e4fc6fba9
iv Ablage : $1$89kkfmeu39r$9428843ab1b2ae548e0edb3e4fc6fba9
Das salting von Hash-Codes hat den Vorteil, das zwei Benutzer mit dem gleichen Passwortunterschiedliche Zufallswerte und damit unterschiedliche Hash-Werte zugewiesen bekommen, mit dem Ergebnis, dass am Hash nicht zu erkennen ist, ob die Passwörter gleich sind. Lies dazu: Salted_Hash
Führe die obigen vier Schritte (i-iv) mit einem Passwort und Salt deiner Wahl selber durch.
Für Schnelle und Interessierte noch dieses Video
Datenintegrität
Wie können wir sicher sein, dass die Daten bei z.B. einer Datenübertragung nicht verändert wurden?
Eine wichtige Rolle in der Realität spielen dabei Prüfziffern oder Prüfsummen.
Prüfsumme
In der Informationstechnik ist eine Prüfsumme (englisch checksum) ein Wert, mit dem die Integrität von Daten überprüft werden kann.
Grundsätzlich ist eine Prüfsumme ein Wert, der aus den Ausgangsdaten berechnet wurde und in der Lage ist, bestimmte Fehler in den Daten zu erkennen. Je nachdem wie komplex die Berechnungsvorschrift für die Prüfsumme ist, können mehrere Fehler erkannt oder auch korrigiert werden.
Prüfsummen werden typischerweise dazu verwendet, um zu plausibilisieren, dass zwei Datensätze übereinstimmen oder ein einziger Datensatz in sich konsistent ist. Sie haben verschiedene Anwendungsgebiete:
Datenübertragung: Die aus den Ausgangsdaten errechnete Prüfsumme wird vom Sender mit den Daten übertragen. Der Empfänger berechnet nun aus den empfangenen Daten nach dem gleichen Verfahren die Prüfsumme und vergleicht diese mit der übertragenen Prüfsumme des Senders. Unterscheiden sich beide Prüfsummen, so liegt ein Übertragungsfehler vor. Sind die beiden Prüfsummen identisch, so ist die Nachricht wahrscheinlich korrekt übertragen worden.
Datensicherung: Hier wird die Prüfsumme der Daten vor dem Speichern mit der Prüfsumme der Daten nach dem Wiederauslesen verglichen.
Manuelle Dateneingabe: Wenn Daten von Hand eingegeben werden, ist die Prüfsumme Bestandteil der Eingabe, um Eingabefehler zu erkennen.
Datenintegrität: Besondere kryptographische Hashfunktionen wie etwa die Methode SHA-256 werden angewendet, wenn sichergestellt werden soll, dass Daten seit der Errechnung der Prüfsumme nicht verändert wurden.
Alltagsbeispiel
Die Schweizer Identitätskarte entählt einige Informationen über uns. Wie wir heissen, wie gross wir sind, was unser Heimatort ist und vieles mehr.
Doch es gibt auch einige Zahlen, bei denen nicht auf den ersten Blick klar ist, was sie bedeuten - z.B. die letzte Zahl in der zweiten Reihe.
Diese Zahl ist eine Prüfziffer. Sie stellt sicher, dass beim Einlesen der Karte, keine Fehler aufgetreten sind. Die Berechnung ist ziemlich einfach:
Schweizer Identitäskarte:
Ausweisnummer: S1A00A00, Prüfziffer 9
Geburtsdatum (JJMMTT): 950801, Prüfziffer 5
Gültig Bis (JJMMTT): 330322, Prüfziffer 8
Globale Prüfziffer 2
Prüfziffern Ausweisnummer, Geburtsdatum, Gültigkeitsdatum:
Das Prinzip ist sehr einfach, um auf die Prüfziffern zu kommen für Geburtsdatum sowie Gültigkeitsdatum: alle Zahlen werden nacheinander mit 7, 3, 1 multipliziert und dann alles zusammengezählt, die letzte Stelle der Summe ist die Prüfziffer.
Bsp. Geburtsdatum ist 950801 (01.08.95). 9*7 + 5*3 + 0*1 + 8*7 + 0*3 + 1*1 = 135. 5 ist die Prüfziffer.
Für die Ausweisnummer funktioniert es nach demselben Prinzip, nur dass für Buchstaben ein numerischer Wert eingesetzt werden muss, und zwar nach dem Prinzip A = 0, B = 1, C = 2, etc.
Globale Prüfsumme:
Das Prinzip ist genau dasselbe, nur muss man alle Daten nehmen und miteinander verrechnen. Wichtig dabei ist, dass bei der Ausweisnummer ein > die Prüfziffer von der Nummer trennt. Dieses > muss bei der Ausführung durch eine 0 ersetzt werden. Ansonsten ist das Prinzip genau gleich:
Aufgabe
Berechne die globale Prüfziffer auf deiner ID. Kommst Du auf dasselbe Resultat?