Zum Hauptinhalt springen

Was ist eine Hashfunktion?

Eine Hashfunktion bildet Daten beliebiger Länge auf einen Hashwert fester Länge ab.

Als Eingabe können praktisch beliebige Daten dienen: ein einzelnes Wort, ein längerer Text, ein Passwort oder sogar eine mehrere Gigabyte große Datei.

Aus

Hello World

wird mit SHA-256 beispielsweise der Hashwert

a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

SHA-256 erzeugt dabei immer einen 256 Bit langen Hashwert, der üblicherweise als 64-stellige Hexadezimalzahl dargestellt wird.

Der Hashwert sieht auf den ersten Blick wie eine zufällige Zeichenfolge aus. Eine wichtige Eigenschaft der Hashfunktion ist jedoch: Für dieselbe Eingabe entsteht bei derselben Hashfunktion immer derselbe Hashwert.

Schon eine winzige Änderung an der Eingabe kann dagegen einen völlig anderen Hashwert erzeugen.

Wie funktioniert eine Hashfunktion?​

Eine Hashfunktion kann man sich zunächst wie eine mathematische Funktion vorstellen:

Eingabe → Hashfunktion → Hashwert

Die Eingabe kann dabei unterschiedlich groß sein: Ein kurzer Text und eine sehr große Datei können beide verarbeitet werden.

Bei einer kryptografischen Hashfunktion wie SHA-256 hat der erzeugte Hashwert immer eine Länge von 256 Bit. Wird dieser Hashwert als Hexadezimalzahl dargestellt, entspricht das 64 Zeichen.

Das bedeutet beispielsweise:

"Hi"
↓
SHA-256
↓
256 Bit
64 Hex-Zeichen
"Hello World"
↓
SHA-256
↓
256 Bit
64 Hex-Zeichen
eine mehrere Gigabyte große Datei
↓
SHA-256
↓
256 Bit
64 Hex-Zeichen

Die Größe der Eingabe bestimmt also nicht die Länge des Hashwerts.

Hashwert und Digest​

Das Ergebnis einer Hashfunktion wird als Hashwert oder kurz als Hash bezeichnet. Im Zusammenhang mit kryptografischen Hashfunktionen findet man auch die Begriffe Digest oder Message Digest.

Der Hashwert ist dabei eine feste Darstellung der Eingabe mit der vom jeweiligen Algorithmus vorgegebenen Länge. Er ist keine komprimierte Version der ursprünglichen Daten und enthält nicht einfach die ursprünglichen Daten in verkleinerter Form.

Probier es selbst aus​

Du kannst direkt ausprobieren, wie aus unterschiedlichen Eingaben Hashwerte entstehen. Gib einen beliebigen Text ein und berechne seinen SHA-256-Hash.

AlgorithmusSHA-256

Den Hash Generator mit weiteren Algorithmen findest du auch im Tools-Bereich.

Zum Beispiel kannst du zunächst Hello World eingeben und anschließend nur ein einziges Zeichen verändern.

Ändere beispielsweise:

Hello World

zu:

hello World

Die beiden Eingaben unterscheiden sich nur durch ein Zeichen: Das große H wurde durch ein kleines h ersetzt. Trotzdem unterscheiden sich die resultierenden Hashwerte an vielen Stellen.

Genau dieses Verhalten ist eine wichtige Eigenschaft kryptografischer Hashfunktionen. Warum das so ist und was hinter dem sogenannten Avalanche Effect steckt, erkläre ich weiter unten genauer.

Dieselbe Eingabe liefert denselben Hashwert​

Eine wichtige Eigenschaft einer Hashfunktion ist ihre Deterministik.

Wird exakt dieselbe Eingabe mit derselben Hashfunktion verarbeitet, entsteht immer derselbe Hashwert.

Beispielsweise liefert Hello World bei SHA-256 immer denselben Hash.

Dabei spielt es keine Rolle, ob du den Hash heute, morgen oder in einem Jahr berechnest – bei derselben Eingabe und demselben Algorithmus ist das Ergebnis identisch.

Das macht Hashwerte beispielsweise für die Überprüfung von Dateien nützlich.

Wenn du eine Datei herunterlädst und anschließend ihren Hashwert berechnest, kannst du ihn mit einem vom Anbieter veröffentlichten Hashwert vergleichen. Stimmen beide Werte überein, spricht das dafür, dass die heruntergeladene Datei mit der erwarteten Version übereinstimmt.

Wichtig ist dabei allerdings: Der Referenz-Hashwert muss selbst vertrauenswürdig ermittelt worden sein. Ein einfacher Hashvergleich beweist nicht automatisch die Authentizität oder Herkunft einer Datei.

Warum hat ein Hash eine feste Länge?​

Kryptografische Hashfunktionen bilden Eingaben beliebiger Länge auf einen Hashwert mit einer fest definierten Länge ab.

SHA-256 erzeugt immer einen Hashwert mit 256 Bit. Wird dieser als Hexadezimalzahl dargestellt, entspricht das 64 Zeichen.

Dabei ist es völlig egal, ob die Eingabe aus drei Zeichen oder aus mehreren Millionen Zeichen besteht.

Zum Beispiel:

abc
↓
SHA-256
↓
256 Bit
64 Hex-Zeichen

und:

Ein sehr langer Text ...
↓
SHA-256
↓
256 Bit
64 Hex-Zeichen

Diese feste Ausgabelänge ist eine zentrale Eigenschaft von Hashfunktionen.

Sie führt allerdings auch zu einer interessanten mathematischen Konsequenz: Es gibt sehr viel mehr mögliche Eingaben als mögliche Hashwerte.

Deshalb müssen bei einer solchen Hashfunktion unterschiedliche Eingaben existieren, die denselben Hashwert erzeugen. Eine solche Übereinstimmung nennt man Hash Collision oder Hash-Kollision.

Das bedeutet jedoch nicht, dass sich bei SHA-256 einfach zwei beliebige Texte mit demselben Hash finden lassen. Entscheidend für eine kryptografische Hashfunktion ist vielmehr, wie schwierig es ist, eine Kollision gezielt zu finden.

Warum solche Kollisionen unvermeidbar sind und warum sie trotzdem nicht automatisch ein Sicherheitsproblem darstellen, erkläre ich ausführlich in Was ist eine Hash Collision?.

Was passiert, wenn man nur ein Zeichen verändert?​

Jetzt wird eine wichtige Eigenschaft kryptografischer Hashfunktionen sichtbar.

Nehmen wir zwei Eingaben:

Hello World
hello World

Wir haben nur ein einziges Zeichen verändert:

H → h

Die Eingaben sind also fast identisch.

Die Hashwerte sind es nicht.

Für SHA-256 erhalten wir:

Hello World
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

und:

hello World
db4067cec62c58bf8b2f8982071e77c082da9e00924bf3631f3b024fa54e7d7e
Algorithmus
Algorithmus

Das Verhalten ist beabsichtigt. Eine kleine Änderung an der Eingabe soll nicht nur eine kleine Änderung am Hashwert verursachen. Stattdessen sollen sich möglichst viele Bits des Hashwerts verändern.

Bei einer guten kryptografischen Hashfunktion führt bereits eine kleine Änderung der Eingabe typischerweise dazu, dass sich ungefähr die Hälfte der Ausgabebits verändert.

Diese Eigenschaft wird als Avalanche Effect (Lawineneffekt) bezeichnet.

Der Avalanche Effect​

Der Avalanche Effect bedeutet vereinfacht:

Eine kleine Änderung an der Eingabe führt zu einer großen, für den Betrachter scheinbar zufälligen Änderung des Hashwerts.

Bei SHA-256 besteht der Hashwert aus 256 Bit.

Ändert man ein einzelnes Bit der Eingabe, ist bei einer idealen Hashfunktion zu erwarten, dass sich ungefähr die Hälfte der Ausgabebits verändert.

Für dieses Beispiel lässt sich der Effekt anhand der beiden Hashwerte betrachten.

Wir ändern:

Hello World

zu:

hello World

Damit wird genau ein Zeichen der Eingabe verändert.

Vergleicht man die beiden resultierenden SHA-256-Hashwerte bitweise, unterscheiden sich 124 von 256 Bits.

Das entspricht:

124 / 256 × 100 ≈ 48,4 %

Die Eingabe hat sich also nur geringfügig verändert, während sich fast die Hälfte der Hashbits geändert hat.

Genau dieses Verhalten veranschaulicht den Avalanche Effect.

Wichtig ist dabei: Die rund 50 % sind keine Garantie für jede einzelne Eingabeänderung. Sie beschreiben das erwartete Verhalten einer idealen bzw. entsprechend entworfenen kryptografischen Hashfunktion.

Aus dem Hashwert lässt sich dabei nicht direkt ablesen, welches Zeichen der Eingabe verändert wurde.

Der Avalanche Effect ist deshalb eine wichtige Eigenschaft beim Design kryptografischer Hashfunktionen.

Wie der Avalanche Effect genau funktioniert und warum dabei häufig von ungefähr 50 % veränderten Bits gesprochen wird, erkläre ich im Artikel Was ist der Avalanche Effect?.

Hash ist nicht gleich Verschlüsselung​

Hashfunktionen werden häufig mit Verschlüsselung verwechselt. Beide Verfahren arbeiten zwar mit Daten, verfolgen aber unterschiedliche Ziele.

Bei einer Verschlüsselung wird aus einem Klartext ein verschlüsselter Text erzeugt. Mit dem passenden Schlüssel kann dieser wieder entschlüsselt werden:

Klartext
↓
Verschlüsselung
+ Schlüssel
↓
Ciphertext
↓
Entschlüsselung
+ Schlüssel
↓
Klartext

Beim Hashing gibt es dagegen keinen vergleichbaren Entschlüsselungsschritt:

Daten
↓
Hashfunktion
↓
Hashwert

Die Hashfunktion ist also keine Methode, um Daten sicher zu verschlüsseln.

Wenn du beispielsweise einen Text hashst, kannst du den Hashwert nicht einfach wieder in den ursprünglichen Text zurückverwandeln.

Das ist ein grundlegender Unterschied zwischen Hashing und Verschlüsselung:

Verschlüsselung ist darauf ausgelegt, Daten wieder entschlüsseln zu können. Ein Hashwert ist dagegen das Ergebnis einer Hashfunktion und dient nicht dazu, die ursprünglichen Daten wiederherzustellen.

Das bedeutet allerdings nicht, dass es grundsätzlich unmöglich ist, die ursprüngliche Eingabe zu einem Hashwert zu ermitteln. Bei kleinen oder bekannten Eingabemengen können beispielsweise viele mögliche Eingaben ausprobiert und ihre Hashwerte verglichen werden. Warum das keine Entschlüsselung ist, erkläre ich im Artikel Kann man einen Hash zurückrechnen?.

Hash ist auch nicht Encoding​

Ein weiterer häufiger Irrtum ist die Verwechslung von Hashing und Encoding.

Beim Encoding werden Daten nach bestimmten Regeln in ein anderes Format überführt. Ein bekanntes Beispiel ist Base64.

Base64 ist dabei keine Verschlüsselung. Die Kodierung ist reversibel: Die ursprünglichen Daten können aus einer Base64-Darstellung wiederhergestellt werden.

Daten
↓
Encoding
↓
Base64
↓
Decoding
↓
Daten

Beim Hashing funktioniert das nicht auf diese Weise:

Daten
↓
Hashfunktion
↓
Hashwert

Ein Hashwert ist also nicht einfach eine andere Darstellung der ursprünglichen Daten.

Die drei Konzepte lassen sich vereinfacht so unterscheiden:

VerfahrenErgebnisUrsprüngliche Daten wiederherstellbar?
HashingHashwertNicht durch einen Entschlüsselungs- oder Decoding-Schritt
VerschlüsselungCiphertextJa, mit dem passenden Schlüssel
Encodingkodierte DatenJa, durch Decoding

Bekannte Hashfunktionen​

Im Laufe der Zeit wurden zahlreiche Hashalgorithmen entwickelt.

Zu den bekanntesten gehören:

AlgorithmusHashlängeEinordnung
MD5128 BitNicht für Anwendungen geeignet, die Collision Resistance benötigen
SHA-1160 BitFür neue Anwendungen mit erforderlicher Collision Resistance nicht mehr geeignet
SHA-256256 BitWeit verbreiteter Vertreter der SHA-2-Familie
SHA-512512 BitVertreter der SHA-2-Familie
SHA3-224224 BitVertreter der SHA-3-Familie
SHA3-256256 BitVertreter der SHA-3-Familie
SHA3-384384 BitVertreter der SHA-3-Familie
SHA3-512512 BitVertreter der SHA-3-Familie

MD5 weist bekannte Kollisionsangriffe auf und sollte daher nicht für Anwendungen eingesetzt werden, bei denen Collision Resistance benötigt wird. Für bestimmte nicht-kryptografische Anwendungsfälle kann MD5 dagegen weiterhin vorkommen.

Auch SHA-1 bietet nicht mehr die erwartete Collision Resistance und sollte für neue Anwendungen, bei denen diese Eigenschaft erforderlich ist, nicht eingesetzt werden.

SHA-256 und SHA-512 gehören zur SHA-2-Familie. SHA3-224, SHA3-256, SHA3-384 und SHA3-512 gehören zur SHA-3-Familie.

Die Unterschiede zwischen diesen Algorithmen betreffen unter anderem Sicherheitseigenschaften, Hashlänge, Aufbau und Entstehungsgeschichte. Auf diese Unterschiede gehe ich in eigenen Artikeln noch ausführlicher ein.

Das Wichtigste in Kürze​

Eine Hashfunktion bildet Daten beliebiger Länge auf einen Hashwert definierter Länge ab.

Die wichtigsten Eigenschaften, die du dir merken solltest:

  • Dieselbe Eingabe erzeugt mit derselben Hashfunktion immer denselben Hashwert.
  • Die Länge des Hashwerts ist unabhängig von der Größe der Eingabe.
  • Eine kleine Änderung der Eingabe kann zu einer großen Änderung des Hashwerts führen.
  • Dieses Verhalten wird bei kryptografischen Hashfunktionen als Avalanche Effect bezeichnet.
  • Hashing ist keine Verschlüsselung.
  • Hashing ist auch kein Encoding.
  • Unterschiedliche Eingaben können denselben Hashwert erzeugen. Das nennt man eine Hash Collision.
  • Nicht jeder Hashalgorithmus ist für jeden Anwendungsfall geeignet.

Hashfunktionen sind damit ein grundlegender Baustein moderner Kryptografie und vieler Anwendungen der IT-Sicherheit.

Wie geht es weiter?​

Wenn du die grundlegenden Eigenschaften von Hashfunktionen verstanden hast, kannst du einzelne Themen noch wesentlich genauer betrachten.

Grundlagen​

Hashalgorithmen​

  • Was ist SHA-256?
  • SHA-512 und die SHA-2-Familie
  • Was ist SHA-3?
  • Warum ist MD5 unsicher?
  • Warum gilt SHA-1 als unsicher?

Passwortsicherheit​

  • Warum ist SHA-256 nicht für Passwörter geeignet?
  • Wie funktioniert Passwort-Hashing?
  • bcrypt, scrypt und Argon2 im Vergleich
  • Was ist ein Salt und warum wird es beim Passwort-Hashing verwendet?

Quellen und Standards​

Die folgenden Primär- und Normquellen bilden die Grundlage für die technischen Aussagen dieses Artikels:

  1. National Institute of Standards and Technology (NIST), FIPS 180-4 – Secure Hash Standard (SHS) Spezifikation der SHA-1- und SHA-2-Hashalgorithmen, darunter SHA-256 und SHA-512.

  2. National Institute of Standards and Technology (NIST), FIPS 202 – SHA-3 Standard Spezifikation von SHA3-224, SHA3-256, SHA3-384, SHA3-512 sowie SHAKE128 und SHAKE256.

  3. National Institute of Standards and Technology (NIST), Hash Functions – NIST Policy on Hash Functions Aktuelle Übersicht und Einordnung der von NIST unterstützten Hashfunktionen.

  4. National Institute of Standards and Technology (NIST), CSRC Glossary – Hash Function Definition der Hashfunktion sowie der Eigenschaften Collision Resistance, Preimage Resistance und Second-Preimage Resistance.

  5. NIST SP 800-107 Rev. 1 – Recommendation for Applications Using Approved Hash Algorithms NIST-Empfehlung zu Anwendungen und Sicherheitseigenschaften kryptografischer Hashfunktionen. NIST hat Ende 2022 angekündigt, die Publikation zurückzuziehen; relevante Inhalte wurden in die aktuelle NIST-Hash-Functions-Seite überführt.

  6. IETF, RFC 6151 – Updated Security Considerations for the MD5 Message-Digest and the HMAC-MD5 Algorithms Sicherheitsbewertung von MD5 und insbesondere der bekannten Kollisionsprobleme.

  7. IETF, RFC 6194 – Security Considerations for the SHA-0 and SHA-1 Message-Digest Algorithms Sicherheitsbetrachtungen und bekannte Schwächen von SHA-1.