Medienbildung und Informatik

Fol­gen­de Auf­ga­ben haben Pro­gram­mier­an­fän­ger von mir nach ca. vier Ein­hei­ten Python bekom­men. Das Bei­spiel zeigt — fin­de ich — ganz gut, dass Medi­en­kom­pe­tenz und Infor­ma­tik sich sehr gut ergän­zen kön­nen, teil­wei­se viel­leicht sogar ein­an­der bedin­gen. Das Pro­blem der Pass­wort­län­ge und dem Pass­wort­auf­bau wird hier bewusst nicht ange­spro­chen, weil das pro­gram­mier­tech­nisch etwas anspruchs­vol­ler ist. Das kommt dann in der Fol­ge­stun­de.
Wei­ter­hin ist natür­lich auch das sha-2-Ver­schlüs­se­lungs­ver­fah­ren moder­ne­ren Ent­wick­lun­gen wie z.B. pbkdf2 weit unter­le­gen, aber auch pro­gram­mier­tech­nisch wesent­lich beherrsch­ba­rer. sha512 ist schon ganz ok, auch wenn heu­ti­ge Gra­fik­kar­ten ca. 200 Mil­lio­nen Schlüs­sel pro Sekun­de berech­nen.

Kryptografie

Immer wie­der hörst du davon, dass bei gro­ßen Anbie­tern Daten­bank­in­hal­te gestoh­len wer­den. In dem Arti­kel steht aller­dings nichts davon, dass Pass­wör­ter gestoh­len wer­den, son­dern Hash­es. Heu­te wirst du ler­nen, dass du jetzt schon ganz ein­fach viel bes­ser sein kannst als Lin­kedIn und das mit nur ganz weni­gen Code­zei­len in Python.

Um alles mög­lichst gut zu ver­ste­hen, musst du auf jeden Fall die bei­den oben ver­link­ten Arti­kel lesen oder wenigs­tens über­flie­gen.

Aufgabe 1:

Nimm eines dei­ner Pass­wör­ter und las­se fol­gen­des Pro­gramm lau­fen (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 kopie­re ihn auf die­se Sei­te. Nach Ein­ga­be der Sicher­heits­ab­fra­ge (reCap­t­cha) kannst du schau­en, ob der Hash dei­nes Pass­worts bereits bekannt ist (Wenn du das Ver­fah­ren mit dem Pass­wort „12345678“ durch­führst, wirst du sehen, dass das „geknackt“ wird.

Wie­der­ho­le das Ver­fah­ren mit einem dei­ner Pass­wör­ter und fol­gen­dem Pro­gramm (mit „12345678“ klappt es! — auch mit dei­nem Pass­wort?):

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 Pass­wort auch im zwei­ten Fall „geknackt“ wur­de, hast du ein Pro­blem, wenn du Opfer eines Daten­bank­dieb­stahls wirst. Auch dein Anbie­ter wird nur Hash­es in einer Daten­bank spei­chern.

Infor­mie­re dich jetzt über den Unter­schied zwi­schen dem md5- und dem sha512-Ver­schlüs­se­lungs­ver­fah­ren. Python kann fol­gen­de Ver­fah­ren „von Natur aus“: md5, sha1, sha224, sha256, sha384, sha512.

Aufgabe 2:

Das Pro­blem ist schon lan­ge gelöst — mit nur weni­gen Code­zei­len mehr. Infor­mie­re dich über den Begriff „Salt“ in Ver­bin­dung mit Hash­es.

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 ver­suchst, den Hash cra­cken zu las­sen, klappt das nicht mehr, weil ein soge­nann­test „salt“ (Salz) zum Pass­wort hin­zu­ge­fügt wird. Bei unse­rem Pro­gramm ver­wen­det jedes Pass­wort jedoch den glei­chen 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ät­ten Lin­kedIn und ande­re die Benut­zer­pass­wör­ter mit einem siche­ren Algo­rith­mus (z.B. sha512) gehasht und mit einem Salt ver­se­hen, wäre der Dieb­stahl der Daten­ban­ken nicht so ein gro­ßes Pro­blem, da es sehr lan­ge dau­ern wür­de, die Pass­wör­ter aus den Hash­es zu errech­nen.

In der Pra­xis spei­chert man die Salts im Klar­text zusam­men mit den Hash­es, meist durch ein Trenn­zei­chen abge­setzt. Du kannst ja ein­mal über­le­gen, war­um das kein Pro­blem dar­stellt.

Aufgabe 3:

Schrei­be fol­gen­de Pro­gram­me

  1. Es wird zwei­mal ein Pass­wort abge­fragt und dazu ein Hash berech­net. Stim­men bei­de Hash­es (und damit die Pass­wör­ter) über­ein, soll das Pro­gramm die Aus­ga­be „Access gran­ted!“ machen, ansons­ten „Access denied!“ aus­ge­ben.
  2. Ein Pro­gramm fragt nach einem „Mas­ter­pass­wort“ (pass­word) und einem Domain­na­men (salt). Es berech­net dar­aus einen Hash, den man als Pass­wort für die betref­fen­de Web­sei­te benut­zen kann — wenn man immer das rich­ti­ge Mas­ter­pass­wort und den glei­chen Domain­na­men ein­gibt — qua­si ein ganz ein­fa­cher Pass­wort­ma­na­ger!
Facebook Like

6 Kommentare

  • Pingback: Was sind Hashes? | digithek blog

  • Markus

    Hal­lo!

    Bei den Hash-Algo­rith­men wür­de ich gar nicht so sehr auf den Unter­schied zwi­schen MD5 und SHA ein­ge­hen. Ich habe zumin­dest im Bereich des Pass­wort­kna­ckens noch nicht davon gehört, dass dort jemand Kol­li­si­ons­an­grif­fe fährt.

    Neben der Nut­zung des Salts, mit dem Rain­bow-Tables unmög­lich wer­den, wür­de ich eher dar­auf ein­ge­hen, dass sich Hash­funk­tio­nen für das Spei­chern von Pass­wör­tern rela­tiv schlecht eige­nen, da sie sich sehr schnell berech­nen las­sen. Des­we­gen nutzt man in den moder­nen Ver­fah­ren die gro­ße Anzahl an Run­den.

    Vie­le Grü­ße
    Mar­kus

    • Hm,

      Ich ver­ste­he nicht, war­um es ein Pro­blem ist, dass sich Hash­es sehr schnell berech­nen las­sen. Das ist doch für gän­gi­ge Anwen­dungs­fäl­le mit häu­fi­gen Log­in­pro­zes­sen doch ein immenser Vor­teil, weil der Ser­ver weni­ger Res­sour­cen bereit­stel­len muss. Durch Salts wer­den Regen­bo­gen­ta­bel­len ja nicht per se unmög­lich, aber der Rechen­auf­wand steigt halt immens und ist für schwa­che Pass­wör­ter ja immer noch ver­tret­bar gering.

      Gruß,

      Maik

      • Markus

        Hal­lo,

        es stimmt, dass die schnel­le Bere­chen­bar­keit von Hash­es ein Vor­teil für die Ser­ver ist. Wir reden beim Kna­cken aber mitt­ler­wei­le von ca. 20 Mil­li­ar­den Hash­es pro Sekun­de [1]. Natür­lich wählt man die Run­den­zahl klein genug, dass der Ser­ver durch die Log­ins nicht in die Knie geht. Sie muss aber groß genug sein, dass Bru­te-Force kei­nen Spaß mehr macht.

        Über siche­re Pass­wör­ter, die nur auf einer Sei­te genutzt wer­den, brau­chen wir hier sowie­so nicht reden. Die knackt nie­mand, solan­ge er kei­ne Kol­li­si­on mit einem kür­ze­ren Pass­wort fin­det.

        Salts machen Regen­bo­gen­ta­bel­len über­flüs­sig, da man (bei zufäl­li­ger Wahl des Salts) für jeden Hash sei­ne eige­ne Tabel­le erstel­len müss­te. Der Sinn ist es ja gera­de, eine Tabel­le zu erstel­len, mit der man sehr vie­le Pass­wör­ter kna­cken kann. Ist das Pass­wort gesal­zen, die Hash­funk­ti­on aber schnell, muss man halt wie­der sei­ne Gra­fik­kar­te anschmei­ßen und hat das (schlech­te) Pass­wort aber auch wie­der in kur­zer Zeit berech­net.

        Zusam­men­ge­fasst: Salt ver­hin­dert die Erstel­lung von Regen­bo­gen­ta­bel­len, der (ver­lang­sam­te) Hash-Algo­rith­mus die Bru­te-Force-Metho­de.

        Vie­le Grü­ße
        Mar­kus

        [1] https://hashcat.net/forum/thread-4314-post-24558.html#pid24558

        • In der Pra­xis wer­den Daten­ban­ken mit Hash­es geklaut und ver­brei­tet — wie bei Lin­kedIn. Das sind teil­wei­se Zero-Day-Exploits, gegen die kei­ne Gegen­wehr mög­lich ist. Ich habe auch nie begrif­fen, was eine Fire­wall gegen löch­ri­ge Appli­ka­tio­nen genau tun soll — vie­le füh­len sich ja sicher, wenn da die rote Kis­te für 5k Euro steht.
          Bru­teforcen tut man als Angrei­fer (oder Geheim­dienst) in der Regel dann die vor­lie­gen­den Hash­es. Oder man man mie­tet sich für klei­nes Geld ein Bot­netz, was das dis­tri­bu­t­ed tut. Da greift dann kei­ne kleb­ri­ge Pass­wort­ab­fra­ge mehr. Das kann mitt­ler­wei­le auch als S:S tun.
          Die Hash­es müs­sen halt dann immer Zwei­fel so lan­ge „durch­hal­ten”, dass der jewei­li­ge Anbie­ter Gegen­maß­nah­men ergrei­fen kann.

          Wie auch immer: Kom­ple­xe Pass­wör­ter + ein guter Hash­al­go­rith­mus mit Salt + gut gepfleg­te Diens­te im Hin­ter­grund.

  • Pingback: Aufbau Blog/Blogeintrag | Gesunde Desserts – Schulprojekt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.