1098 Stimmen

Wie kann ich einen MD5-Hash in Java erzeugen?

Gibt es eine Methode, um einen MD5-Hash einer Zeichenkette in Java zu erzeugen?

2 Stimmen

46 Stimmen

MD5 mag als einseitiges Sicherheitsmerkmal unsicher sein, aber für allgemeine Prüfsummenanwendungen ist es immer noch gut geeignet.

18voto

ylu Punkte 827

Sie können Folgendes versuchen. Details und Download-Codes finden Sie hier: http://jkssweetlife.com/java-hashgenerator-md5-sha-1/

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Example {

public static void main(String[] args) throws Exception {

    final String inputString = "Hello MD5";

    System.out.println("MD5 hex for '" + inputString + "' :");
    System.out.println(getMD5Hex(inputString));
}

public static String getMD5Hex(final String inputString) throws NoSuchAlgorithmException {

    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(inputString.getBytes());

    byte[] digest = md.digest();

    return convertByteToHex(digest);
}

private static String convertByteToHex(byte[] byteData) {

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < byteData.length; i++) {
        sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
    }

    return sb.toString();
}
}

15voto

frankodwyer Punkte 13870

Die Antwort von Bombe ist richtig. Beachten Sie jedoch, dass SHA1 die bessere Wahl ist, es sei denn, Sie müssen unbedingt MD5 verwenden (z. B. wenn Sie aus Gründen der Interoperabilität dazu gezwungen werden), da MD5 bei langfristiger Verwendung Schwächen aufweist.

Ich sollte hinzufügen, dass SHA1 auch theoretische Schwachstellen hat, die aber nicht so schwerwiegend sind. Der aktuelle Stand der Technik beim Hashing ist, dass es eine Reihe von Kandidaten für Ersatz-Hash-Funktionen gibt, aber noch keine als Standard-Best-Practice zum Ersatz von SHA1 aufgetaucht ist. Je nach Ihren Bedürfnissen wären Sie also gut beraten, Ihren Hash-Algorithmus konfigurierbar zu machen, damit er in Zukunft ersetzt werden kann.

0 Stimmen

Könnten Sie mich auf einige Quellen verweisen, in denen ich die relativen Vorzüge und Schwächen der einzelnen Produkte nachlesen kann?

0 Stimmen

Das Beste, was Sie im Moment tun können, ist SHA1 zu verwenden und darauf vorbereitet zu sein, es in Zukunft zu ersetzen. Sie könnten neuere Funktionen verwenden, aber diese sind noch nicht Gegenstand umfangreicher Untersuchungen. Sie könnten Online-Sicherheitsressourcen verfolgen, um herauszufinden, wann sich dies ändert - zum Beispiel den Blog von Bruce Schneier.

8 Stimmen

SHA1 ist ein Overkill, es sei denn, Sie wollen einen kryptografisch sicheren Hash, d. h. Sie wollen weder, dass der Hash bei der Rekonstruktion der ursprünglichen Nachricht hilft, noch wollen Sie, dass ein cleverer Angreifer eine andere Nachricht erstellt, die mit dem Hash übereinstimmt. Wenn das Original nicht geheim ist und der Hash nicht zur Sicherheit verwendet wird, ist MD5 schnell und einfach. Das Google Web Toolkit verwendet beispielsweise MD5-Hashes in JavaScript-URLs (z. B. foo.js?hash=12345).

13voto

Lukasz R. Punkte 2175

Eine weitere Umsetzung: Schnelle MD5-Implementierung in Java

String hash = MD5.asHex(MD5.getHash(new File(filename)));

1 Stimmen

Dies ist eine solide, eigenständige Bibliothek mit minimalen Abhängigkeiten. Gutes Zeug.

0 Stimmen

Ich fand es sehr nützlich. Sie benötigte 15357 ms für eine 4,57 GB große Datei, während die Java-eigene Implementierung 19094 ms benötigte.

0 Stimmen

Das war sehr nützlich. Ich hatte Probleme mit MessageDigest.getInstance("MD5").

11voto

kriegaex Punkte 56700

Ich weiß nicht, ob dies für irgendjemanden, der dies liest, relevant ist, aber ich hatte gerade das Problem, dass ich

  • eine Datei von einer bestimmten URL herunterladen et
  • seinen MD5-Wert mit einem bekannten Wert vergleichen.

Ich wollte es nur mit JRE-Klassen machen (keine Apache Commons oder ähnliches). Eine schnelle Websuche zeigte mir keine Beispielcode-Schnipsel, die beide zur gleichen Zeit, sondern nur jede Aufgabe einzeln. Da dies erfordert, die gleiche Datei zweimal zu lesen, dachte ich, es könnte sich lohnen, einen Code zu schreiben, der beide Aufgaben vereint und die Prüfsumme während des Herunterladens der Datei berechnet. Dies ist mein Ergebnis (entschuldigen Sie, wenn es nicht perfektes Java ist, aber ich denke, Sie verstehen die Idee trotzdem):

import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.security.DigestOutputStream;        // new
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

void downloadFile(String fromURL, String toFile, BigInteger md5)
    throws IOException, NoSuchAlgorithmException
{
    ReadableByteChannel in = Channels.newChannel(new URL(fromURL).openStream());
    MessageDigest md5Digest = MessageDigest.getInstance("MD5");
    WritableByteChannel out = Channels.newChannel(
        //new FileOutputStream(toFile));  // old
        new DigestOutputStream(new FileOutputStream(toFile), md5Digest));  // new
    ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024);  // 1 MB

    while (in.read(buffer) != -1) {
        buffer.flip();
        //md5Digest.update(buffer.asReadOnlyBuffer());  // old
        out.write(buffer);
        buffer.clear();
    }

    BigInteger md5Actual = new BigInteger(1, md5Digest.digest()); 
    if (! md5Actual.equals(md5))
        throw new RuntimeException(
            "MD5 mismatch for file " + toFile +
            ": expected " + md5.toString(16) +
            ", got " + md5Actual.toString(16)
        );
}

1 Stimmen

Übrigens, bevor jemand außer mir merkt, wie schlecht meine JRE-Kenntnisse wirklich sind: Ich habe gerade entdeckt DigestInputStream et DigestOutputStream . Ich werde meine ursprüngliche Lösung ändern, um dem Rechnung zu tragen, was ich gerade gelernt habe.

9voto

Giancarlo Romeo Punkte 587
import java.security.*;
import javax.xml.bind.*;

byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytesOfDigest = md.digest(bytesOfMessage);
String digest = DatatypeConverter.printHexBinary(bytesOfDigest).toLowerCase();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X