Blockchain

Was ist ein Hash?

Was ist ein Hash?

Hashes spielen eine wichtige Rolle in der Blockchain-Technologie und finden dort viele verschiedene Anwendungen. Hash-Funktionen, mit denen man einen Hash erzeugen kann, waren jedoch keine Erfindung für oder mit der Blockchain, sondern spielten bereits vorher eine wichtige Rolle in der IT und fanden und finden dort viel Anwendung.

Schauen wir uns zu Beginn mal einen Hash an:

“a582e8c28249fe7d7990bfa0afebd2da9185a9f831d4215b4efec74f355b301a”

Außer dass dieser Hash aus 64 Zeichen besteht und 256 Bit groß ist, gibt es eigentlich nicht viel über ihn zu sagen. Spannend wird es eigentlich erst, wenn man sich anschaut, womit er generiert wurde:

Wie wir hier sehen, wurde der Hash mit den Worten “Hallo Welt!” generiert.

Was auf den ersten Blick wie eine zufällige Zeichenkette aussieht, ist also eigentlich gar nicht zufällig, sondern deterministisch. Das heißt, dass derselbe Input (z. B. “Hallo Welt!”) immer zu demselben Output, dem Hash führt.      

Du kannst das selbst ganz einfach auf dieser Website ausprobieren.

Der Hash aus dem Beispiel zuvor wurde mit SHA256 generiert. SHA256 steht für “Secure Hash Algorithm” (übersetzt: “sicherer Hash Algorithmus”) und die “256” steht für die Größe des Outputs (also des Hashs) in Bits. Ein Bit ist die kleinste Recheneinheit eines Computers und ist entweder eine 0 oder eine 1 (Strom an und Strom aus). Der Hash, der von SHA256 generiert wird, besteht also immer aus einer Kombination von 256 Nullen und Einsen, die dann in eine 64-stellige Zeichenkette, den Hash, “umgeformt” werden.

SHA256 ist jedoch nur eine von vielen verschiedenen Hash-Funktionen, die sich in ihrem Algorithmus und der Größe des Outputs unterscheiden können.

Übrigens wird SHA256 unter anderem auf der Bitcoin-Blockchain verwendet.

Eine wichtige Eigenschaft von Hash-Funktionen ist, dass sie beliebig große Datensätze in einen Hash einer bestimmten Größe transformieren können. Es spielt also keine Rolle, ob man wie in unserem Beispiel zuvor nur ein paar Worte als Input nimmt, oder das gesamte Staatsarchiv; der Hash ist immer gleich groß. Ändert man jedoch nur ein einziges Zeichen des Inputs, ergibt sich ein völlig anderer Hash:

Ändert man nun lediglich den ersten Buchstaben in ein kleines “L”, ändert sich der gesamte Hash (bis auf seine Größe):

Man kann sich einen Hash also wie den Fingerabdruck einer Datei vorstellen: Dieselbe Datei hat immer denselben Fingerabdruck, während zwei Dateien immer unterschiedliche Fingerabdrücke haben.

Ein Verwendungszweck für eine Hash-Funktion ist zum Beispiel, wenn man überprüfen möchte, ob eine Datei verändert wurde. Angenommen, ich habe eine Datei mit sämtlichen Kontoauszügen aus meinem ganzen Leben und möchte sicherstellen, dass diese nicht im Nachhinein verändert werden, ohne dass ich das merke. Ich könnte nun den Hash der Datei irgendwo sicher ablegen und wann immer ich überprüfen möchte, ob jemand die Datei verändert hat, errechne ich erneut den Hash und vergleiche ihn mit dem Hash, den ich am Anfang sicher abgelegt habe. Ist der Hash nun ein anderer, wüsste ich, dass jemand die Datei verändert hat. Dieses Prinzip ist deutlich leichter, als wenn ich jeden einzelnen Kontoauszug in der Datei miteinander vergleichen würde.

Damit wir eine Hash-Funktion in sicherheitskritischen Systemen (z. B. in einer Blockchain) verwenden können, muss sie die folgenden Kriterien erfüllen:

  • Sie ist deterministisch
  • Sie ist eine Einwegfunktion
  • Sie erzeugt einen Hash von fixer Länge
  • Sie ist stark kollisionsresistent

Deterministisch bedeutet in diesem Kontext, dass derselbe Input auch immer denselben Output, also denselben Hash erzeugt. Ist dies nicht gegeben, wäre das Beispiel mit den Kontoauszügen hinfällig, da ich immer andere Hashes von derselben unveränderten (oder, möglicherweise doch veränderten) Datei erhalten würde.

Eine Einwegfunktion (oft auch “one-way function” genannt) ist eine Funktion, die nur in eine Richtung funktioniert. Im Fall einer Hash-Funktion bedeutet das, dass sie zwar einen Hash aus einer beliebigen Datei erzeugen kann, es jedoch keine Möglichkeit gibt, diesen Prozess umzukehren und aus einem Hash den Input, also die Daten zu generieren. Diese Eigenschaft ist unter anderem dann wichtig, wenn der Hash sensible Daten repräsentiert und man vermeiden möchte, dass jemand, der lediglich im Besitz des Hashs ist, auch Zugang zu den sensiblen Daten hat, mit denen er generiert wurde. Der einzige Weg, um den Input der Hash-Funktion zu erlangen, ist, zufällige Inputs zu wählen, bis man den richtigen Hash erzeugt.

Wie gerade beschrieben, ist es wichtig, dass man von einem Hash keine Rückschlüsse auf deren Input ziehen kann. Damit das gewährleistet ist, muss eine Hash-Funktion immer Hashes derselben Größe erzeugen, weil sich sonst anhand der Größe des Hashs Eigenschaften des Inputs erkennen lassen könnten.

Die Kollisionsresistenz beschreibt die Wahrscheinlichkeit einer sogenannten Kollision zweier Hashes. Eine Kollision besteht dann, wenn zwei verschiedene Inputs einer Hash-Funktion denselben Hash erzeugen. Dass dies nicht gänzlich auszuschließen ist, liegt auf der Hand, wenn man bedenkt, dass man beliebig große Datenmengen als Input wählen kann, die dann immer auf dieselbe Größe “reduziert” werden. Ziel ist es also, die Wahrscheinlichkeit solch einer Kollision so weit wie möglich zu reduzieren. Im Fall der hier bereits angesprochenen Hash-Funktion SHA256 liegt die Kollisionswahrscheinlichkeit ungefähr bei 4,3×10-60 und ist somit so gering, dass sie in der Praxis weitgehend zu vernachlässigen ist.e

Schreibe einen Kommentar

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