Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

MD5 von Datei bilden - Frage wegen Byte[]

Empfohlene Antworten

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?

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

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

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

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ß

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Konto

Navigation

Suchen

Suchen

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.