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.
Schlagwörter: Java, Programmierung
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.
Einträge (RSS)
[...] Viele Dinge – Fotografie, Computer und mehr » MD5-Summen mit Java … [...]