Java-LogoIm 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.

MD5-Summen mit Java richtig erstellen
Markiert in:     

One thought on “MD5-Summen mit Java richtig erstellen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.