Zum Inhalt springen

MD5 von Datei bilden - Frage wegen Byte[]


Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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

Geschrieben

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);

Geschrieben

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

Geschrieben

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ß

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...