Weisst du was MD5 ist? MD5 ist toll! MD5 ist sogar so toll, das es jeder benutzt. Warum auch nicht, in PHP ist es einfach nur simpel
$hash = md5(„Hallo“);
und das war`s schon. Für alle die denken dies wäre vielleicht ein Modell einer Automarke des Fernen Ostens: MD5 (Message-Digest Algorithm 5) ist eine kryptografisch nicht ganz sichere, praktisch jedoch immer noch ausreichende Hashfunktion. Diese ist dazu da, eine Zeichenkette beliebiger länge durch „wenige“ Bits ( 128 ) zusammenzufassen. Es ist also eine Art Fingerabdruck. Ein Merkmal von Hashfunktionen ist, das selbige nicht zurückgerechnet werden kann. Sei also M und M‘ jeweils unterschiedliche Strings, soll es nicht möglich sein folgendes zu finden:
Hash(M) = Hash(M‘)
man spricht auch von Kollisionsfreiheit.
Soviel zu den Grundlagen. In der Praxis werden Hashfunktionen hauptsächlich für MACs (Message Authentication Codes) verwendet. Das ist aber nicht alles, denn in den meisten Fällen werden damit Passwörter in einer Datenbank gespeichert. Die Idee ist, das falls die Datenbank mal „gehackt“ wird (z.B. SQL-Injection), der Bösewicht keine Informationen über das verwendete Passwort bekommt. Häufig ist es so, das Anwender das gleiche Passwort mehrfach verwenden, also auch für den E-Mail Account. Und damit ergeben sich ungeahnt viele Möglichkeiten.
Die Idee ist super, also ein unleserliches Passwort auf der einen Seite und trotzdem volle Funktionalität. Wo ist also jetzt der Haken? Das ist recht einfach, denn für die meisten kleinen Passwörter wurde das MD5 schon „durchgerechnet“. D.h. in einer großen Datenbanken stehen jeweils Klartext und Hashwert. Das trägt den schönen Namen „Rainbow Table“ und ist recht bekannt. Dadurch ergibt sich ja aber immer noch kein Sicherheitsproblem, denken Sie nun. Denn immerhin muss der Angreifer erstmal an diesen Hashwert kommen. Das stimmt jedoch nur halb, denn Google hilft!
Wenn ich „abc123“, als schlechtes aber häufig verwendetes Passwort hashen lasse, erhalte ich „e99a18c428cb38d5f260853678922e03“. Dies gebe ich einfach mal in Google ein. Nicht sehr viel später finde ich (bedingt durch die Einzigartigkeit) verschiedene Sicherheitslücken in Webanwendungen.
An dieser Stelle nehme ich natürlich abstand Beispiele zu nennen. Ungelogen hat es jedoch nicht lange gedauert bis ich eine Art Interface gefunden hatte, auf welcher mehrere Benutzer und dessen Passwort (in MD5) aufgelistet waren.
Wie geht es besser? Es sollte, bei dem Einsatz von MD5, immer eine Art Padding oder geheimen Schlüssel verwendet werden. Beispiel:
$hash = md5($passwort . „DiesIstEinGeheimerSchluessel“);
Dieser kann dann in die Datenbank geschrieben werden. Falls nun mal was passiert, sollte der Angreifer wenigstens in keiner Rainbowtable fündig werden. Moderne Hashverfahren bieten diese Funktionalität (das angeben eines Schlüssels) automatisch, aber auch mit MD5 lässt sich unter diesen Voraussetzungen arbeiten.
Ich danke für die Aufmerksamkeit bei meinem ersten konstruktiven Blogeintrag.