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?
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
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);
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
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ß
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden