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.
Der MD5-Hashwert-Algorithmus ist bereits sehr alt und sehr verbreitet. In der Folge haben sich viele Fachleute mit dem MD5-Hash beschäftigt und herausgefunden, dass die erzeugte Prüfsumme nicht einmalig für eine Datei ist, sondern das durch eine geschickte Manipulation eine beliebige Datei erzeugt werden kann, die genau diesen Hashwert hat. In der Rubrik Unsicherheit zeige ich Euch 2 Beispiele, die Euch hoffentlich von der Unsicherheit dieses Hashwertes überzeugen – G07 MD5-Hash Kollision.
Daher hier die Warnung: Bitte diesen Algorithmus niemals in der realen Welt benutzen – er ist kryptographisch sehr unsicher.
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 MD5-Hashwert einer Datei * Function: calculates the MD5-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; public class F01_Md5File { public static void main(String[] args) throws Exception { System.out.println("F01 MD5 Hashfunktion mit einer Datei"); System.out.println("Hinweis: nutzen Sie die MD5-Funktion niemals in Echtprogrammen da sie unsicher ist !"); String filenameString = "a11_test_1mb.dat"; byte[] hashByte = generateMd5DoNotUse(filenameString); System.out.println("\nMD5-Hashwert der Datei:" + filenameString); System.out.println( "hashByte Länge:" + hashByte.length + " Data:" + printHexBinary(hashByte)); System.out.println("\nF01 MD5 Hashfunktion mit einer Datei beendet"); } public static byte[] generateMd5DoNotUse(String filenameString) throws IOException, NoSuchAlgorithmException { // bitte diese hashfunktion niemals in echtprogrammen nutzen // die hashfunktion ist unsicher // do not use this hashroutine in production // the hashroutine is unsecure 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("MD5"); md.update(bufferByte); return md.digest(); } 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); } } |
Die Ausgabe auf der Konsole ist sehr schlicht:
1 2 3 4 5 6 7 |
F01 MD5 Hashfunktion mit einer Datei Hinweis: nutzen Sie die MD5-Funktion niemals in Echtprogrammen da sie unsicher ist ! MD5-Hashwert der Datei:a11_test_1mb.dat hashByte Länge:16 Data:B6D81B360A5672D80C27430F39153E2C F01 MD5 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: 08.12.2019