Diese Rubrik beschäftigt sich mit der Erzeugung von Hashwerten („Prüfsummen“) und Nutzung von Methoden zur Sicherung der Herkunft einer Nachricht („Message Authorisation Codes“, „MACs“).
Was ist der Sinn eines Hashwertes? Bei einer kleinen Datenmenge könnt Ihr sicherlich sehr schnell durch einen optischen Vergleich feststellen, ob und das zwei Datensätze oder Dateien identisch sind. Sobald wir aber über Dateien reden, die auch einmal 1 Gigabyte oder noch grösser sind, ist ein optischer Vergleich sehr mühsam oder unmöglich. Hier kommen nun Hashwerte zum Einsatz, welche einen Dateivergleich (d.h. die Bestätigung der Dateiintegrität) deutlich vereinfachen.
Gibt es einen weiteren Einsatzzweck für Hashes? Einfache Antwort: ja. Die längere Antwort bedenkt die Nutzung einer Digitalen Signatur – die Signatur-Routinen sind bei großen Datenmengen sehr langsam und daher wird in der Praxis von einer großen Datei zuerst die Prüfsumme (der Hashwert) errechnet und dann wird der Hashwert digital signiert, was wesentlich schneller funktioniert.
Gibt es ein Beispiel für Hashwerte? Wenn Ihr zum Beispiel eine KNOPPIX-Live-DVD herunterladen wollt geht Ihr auf die Seite http://ftp.uni-kl.de/pub/linux/knoppix-dvd/ und ladet die gewünschte Version herunter. Die größten Dateien sind mehr als 4 Gigabyte groß und woran könnt Ihr feststellen, das die Datei unverändert bei Euch angekommen ist ? Erzeugt Euch einen Hashwert und vergleicht ihn mit der auf der Seite angezeigten Prüfsumme: stimmen beide Werte überein könnt Ihr sicher sein, das die Datei unverändert bei Euch angekommen ist.
WARNUNG: Bitte beachtet, das die ersten beiden vorgestellten Hashwert-Beispiele („F01 MD5-Hash mit einer Datei“ und „F02 SHA1-Hash mit einer Datei„) unsicher sind, da es inzwischen berechnete „Kollisionen“ gibt. Das bedeutet, dass es die Möglichkeit gibt, das eine veränderte Datei (z.B. mit einem Virus versehen) die gleiche Prüfsumme hat wie der angegebene Hashwert.
In Beispiel F03 SHA-256 und SHA-512 Hash mit einer Datei zeige ich Euch die einfache Implementierung eines (aus heutiger Sicht) sicheren Hashverfahrens. Das Beispiel F04 SHA-128 Hash mit einer Datei ist ein Sonderfall, denn er zeigt Euch, wie Ihr relativ einfach sichere, aber kürzere Hashwerte erzeugen könnt. Allerdings gilt es zu beachten, dass es sich dabei um ein „eigenes“ Hashverfahren handelt und das dieses in anderen Programmumgebungen vermutlich nicht zur Verfügung steht.
Die Feststellung einer unveränderten Datei ist aber nur die „halbe Miete“, denn ein Bösewicht könnte Euch ja auch die komplette Datei inklusive Prüfsummen zur Verfügung stellen (z.B. im Wege einer Mail). Wie könnt Ihr nun feststellen, dass die Datei tatsächlich einem Absender zuzuordnen ist ? Hier kommen die Message Authorisation Codes ins Spiel (oder kurz: MACs). Im Beispiel F05 HMAC256 mit einer Datei seht Ihr, wie Ihr auf einfachem Wege eine derartig gesicherte Prüfsumme erzeugen könnt.
Zu guter Letzt habe ich noch ein Beispiel für eine kleine, aber feine Sonderfunktion, nämlich die sichere Ableitung von Passwörtern von einem „Masterpasswort“. Die dafür notwendige Funktion „HKDF“ wird Euch von einem Drittanbieter zur Verfügung gestellt. Das Beispiel findet Ihr unter F06 HDKF-256 mit einem Byte Array.
Alle Quellcodes zu Hashes und MACs findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/F-Hashes-und-MACs. Alle Programme sind sowohl unter Java 8 als auch unter Java 11 lauffähig.
Letzte Aktualisierung: 21.01.2019