G08 SHA1-Hash Kollision

Wenn Ihr den Beitrag zur MD5-Hash-Kollision gelesen und Euch gedacht habt – die SHA-Hashfamilie ist doch viel neuer und sicherer dann werdet Ihr diese Meinung überdenken müssen, zumindest was das sehr beliebte SHA-1 Verfahren angeht.

Vor einigen Jahren wurden theoretische Angriffsmöglichkeiten zum SHA-1 Hashverfahren publik und in der Folge entwickelte Marc Stevens einen praktischen Angriff. Allerdings benötigte er die Unterstützung von Google und deren enormen Rechenpower, um einen realen Angriff auf den SHA-1 Algorithmus zu ermöglichen. Einzelheiten hierzu findet ihr auf der Webseite http://shattered.it/, wo auch die beiden PDF-Dateien zum Download bereitstehen. Eine deutschsprachige Erläuterung findet Ihr auf der Heise-Webseite https://www.heise.de/security/meldung/Todesstoss-Forscher-zerschmettern-SHA-1-3633589.html.

Warum ist diese Kollision denn so gefährlich ? Sehr viele Anwendung zur elektronischen Unterschrift basieren darauf, das NICHT die Unterschrift über die zu signierende Datei berechnet wird sondern statt dessen die Signatur über den Hashwert der Datei erzeugt wird. Im Klartext bedeutet es für unser Beispiel: Eine digitale Signatur des SHA-1-Hashwertes von g08_shattered-1.pdf ist auch für das PDF-Dokument g08_shattered-2.pdf gültig. Stellt Euch vor Ihr kauft mit dem Dokument 1 ein Haus und in Dokument 2 nur einen Teddybär – die elektronische Unterschrift für beide Verträge wäre identisch!

Zum Selbertesten ladet Ihr Euch die beiden PDF-Dateien g08_shattered-1 und g08_shattered-2 herunter und schaut sie Euch an (hier zwei verkleinerte Bilder der PDF-Seite). Der Unterschied ist mehr als deutlich an der Hintergrundfarbe des oberen Bereiches zu erkennen:

g08_shattered-01.pdf:

g08_shattered-02.pdf:

Wenn Ihr für beide Dateien den SHA-1 Hashwert berechnet kommt ihr zu dem Ergebnis, das die Hashwerte für beide Dateien identisch sind (Konsolenausgabe von G08_Sha1Kollision.java):

Das es sich um unterschiedliche Dateien handelt erkennt ihr am SHA256-Hashwert – diese Werte differieren.

Fazit: nutzt wo immer Ihr könnt weder das MD5- noch den SHA-1- Hashverfahren, sondern nur die deutlich sicheren SHA-256- und SHA-512- Hashverfahren.

Hier der noch Quellcode des Programms:

Alle Quellcodes zu den Unsicherheiten findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/G-Unsicherheit. Alle Programme sind sowohl unter Java 8 als auch unter Java 11 lauffähig.

Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.

Letzte Aktualisierung: 09.12.2019