Im weltweiten Datennetz gibt es tausende Hinweise, wie man eine MD5-Summe in Java erzeugt. Warum dann noch eine? Ganz einfach: Weil viele Anleitungen im Netz falsch sind. Wobei das Problem weniger im falschen Code als im Verständnis der Aufgabenstellung zu liegen scheint. Oftmals werden Codeschnipsel gezeigt, wie man einen MD5-Hash erstellt. Aber ein MD5-Hash ist nur ein Hash, keine MD5-Summe in dem Sinne wie sie oftmals für Prüfungszwecke verwendet wird.
Hier mal ein wenig Beispielcode, sowohl mit falschen als auch einer richtigen Version:
String sDaten = " Diverse Testdaten für MD5-Hashing ";
MessageDigest md = MessageDigest.getInstance("MD5");
String sMD5SUM1 = "";
StringBuffer sbMD5SUM = new StringBuffer();
md.update(sDaten.getBytes());
/* digest liefert den MD5-Hash als Bytearray */
byte[] digest = md.digest();
/* MD5-Hash-Bytearray durchlaufen und Bytes konvertieren */
for (byte d : digest) {
/* Variante Strings anfügen */
sMD5SUM1 = sMD5SUM1 + d;
/* Funktionierende Variante */
/* Sicherstellen, das keine negativen Vorzeichen vorhanden sind */
/* Sicherstellen, das der Hexwert des Bytes 2-stellig ausgegeben wird (Vornullen) */
sbMD5SUM.append(Integer.toHexString((d & 0xFF) | 0x100).toLowerCase().substring(1, 3));
}
/* Variante toString des Bytearrays */
String sMD5SUM2 = digest.toString();
/* Variante Konvertierung über BigInteger */
/* Funktioniert scheinbar, scheitert aber wenn */
/* das erste Byte einen Hexwert mit Vornull liefert */
BigInteger bigInt = new BigInteger(1, digest);
String sMD5SUM3 = bigInt.toString(16);
System.out.println("Falsch: MD5-Summe sMD5SUM1: " + sMD5SUM1);
System.out.println("Falsch: MD5-Summe sMD5SUM2: " + sMD5SUM2);
System.out.println("Falsch: MD5-Summe sMD5SUM3: " + sMD5SUM3);
System.out.println("Richtig: MD5-Summe sbMD5SUM: " + sbMD5SUM.toString());
Hier die Ergebnisse:
Falsch: MD5-Summe sMD5SUM1: 5794567-15416466179116-80-701092489
Falsch: MD5-Summe sMD5SUM2: [B@19821f
Falsch: MD5-Summe sMD5SUM3: 54f2d43f129062e3d4f74b0ba6d1859
Richtig: MD5-Summe sbMD5SUM: 054f2d43f129062e3d4f74b0ba6d1859
Wenn man obigen Code laufen lässt sieht man sehr schön den Unterschied in den Ergebnissen. Die falschen Varianten liefern eben nur einen Hashwert, keine korrekte MD5-Summe. So lange man die Werte nur intern im eigenen Programm für Vergleichszwecke benötigt kann diese trotzdem nutzen, da sie ja nur „falsch“ dargestellt werden. Möchte man jedoch MD5-Summen erzeugen um sie mit externen Programmen abzugleichen, dann funktioniert nur die letzte gezeigte Variante richtig, da diese eben die Byte-Werte in korrekte, zweistellige Hex-Werte konvertiert.
Es gibt übrigens im Apache Commons-Projekt ein Codec-Paket, was entsprechende fertige Methoden für die Hex-Konvertierung (Hex.encodeHex(byte[] b)) zur Verfügung stellt. Man möchte oder kann aber eben nicht immer für eine klitzekleine Funktion gleich ein ganzes Toolset einbinden.

Im weltweiten Datennetz gibt es tausende Hinweise, wie man eine MD5-Summe in Java erzeugt. Warum dann noch eine? Ganz einfach: Weil viele Anleitungen im Netz falsch sind. Wobei das Problem weniger im falschen Code als im Verständnis der Aufgabenstellung zu liegen scheint. Oftmals werden Codeschnipsel gezeigt, wie man einen MD5-Hash erstellt. Aber ein MD5-Hash ist nur ein Hash, keine MD5-Summe in dem Sinne wie sie oftmals für Prüfungszwecke verwendet wird.
Pingback:BMW Media-Files (br3,br4,br5) in MP3s umwandeln - Dijit