16.08.11
Hashfunktion einfach erklärt
...damit es jeder versteht.
Anlässlich einer Diskussion, dass MD5 unsicher sei und man lieber SHA1 benutzen sollte, hier mal eine kleine, einfache Erklärung wie eine Hashfunktion funktioniert und kurz was es ist.Hashfunktion(Eingangswert) = Hashwert
Ein Hash ist ein Wert einer Berechnung aus einem Eingangswert. Im Optimalfall ist der Eingangswert wesentlich größer als der Hashwert und der Hashwert selbst immer gleich lang, egal welcher Eingangswert ihm zu Grunde liegt. Daraus folgt die wichtigste Eigenschaft eines Hashwertes: Mehrere Eingangswerte ergeben den selben Hash.
Angenommen meine Hashfunktion sei: Quersumme
Eingangswert beispielsweise: 123
Hashfunktion rechnet: 1 + 2 + 3
-> Hashwert: 6
Umkehrungsversuch der Hashfunktion:
6 = x+y+z
...so da scheitert schonmal theoretisch die Standardmathematik, da man keine weiteren Gleichungen hat und 3 unbekannte Variablen. Durch Probieren wissen wir aber, dass es z.B. 1+1+4 sein kann. Oder 3+3+0. Oder 6+0+0.. es gibt eben eine ganze Reihe möglicher Lösungen. Und alle sind gewissermaßen gleichwertig von Bedeutung. Also keine zeigt an, dass sie die Richtige ist, die ursprünglich benutzt wurde, um diesen Hashwert zu erzeugen.
Darin sieht man auch den Sinn einer Hashfunktion: Das tarnen des Eingangswertes. Und trotz der Tarnung kann in gewissem Maße die Gleichheit eines Eingangswertes festgestellt werden: Indem man einfach den Hashwert bildet und diesen vergleicht. Dieses Prinzip wird bei allen großen Systemen benutzt, um Passwörter risikolos in einer Datenbank zu speichern und trotzdem beim Login vergleichen zu können.
Nachwort:
So und wer jetzt weiter über dieses Thema in dummen Foren liest, mag in den glauben kommen, dass solch eine Hashfunktion doch irgendwie umkehrbar sei: NEIN!, eine solche Einwegfunktion ist nicht umkehrbar. Man kann nur gleiche Eingangswerte erzeugen aus einem gegebenen Hashwert (Kollision finden) und diese Eingangswerte sind dann auch für Logins zu gebrauchen und funktionieren. Jedoch sind dies immer ANDERE Eingangswerte und nur sehr unwahrscheinlich genau der originale Eingangswert. Moderne Hashfunktionen haben einen sehr großen Ergebnisraum und unendlich viele Eingangswerte für einen Hashwert. Achja und den gespeicherten Hashwert sieht normalerweise auch nur der, der schon Zugriff auf die Datenbank hat. Und wer Vollzugriff hat, braucht ja keinen Login mehr.
Du wirst dann vielleicht auch auf Webseiten stoßen, die angeben einen Hash knacken zu können, aber die machen nicht mehr als in einer vorberechneten Datenbank von einfachen Wörtern zu Hashwerten nach dem passenden Pärchen zu suchen. Sowas nennt sich Rainbow table lookup. Einfachste und generell empfohlene Lösung um auch einfache Wörter als Hash zu speichern: Salting. Dabei fügt man zu jedem Eingangswert einfach einen bestimmten festgelegten Zusatzwert dazu und berechnet dann den Hash nur aus diesen Ergenissen. Schon hat man komplett andere Hashwerte, die nicht in einer normalen Rainbow table zu finden sind.
![](v6/img/pixl.gif)