Was ist ein Hashwert?

openpgp-schulungen.de-Logo kostenlose Schulungen zu Kryptografie und Anonymisierung

Ein Hashwert ist ein Wert fester Länge (z.B. 128 Bit, 160 Bit), typischerweise codiert als hexadezimale Zeichenkette, der aus beliebigen Eingabedaten gewonnen wird. Beispiele:

Der erste Hashwert (es handelt sich um die Hashfunktion MD5 (128 Bit)) gehört zu einem Linux-Kernel, einer etwa 1,5 MiB großen Datei; der zweite zum Buchstaben a, der dritte zum Buchstaben b. Sie sehen, dass man beliebige Daten auf einen Hashwert komprimieren kann, ohne dass man diesem seine Herkunft auch nur ansatzweise ansieht (was kein Problem der begrenzten menschlichen Intuition ist; auch mathematisch ist das nicht möglich).

Die Länge der Zeichenkette gibt dabei die Häufigkeit an, mit der sich Hashwerte für unterschiedliche Eingabewerte zwangsläufig wiederholen (mit den 128 Bit/ 16 Byte von MD5 kann man ca. 3,4×1038 unterschiedliche Hashwerte darstellen!). Diese Längen sind daher so gewählt, dass ein Hashwert für praktische Zwecke die zugehörigen Eingabedaten eindeutig identifiziert (beispielsweise PGP-Schlüssel, X.509-Zertifikate und Dateien in Tauschbörsen). Insbesondere ist es faktisch unmöglich, zu einem gegebenen (kryptografisch sicheren) Hash passende Eingabedaten zu erzeugen (insbesondere dann, wenn die auch noch sinnvoll sein sollen). Aus diesen Gründen nutzt man Hashes, um Dateien zu identifizieren. Auch bei der Erzeugung digitaler Signaturen (z.B. für signierte Installationsprogramme und Treiber unter Windows oder signierte Softwarepakete unter Linux) wird ein Hashwert benötigt. Auch wenn es für den Laien unverständlich erscheinen mag: Hashwerte sind aus der Softwarewelt nicht mehr wegzudenken.

Siehe auch den Artikel über Hashes bei Wikipedia und meine Webseite zur IT-Sicherheit.

Wenn Sie nachweisen wollen, dass Sie ein bestimmtes Dokument zu einem gegebenen Zeitpunkt schon hatten, reicht es, wenn Sie nachweisen, dass Sie dessen (kryptografisch sicheren) Hashwert schon hatten, weil es Ihnen unmöglich ist, zu einem zufälligen Wert später passende Daten zu erzeugen.

Hashtypen

Es gibt unterschiedliche Hashfunktionen. Ein früher weit verbreiteter, aber inzwischen gebrochener (d.h. kryptografisch nicht mehr sicherer) ist MD5 (Message Digest 5). Hashfunktionen unterscheiden sich in der Länge ihrer Ausgabe und ihrer mathematischen Qualität. Je länger die Ausgabe, desto seltener kommt es zu Kollisionen (unterschiedliche Eingabedaten haben denselben Hashwert) und desto schwieriger ist es, Kollisionen bewusst zu erzeugen. Die Qualität der Hashfunktion liegt in der Gleichverteilung der Hashwerte und ihrer Angreifbarkeit. Wenn es eine bessere (:=weniger aufwendige) Methode als Ausprobieren gibt, um Eingabedaten zu einem gegebenen Hashwert zu finden, ist die Funktion angreifbar.

Inzwischen gilt nicht nur MD5, sondern auch SHA-1 für Kollisionsangriffe als gebrochen. Das ist für einige Anwendungen problematisch. So werden SSL-/TLS-Zertifikate noch (Stand 2013) massenhaft über SHA-1 signiert, sogar für Onlinebanking... Das liegt – mal wieder – zum erheblichen Teil an Microsoft, weil deren Schrottbrowser in alten Versionen SHA-2 nicht versteht (SHA-2 wurde etwa gleichzeitig mit XP veröffentlicht; drei Jahre später (SP2) unterstützen sie es immer noch nicht, erst mit SP3). Allerdings bräuchte man in Sicherheitsfragen auf die Belange der Nutzer völlig veralteter Browser eigentlich sowieso keine Rücksicht zu nehmen. Ein weiteres Problem ist, dass SHA-1 fest im OpenPGP-Standard verankert ist, und zwar sowohl für die Fingerprints als auch für Datensignaturen. Die Fingerprints der Schlüssel sind durch Kollisionsangriffe allerdings nicht in Gefahr. Um die zu gefährden bräuchte man einen Preimage-Angriff. Aber bei der Signierung von Daten für bestimmte Empfänger lässt sich SHA-1 nicht deaktivieren.

Die Werte unterschiedlicher Hashfunktionen für den Text hallo:

   MD5 = 59 8D 4C 20 04 61 B8 15  22 A3 32 85 65 C2 5F 7C
  SHA1 = FD4C EF7A 4E60 7F1F CC92  0AD6 329A 6DF2 DF99 A4E8
RMD160 = 83EE 05F7 8FF6 4F84 24A2  DD62 96D3 540A FEC0 537D
SHA224 = 3DD85BA1 B76430F6 FF55CF0D 8419807A 7564BFFA 4C1D189A DED9D348
SHA256 = D3751D33 F9CD5049 C4AF2B46 2735457E 4D3BAF13 0BCBB87F 389E349F BAEB20B9

Wie kommt man an diesen Wert?

Es gibt für jedes verbreitete Betriebssystem Programme, die einem den Hashwert einer Datei ermitteln. siehe hier