daTom Geschrieben 20. Dezember 2007 Geschrieben 20. Dezember 2007 Hallo, ich möchte die MD5 Summe einer Datei berechnen. Dazu habe ich folgenden Code geschrieben: public void checkSum() throws NoSuchAlgorithmException, FileNotFoundException { MessageDigest digest = MessageDigest.getInstance("MD5"); File f = new File("c:\\myFile.txt"); InputStream is = new FileInputStream(f); byte[] buffer = new byte[8192]; int read = 0; try { while( (read = is.read(buffer)) > 0) { digest.update(buffer, 0, read); } byte[] md5sum = digest.digest(); } catch(IOException e) { throw new RuntimeException("Unable to process file for MD5", e); } finally { try { is.close(); } catch(IOException e) { throw new RuntimeException("Unable to close input stream for MD5 calculation", e); } } } byte[] md5sum = digest.digest(); gibt mir die Checksumme als Byte[] zurück. Üblicherweise ist es ja so, dass MD5 Summen als Hex-Werte angezeigt werden. Allerdings weiß ich leider nicht, wie ich aus dem Inhalt des Byte-Arrays diese Hex-Zahl bekomme. Hat jemand einen Tipp für mich? Zitieren
kingofbrain Geschrieben 20. Dezember 2007 Geschrieben 20. Dezember 2007 Das sollte Dein Problem lösen: byte[] digest = // compute your digest StringBuffer sb = new StringBuffer(); for (int i = 0; i < digest.length; ++i) { sb.append(Integer.toHexString((digest[i] & 0xFF) | 0x100) .toLowerCase().substring(1, 3)); } passwordHash = sb.toString(); Peter Zitieren
daTom Geschrieben 20. Dezember 2007 Autor Geschrieben 20. Dezember 2007 Hallo, schon mal Danke für deine Antwort. Kannst du mir erklären, was da passiert? So ganz blicke ich da nicht durch edit: Hab gerade folgendes gefunden - das scheint auch zu funktionieren: BigInteger bigInt = new BigInteger(1, md5sum); String output = bigInt.toString(16); System.out.println("MD5: " + output); Zitieren
kingofbrain Geschrieben 20. Dezember 2007 Geschrieben 20. Dezember 2007 Servus, im Endeffekt geht der Code durch jedes Byte Deiner Prüfsumme und erzeugt daraus den Hexadezimalen String. Dazu wird das Byte erst mit 255 binär verundet, damit alle Werte größer als 255 aus Deinem Byte rausfallen. Das Verodern mit 256 danach verstehe ich grad auch nicht (ist nicht mein eigener Code), das würde nämlich dafür sorgen, das das bit links vom höchsten Wertebit auf eins gesetzt wird. Evtl. ist das eine Vorzeichensache, vielleicht kann ein anderer das erklären. Danach holst Du Dir vom jetzt bereinigten Byte die zwei letzten Zeichen. Fertig. Peter Zitieren
daTom Geschrieben 21. Dezember 2007 Autor Geschrieben 21. Dezember 2007 Danke für deine Erklärung. Ich kapier´s jetzt zumindest ein wenig :-) Es gibt von Apache (commons library) eine Methode, die das auch erledigen kann. org.apache.commons.codec.binary.Hex.encodeHex(byte[]) Das funktioniert ebenfalls. Gruß Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.