Medienbildung und Informatik
Folgende Aufgaben haben Programmieranfänger von mir nach ca. vier Einheiten Python bekommen. Das Beispiel zeigt – finde ich – ganz gut, dass Medienkompetenz und Informatik sich sehr gut ergänzen können, teilweise vielleicht sogar einander bedingen. Das Problem der Passwortlänge und dem Passwortaufbau wird hier bewusst nicht angesprochen, weil das programmiertechnisch etwas anspruchsvoller ist. Das kommt dann in der Folgestunde.
Weiterhin ist natürlich auch das sha-2-Verschlüsselungsverfahren moderneren Entwicklungen wie z.B. pbkdf2 weit unterlegen, aber auch programmiertechnisch wesentlich beherrschbarer. sha512 ist schon ganz ok, auch wenn heutige Grafikkarten ca. 200 Millionen Schlüssel pro Sekunde berechnen.
Kryptografie
Immer wieder hörst du davon, dass bei großen Anbietern Datenbankinhalte gestohlen werden. In dem Artikel steht allerdings nichts davon, dass Passwörter gestohlen werden, sondern Hashes. Heute wirst du lernen, dass du jetzt schon ganz einfach viel besser sein kannst als LinkedIn und das mit nur ganz wenigen Codezeilen in Python.
Um alles möglichst gut zu verstehen, musst du auf jeden Fall die beiden oben verlinkten Artikel lesen oder wenigstens überfliegen.
Aufgabe 1:
Nimm eines deiner Passwörter und lasse folgendes Programm laufen (z.B. auf https://try.jupyter.org ).
1 2 3 4 5 6 7 | # wir weisen Python an, Kryptografiefunktionen zu laden import hashlib # wir fragen nach einem Passwort crypted_phrase = input() # Und geben den Hash des Passworts als MD5-Hash aus print("Hash is:") print(hashlib.md5(crypted_phrase.encode('utf-8')).hexdigest()) |
Nimm jetzt den Hash und kopiere ihn auf diese Seite. Nach Eingabe der Sicherheitsabfrage (reCaptcha) kannst du schauen, ob der Hash deines Passworts bereits bekannt ist (Wenn du das Verfahren mit dem Passwort „12345678“ durchführst, wirst du sehen, dass das „geknackt“ wird.
Wiederhole das Verfahren mit einem deiner Passwörter und folgendem Programm (mit „12345678“ klappt es! – auch mit deinem Passwort?):
1 2 3 4 5 6 7 | # wir weisen Python an, Kryptografiefunktionen zu laden import hashlib # wir fragen nach einem Passwort crypted_phrase = input() # Und geben den Hash des Passworts als MD5-Hash aus print("Hash is:") print(hashlib.sha512(crypted_phrase.encode('utf-8')).hexdigest()) |
Wenn dein Passwort auch im zweiten Fall „geknackt“ wurde, hast du ein Problem, wenn du Opfer eines Datenbankdiebstahls wirst. Auch dein Anbieter wird nur Hashes in einer Datenbank speichern.
Informiere dich jetzt über den Unterschied zwischen dem md5- und dem sha512-Verschlüsselungsverfahren. Python kann folgende Verfahren „von Natur aus“: md5, sha1, sha224, sha256, sha384, sha512.
Aufgabe 2:
Das Problem ist schon lange gelöst – mit nur wenigen Codezeilen mehr. Informiere dich über den Begriff „Salt“ in Verbindung mit Hashes.
1 2 3 4 5 6 | import hashlib # Statt "somestring" kannst bzw. solltest du möglichst wirres Zeug hier reinschreiben salt = "somestring" crypted_phrase = input() salted_password = crypted_phrase + salt print(hashlib.md5(salted_password.encode('utf-8')).hexdigest()) |
Wenn du jetzt versuchst, den Hash cracken zu lassen, klappt das nicht mehr, weil ein sogenanntest „salt“ (Salz) zum Passwort hinzugefügt wird. Bei unserem Programm verwendet jedes Passwort jedoch den gleichen Salt.
Auch dafür gibt es eine Lösung:
1 2 3 4 5 6 | import hashlib, uuid # Python schreibt nun für dich wirres Zeug hier hinein salt = uuid.uuid4().hex crypted_phrase = input() salted_password = crypted_phrase + salt print(hashlib.md5(salted_password.encode('utf-8')).hexdigest()) |
Hätten LinkedIn und andere die Benutzerpasswörter mit einem sicheren Algorithmus (z.B. sha512) gehasht und mit einem Salt versehen, wäre der Diebstahl der Datenbanken nicht so ein großes Problem, da es sehr lange dauern würde, die Passwörter aus den Hashes zu errechnen.
In der Praxis speichert man die Salts im Klartext zusammen mit den Hashes, meist durch ein Trennzeichen abgesetzt. Du kannst ja einmal überlegen, warum das kein Problem darstellt.
Aufgabe 3:
Schreibe folgende Programme
- Es wird zweimal ein Passwort abgefragt und dazu ein Hash berechnet. Stimmen beide Hashes (und damit die Passwörter) überein, soll das Programm die Ausgabe „Access granted!“ machen, ansonsten „Access denied!“ ausgeben.
- Ein Programm fragt nach einem „Masterpasswort“ (password) und einem Domainnamen (salt). Es berechnet daraus einen Hash, den man als Passwort für die betreffende Webseite benutzen kann – wenn man immer das richtige Masterpasswort und den gleichen Domainnamen eingibt – quasi ein ganz einfacher Passwortmanager!
Pingback: Was sind Hashes? | digithek blog
Hallo!
Bei den Hash-Algorithmen würde ich gar nicht so sehr auf den Unterschied zwischen MD5 und SHA eingehen. Ich habe zumindest im Bereich des Passwortknackens noch nicht davon gehört, dass dort jemand Kollisionsangriffe fährt.
Neben der Nutzung des Salts, mit dem Rainbow-Tables unmöglich werden, würde ich eher darauf eingehen, dass sich Hashfunktionen für das Speichern von Passwörtern relativ schlecht eigenen, da sie sich sehr schnell berechnen lassen. Deswegen nutzt man in den modernen Verfahren die große Anzahl an Runden.
Viele Grüße
Markus
Hm,
Ich verstehe nicht, warum es ein Problem ist, dass sich Hashes sehr schnell berechnen lassen. Das ist doch für gängige Anwendungsfälle mit häufigen Loginprozessen doch ein immenser Vorteil, weil der Server weniger Ressourcen bereitstellen muss. Durch Salts werden Regenbogentabellen ja nicht per se unmöglich, aber der Rechenaufwand steigt halt immens und ist für schwache Passwörter ja immer noch vertretbar gering.
Gruß,
Maik
Hallo,
es stimmt, dass die schnelle Berechenbarkeit von Hashes ein Vorteil für die Server ist. Wir reden beim Knacken aber mittlerweile von ca. 20 Milliarden Hashes pro Sekunde [1]. Natürlich wählt man die Rundenzahl klein genug, dass der Server durch die Logins nicht in die Knie geht. Sie muss aber groß genug sein, dass Brute-Force keinen Spaß mehr macht.
Über sichere Passwörter, die nur auf einer Seite genutzt werden, brauchen wir hier sowieso nicht reden. Die knackt niemand, solange er keine Kollision mit einem kürzeren Passwort findet.
Salts machen Regenbogentabellen überflüssig, da man (bei zufälliger Wahl des Salts) für jeden Hash seine eigene Tabelle erstellen müsste. Der Sinn ist es ja gerade, eine Tabelle zu erstellen, mit der man sehr viele Passwörter knacken kann. Ist das Passwort gesalzen, die Hashfunktion aber schnell, muss man halt wieder seine Grafikkarte anschmeißen und hat das (schlechte) Passwort aber auch wieder in kurzer Zeit berechnet.
Zusammengefasst: Salt verhindert die Erstellung von Regenbogentabellen, der (verlangsamte) Hash-Algorithmus die Brute-Force-Methode.
Viele Grüße
Markus
[1] https://hashcat.net/forum/thread-4314-post-24558.html#pid24558
In der Praxis werden Datenbanken mit Hashes geklaut und verbreitet – wie bei LinkedIn. Das sind teilweise Zero-Day-Exploits, gegen die keine Gegenwehr möglich ist. Ich habe auch nie begriffen, was eine Firewall gegen löchrige Applikationen genau tun soll – viele fühlen sich ja sicher, wenn da die rote Kiste für 5k Euro steht.
Bruteforcen tut man als Angreifer (oder Geheimdienst) in der Regel dann die vorliegenden Hashes. Oder man man mietet sich für kleines Geld ein Botnetz, was das distributed tut. Da greift dann keine klebrige Passwortabfrage mehr. Das kann mittlerweile auch als S:S tun.
Die Hashes müssen halt dann immer Zweifel so lange „durchhalten“, dass der jeweilige Anbieter Gegenmaßnahmen ergreifen kann.
Wie auch immer: Komplexe Passwörter + ein guter Hashalgorithmus mit Salt + gut gepflegte Dienste im Hintergrund.
Pingback: Aufbau Blog/Blogeintrag | Gesunde Desserts – Schulprojekt