Die Ermittlung einer Dateiprüfsumme ist mit wenigen Programmzeilen möglich. Zum Test benötigt Ihr eine Testdatei, welche Ihr zum Beispiel mit dem Beispiel A11 Erzeuge eine Datei von definierter Größe erstellen könnt. Testet auch mal Dateien in der Größe von mehreren hundert Megabytes und Ihr werdet feststellen, wie rasend schnell die Berechnung geschieht.
Die dem Programmbeispiel zu Grunde liegenden SHA-256 und SHA-512-Hashwert-Algorithmen sind eine Weiterentwicklung der SHA-1-Familie und bieten deutlich mehr Sicherheit. Daher solltet Ihr – wo immer es geht – diese Hash-Algorithmen nutzen. Aktuell ist die SHA-3-Familie dabei, in die Java-Welt vorzudringen, aber es existieren noch keine Bibliotheken dafür.
Wofür wird ein SHA-128 Algorithmus benötigt? Einige AES-Verschlüsselungsroutinen (z.B. AES CBC mit 128 Bit Schlüsseln) benötigen einen exakt 128 Bit langen Schlüssel und eine SHA-128-Funktion erzeugt einen genauso langen Schlüssel. Die Routine ist damit perfekt gemacht um ein Byte Array auf die richtige Länge zu bringen. Das könnte zwar auch mittels SHA-1 erledigt werden, ist aber heutzutage als sehr unsicher einzustufen !
Was ist die Besonderheit an dieser Routine? Ganz einfach – es existiert keine offizielle SHA-128 Implementierung und damit auch keine allgemein gültige Implementierung. Das bedeutet im Klartext, das ein Datenaustausch über unterschiedliche Systeme nicht funktionieren wird, da sie die SHA-128-Funktion nicht von Haus aus unterstützen. Daher hier noch einmal der Hinweis: nutzt die nachfolgende Routine mit Bedacht!
Die nachfolgende Programmroutine dürfte Euch für viele „quick and dirty“-Anwendungsfälle eine schnelle Unterstützung bieten:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
package net.bplaced.javacrypto.hashandmac; /* * Herkunft/Origin: http://javacrypto.bplaced.net/ * Programmierer/Programmer: Michael Fehr * Copyright/Copyright: frei verwendbares Programm (Public Domain) * Copyright: This is free and unencumbered software released into the public domain. * Lizenttext/Licence: <http://unlicense.org> * getestet mit/tested with: Java Runtime Environment 8 Update 191 x64 * getestet mit/tested with: Java Runtime Environment 11.0.1 x64 * Datum/Date (dd.mm.jjjj): 18.01.2019 * Funktion: errechnet den SHA-128 Hashwert einer Datei * Function: calculates the SHA-128-hash of a file * * Sicherheitshinweis/Security notice * Die Programmroutinen dienen nur der Darstellung und haben keinen Anspruch auf eine korrekte Funktion, * insbesondere mit Blick auf die Sicherheit ! * Prüfen Sie die Sicherheit bevor das Programm in der echten Welt eingesetzt wird. * The program routines just show the function but please be aware of the security part - * check yourself before using in the real world ! */ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; public class F04_Sha128File { public static void main(String[] args) throws Exception { System.out.println("F04 SHA-128 Hashfunktion mit einer Datei"); System.out.println("\nHinweis: Dieses ist keine offizielle Implementierung" + "\nsondern eine Möglichkeit, aus einem 32 Byte langen Array" + "\nein 16 Byte langes Array zu erzeugen !"); String filenameString = "a11_test_1mb.dat"; byte[] hashByte = generateSha128(filenameString); System.out.println("\nSHA-128-Hashwert der Datei:" + filenameString); System.out.println("hashByte Länge:" + hashByte.length + " Data:" + printHexBinary(hashByte)); System.out.println("\nF04 SHA-128 Hashfunktion mit einer Datei beendet"); } public static byte[] generateSha128(String filenameString) throws IOException, NoSuchAlgorithmException { // Achtung: das ist keine offizielle Implementierung File file = new File(filenameString); byte[] bufferByte = new byte[(int) file.length()]; FileInputStream fis = new FileInputStream(file); fis.read(bufferByte); fis.close(); MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update(bufferByte); return Arrays.copyOf(md.digest(), 16); } public static String printHexBinary(byte[] bytes) { final char[] hexArray = "0123456789ABCDEF".toCharArray(); char[] hexChars = new char[bytes.length * 2]; for (int j = 0; j < bytes.length; j++) { int v = bytes[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } } |
Hier ist die Konsolenausgabe:
1 2 3 4 5 6 7 8 9 10 |
F04 SHA-128 Hashfunktion mit einer Datei Hinweis: Dieses ist keine offizielle Implementierung sondern eine Möglichkeit, aus einem 32 Byte langen Array ein 16 Byte langes Array zu erzeugen ! SHA-128-Hashwert der Datei:a11_test_1mb.dat hashByte Länge:16 Data:30E14955EBF1352266DC2FF8067E6810 F04 SHA-128 Hashfunktion mit einer Datei beendet |
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.
Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.
Letzte Aktualisierung: 21.01.2019