Um mal wieder etwas hochwertigeren Content in den Blog zu bekommen widme ich mich - aufgrund aktueller Anlässe - mal dem Thema HASH. Wieso aus aktuellem Anlass ? Nun der medial wirksame Sony Skandal hat nur mal Licht ins Dunkel der Datenhelerei gebracht, neben Sony sind auch unbekanntere Firmen wie Ashampoo von Datenlecks betroffen. In den meisten fällen sollte bei seriösen Anbietern das eigene Password niemals in Klartext gespeichert werden sondern lediglich der Hashwert. Klares Nein. Ohne viel Text auszupacken kann man es so beschreiben: Verschlüsselte Texte kann man auch immer wieder entschlüsseln, einen Hash nicht. Anderes Beispiel anhand der universellen Sprache, Mathematik :) Die Quersumme aus "1 2 3 4 5" ergibt 15 (1+2+3+4+5 = 15) die 15 ist vereinfacht dargestellt der Hashwert, habe ich nun die Zahl 15 kann ich nicht unweigerlich davon ausgehen das der vorherige Text 12345 lautete es hätte auch "1 1 1 1 1 5 5" sein können oder auch "2 2 2 2 2 4 1" oder ganz was anderes. Man sieht die Quersumme (Unser angenommener Beispiel Hash) ist jedes mal 15 aber 15 ergibt nicht jedes mal unsere Ausgangszahl. Bei den Hashmechanismen gibt es mehrere Methoden mathematisch einen Hash zu erstellen, am weitest verbreitet sind die MD5 und SHA Algorithmen. Andere, nur um sie mal genannt zu haben, wären Whirlpool, Tiger, RipeMD, Haval, Adler32. Da bei sämtlichen dieser Hashes nicht einfach nur jedes Zeichen unseres Textes addiert wird, bieten sie mehr Möglichkeiten. Mal unser Beispiel "12345" gehashed: 12345 in md5 = 827ccb0eea8a706c4c34a16891f84e7b 12345 in SHA-1 = 8cb2237d0679ca88db6464eac60da96345513964 12345 in Haval = e958f98ec7d548caa2d5c5c109111243 Man sieht die entstehenden Zeichenketten sind länger als der eigentliche Quelltext, damit lässt sich auch nicht auf die Ursprungslänge schließen - Ein Hash ist innerhalb der Hashmethode immer gleich lang. Es ist also schwer möglich aus dem Zahlensalat wieder Klartext zu machen. Auch hier wieder ein klares Nein. Ein Hash an sich ist zwar nicht per Funktion umkehrbar doch wo ein Wille da auch ein Weg. Es gibt einige alte Hash Methoden welche bereits als "geknackt" bezeichnet werden, hier ist es gelungen einen Weg zu schaffen mit komplexen Formeln einen Hash umzukehren oder alle durch den Hash abbildbaren Werte zu wissen. CRC32 z.B. oder MD4 werden allgemein als unsicher bezeichnet. Dennoch auch die "Großen" Hashes wie SHA-256 oder gar ein SHA-512 sind nur so "stark" wie ihr Inhalt. Meist werden so genannte "Brute Force" Attacken genutzt um zu versuchen einen Hashwert zu entziffern, hier werden nach und nach alle möglichen Kombinationen durchprobiert und mit dem bekannten Hashwert verglichen, stimmt er überein so hat man zwar nicht zwangsläufig das Password aber man hat einen Wert welcher im Späteren Login einer Prüfung standhält und einen somit passieren lässt. Hashwerte wie der SHA-512 können von heutigen Computern nicht rückgerechnet werden. Aber auch der oft verwendete MD5 wird nicht mehr als 1. Wahl betrachtet da hier ein publizierter Angriff (Kollision) existiert welcher den Hash aushebeln kann. Im netz existieren viele so genannte "Rainbow Tables" dies sind Datenbanken mit bereits bekannten Hashwerten. Benutzt man nun den Hash z.B. für ein Password und wählt hier ein normal bekanntes Wort oder eine Kombination wie unsere obige "12345" so ist der Hash wahrscheinlich bekannt und ein Angreifer der an den Hashwert kommt kann schnell von Hash auf Password schließen. Nun es kommt auf den Anbieter an, ein Hash alleine ist nicht sehr sicher, daher verwendet man meist ein "Salt" um das im Hash vorhandene zu variieren. Salz ? Ja, vom Salz in die Suppe streuen ;) Oder von mir aus dem Angreifer den Spaß zu versalzen ;) Ein Beispiel, wir nehmen an unser Username ist "Hans" und unser Password "12345" so würde man in einer einfachen SALT den Username hinzufügen also z.B.: Hans12345 = 378a3f0ec199099d4d835d34466b9f38892ff48c (SHA-1) Nun geht man in der Regel weiter und verwendet noch nur im Systemquellcode gespeicherte Parameter um das gespeicherte zu versalzen, dies könnte dann z.b. so aussehen: SHA("Dj§d=)3"+$USERNAME+"§)4(.32E"+$PASSWORD) Also mit unserem Beispiel: Dj§d=)3Hans§)4(.32E12345 Dieser Wert wird niemals in einer Rainbow Table zu finden sein da er a) zu lang ist b) nicht aus klaren Worten in allgemeiner Verwendung besteht. Der Hash davon würde übrigens so aussehen: 386abf31292302ce0d32991f6e9d4e7c16e85b85 (SHA-1) Selbst wenn ein Angreifer an die Datenbank kommt so bräuchte er noch den Salt um eine eigene Rainbow Table erstellen zu können. Nicht unmöglich, aber jeder Stein den man in den Weg schmeißt macht ein System sicherer. Nein! Sollte ein "Einbrecher" auch an die Quelltexte kommen und damit den Salt erhalten so braucht er zwar eine lange Zeit um eine eigene Rainbow Table zu erstellen aber es ist möglich. Daher ist es wichtig das ein Passwort immer so gewählt wird das es kein "Lexikon Wort" ist. Diese können wie geschrieben durch Rainbow Tables schnell ausfindig gemacht werden. Es hilft schon wenn man zwei Wörter kombiniert. Statt als Password "12345" zu verwenden könnte man viel erreichen wenn man alternativ "12345!grün" verwendet. a) ist es länger b) enthält es nun nicht nur eine bekannte Zahlenfolge c) ist ein Satzzeichen inkludiert. Man kann das ganze nun auf die Spitze treiben und solche Passwörter wählen: "Q1§rEe9µ" aber das kann sich ja kein Schwein mehr merken. Von daher nicht konsequent die Arme verschränken und gar nichts tun sondern variieren. Es können ja auch einprägsame oder bekannte Namen / Begriffe sein nur sollten diese dringend mit anderen kombiniert werden. z.B. das eigene Kennzeichen/telefon/plz + Satzzeichen als Trenner + ein Zufallswort: "BOBE1337#Brause" und schon kann eine normale Rainbow Table selbst bei ungesaltetem Password nichts mehr ausrichten. Der Angreifer müsste mühselig per Bruteforce versuchen den Hash zu ermitteln was bei starken Hash Methoden Jahrzehnte für ein einziges Password dauern kann. Zur eigenen Sicherheit sollte man sich seine Persönliche "Password Regel" auferlegen, niemals einfache Wörter verwenden und am besten immer min 8 stellen. Dann kann es einem zwar nicht egal sein wie Anbieter mit den eigenen Passwörtern umgehen, jedoch ist es beruhigender wenn nicht jeder mein Password in Klartext vor sich sieht. Weiterführende Artikel die tiefer in die Materie eingehen:Hash ist also eine Verschlüsselung ?
Also ist ein Passwort Hash ist nicht umkehrbar und somit 100% sicher ?
Na toll, also bringt das alles nichts ?
Na wenn gesalted dann ist die Passwortqualität doch egal ?
Fazit