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 SHA-1-Hashwert-Algorithmus ist bereits alt und sehr verbreitet. In der Folge haben sich viele Fachleute mit dem SHA-1-Hash beschäftigt und herausgefunden, das 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. Das sich mit genügend Rechenpower eine unterschiedliche Datei mit gleichem SHA-1 Hashwert erzeugen läßt haben mehrere Fachleute im Jahr 2007 eindruckvoll bewiesen – schaut Euch meinen Beitrag in der Rubrik „Unsecure“ an: G08 SHA-1 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 SHA-1-Hashwert einer Datei * Function: calculates the SHA-1-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 F02_Sha1File { public static void main(String[] args) throws Exception { System.out.println("F02 SHA-1 Hashfunktion mit einer Datei"); System.out.println("Hinweis: nutzen Sie die SHA-1-Funktion niemals in Echtprogrammen da sie unsicher ist !"); String filenameString = "a11_test_1mb.dat"; byte[] hashByte = generateSha1DoNotUse(filenameString); System.out.println("\nSHA-1-Hashwert der Datei:" + filenameString); System.out.println( "hashByte Länge:" + hashByte.length + " Data:" + printHexBinary(hashByte)); System.out.println("\nF02 SHA-1 Hashfunktion mit einer Datei beendet"); } public static byte[] generateSha1DoNotUse(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("SHA1"); 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 Anzeige auf der Konsole ist wieder kurz und knapp:
1 2 3 4 5 6 7 |
F02 SHA-1 Hashfunktion mit einer Datei Hinweis: nutzen Sie die SHA-1-Funktion niemals in Echtprogrammen da sie unsicher ist ! SHA-1-Hashwert der Datei:a11_test_1mb.dat hashByte Länge:20 Data:3B71F43FF30F4B15B5CD85DD9E95EBC7E84EB5A3 F02 SHA-1 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: 09.12.2019