Für Hash-Funktionen gibt es verschiedene Einsatzbereiche.
In dieser Diskussion liegt der Fokus auf der Verwendung innerhalb von Kryptographie, mein Fokus dieser Beschreibung liegt entsprechend auch auf dieser Verwendungsart.
In möglichst einfachen Worten:
Eine Hash-Funktion ist eine
Einwegfunktion, die Input beliebiger länge entgegennimmt und davon Output einer festen Länge generiert.
Hierbei sollte ein Ungleichgewicht zwischen Input und Output auffallen, da es, theoretisch, unendlich viele Möglichkeiten für den Input (er ist von der Länge her unbegrenzt), aber nur endlich viele Abbilder für den Output gibt.
Führen zwei oder mehrere verschiedene Inputs zum selben Output, so nennt sich das "Kollision".
Gute Hash-Funktionen zeichnen sich dabei darüber aus, dass sie besonders für ähnlichen Input, aber auch für jeglichen anderen, erwartbaren Input möglichst wenig Kollisionen generieren.
Darüber hinaus ist ein Hash-Algorithmus so designt, dass
- jederzeit für denselben Input immer auch derselbe Output berechnet werden wird,
- er möglichst einfach und schnell berechnet werden kann und
- es unmöglich ist, einen Algorithmus zu formulieren, der als Umkehrfunktion einen Output zu einem Input "zurückrechnen" könnte. (Im Kontrast dazu sind Verschlüsselungsalgorithmen immer so designt, dass es eine Umkehrfunktion gibt, sodass jederzeit "Input -> Output" und auch "Output -> Input" berechnet werden kann.)
Eine Hash-Funktion eignet sich nicht für Verschlüsselungen, da es entweder gar nicht oder nur mit enormem Aufwand möglich ist, den Input von einem Output herauszufinden.
Hash-Funktionen in der Kryptographie dienen meist der Integritätsprüfung von Inhalten oder über spezielle Passwort-Hash-Funktionen (Key Derivation Function) zum sicheren abspeichern von Passwörtern.
Um den spezifischen Input für einen gegebenen Output einer Hash-Funktion herausfinden zu können, gibt es hauptsächlich zwei Wege:
- Einen "Angriff" auf den Algorithmus, mit dem Ziel über eine genaue Analyse der einzelnen und verbundenen Prozessschritte des Algorithmus "Abkürzungen" für bestimmte Berechnungen zu finden und darüber den Aufwand generell oder unter bestimmten Bedingungen zu verringern. (Z.B. für Kollisionsangriffe)
- Eine oder mehrere Rainbow-Tables. Das sind Datenbanken mit Sammlungen von zuvor berechneten Input-Output-Paaren, in denen für einen bekannten Output nach dem zugehörigen Input gesucht werden kann. Hierbei gibt es aber natürlich keine Garantie, fündig zu werden.
Für die allermeisten Einsatzzwecke innerhalb der Kryptographie spielt es bei Angriffen keine Rolle, ob man den tatsächlichen, ursprünglich genutzten Input zu einem Output findet, da der Inhalt des ursprünglichen Inputs nicht verarbeitet wird, sondern nur sein Hash-Wert.
Solange man also einen beliebigen Input in den Händen hält, der den benötigten Output generieren wird, hat man "gewonnen".
Ein frei verfügbarer Rainbow-Table für SHA256 fände sich z.B. hier:
https://crackstation.net/