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.

733voto

koregan Punkte 9934

El MessageDigest Klasse kann Ihnen eine Instanz des MD5-Digest zur Verfügung stellen.

Bei der Arbeit mit Strings und den Crypto-Klassen ist darauf zu achten, dass siempre geben Sie die Kodierung an, in der Sie die Byte-Darstellung wünschen. Wenn Sie nur string.getBytes() wird die Standardeinstellung der Plattform verwendet. (Nicht alle Plattformen verwenden die gleichen Standardeinstellungen)

import java.security.*;

..

byte[] bytesOfMessage = yourString.getBytes("UTF-8");

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] theMD5digest = md.digest(bytesOfMessage);

Wenn Sie viele Daten haben, sehen Sie sich die .update(xxx) Methoden, die wiederholt aufgerufen werden können. Dann rufen Sie .digest() um den resultierenden Hashwert zu erhalten.

0 Stimmen

"LATIN1" != "ASCII" (oder "US-ASCII"). ASCII ist ein 7-Bit-Zeichensatz, Latin1 ist ein 8-Bit-Zeichensatz. Sie sind nicht identisch.

9 Stimmen

(siehe joelonsoftware.com/articles/Unicode.html für eine viel bessere Begründung und Erklärung)

18 Stimmen

Dieses Thema ist auch nützlich, wenn Sie die resultierenden Bytes in eine Hex-Zeichenkette umwandeln müssen.

651voto

Bombe Punkte 77831

Sie benötigen java.security.MessageDigest .

Rufen Sie an. MessageDigest.getInstance("MD5") um eine MD5-Instanz von MessageDigest können Sie verwenden.

Die Berechnung des Hashes erfolgt auf eine der folgenden Arten:

El byte[] zurückgegeben von md.digest() ist der MD5-Hash.

157 Stimmen

Eine Sache, die hier nicht erwähnt wird, hat mich überrascht. Die MessageDigest-Klassen sind NICHT thread-sicher. Wenn sie von verschiedenen Threads verwendet werden sollen, erstellen Sie einfach eine neue, anstatt zu versuchen, sie wiederzuverwenden.

43 Stimmen

Sie verwendet mehrere Methoden, um ihren internen Zustand zu verändern. Wie kann das Fehlen von Thread-Sicherheit überhaupt überraschend sein?

102 Stimmen

@Bombe: warum sollten wir das erwarten? haben über den internen Zustand von MessageDigest wissen wollen?

277voto

user49913 Punkte 3000

Wenn Sie die Antwort tatsächlich als Zeichenkette und nicht als Byte-Array zurückerhalten möchten, können Sie etwas wie folgt tun:

String plaintext = "your text here";
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 ){
  hashtext = "0"+hashtext;
}

12 Stimmen

@BalusC: Stimmt nicht, die Methode BigInteger.toString gibt die vollständige Zahl in der angegebenen Basis zurück. 0x0606 wird als 606 gedruckt, nur die Nullen am Ende werden weggelassen,

11 Stimmen

Kleines Manko: m.reset() ist nicht direkt nach dem Aufruf von getInstance notwendig. Noch unbedeutender: "Ihr Text hier" muss in Anführungszeichen gesetzt werden.

0 Stimmen

Ab Java 11 können Sie mit hashtext = "0".repeat(32 - hashtext.length()) + hashtext anstelle der while so dass die Editoren keine Warnung ausgeben, dass Sie eine String-Verkettung innerhalb einer Schleife durchführen.

263voto

lutzh Punkte 4829

Sie sollten sich auch die DigestUtils Klasse des Apache gemeinsamer Codec Projekt, das sehr praktische Methoden zur Erstellung von MD5- oder SHA-Digests bietet.

2 Stimmen

Insbesondere die Methoden, die "sichere" kodierte Darstellungen der Byte-Daten in String-Form zurückgeben.

4 Stimmen

Allerdings gibt es keine einfache Möglichkeit, die DigestUtils Klasse in Ihr Projekt zu bekommen, ohne eine Tonne von Libs hinzuzufügen, oder die Klasse "per Hand" zu portieren, was mindestens zwei weitere Klassen erfordert.

0 Stimmen

Ich kann es auch nicht in den Maven Repos finden. Grrrr.

175voto

dac2009 Punkte 3381

Ich habe das hier gefunden:

public String MD5(String md5) {
   try {
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(md5.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
          sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
       }
        return sb.toString();
    } catch (java.security.NoSuchAlgorithmException e) {
    }
    return null;
}

auf der nachstehenden Website. Ich möchte mich nicht dafür loben, aber die Lösung funktioniert! Bei mir haben viele andere Codes nicht richtig funktioniert, am Ende fehlten 0s im Hash. Diese Lösung scheint die gleiche zu sein, die PHP hat. Quelle: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093

17 Stimmen

Sie sollten die zu verwendende Kodierung in getBytes() sonst wird Ihr Code auf verschiedenen Plattformen/Benutzereinstellungen unterschiedliche Ergebnisse liefern.

0 Stimmen

@PauloEbermann ist MessageDigest.getInstance("MD5"); nicht genug? Ich habe versucht, "MD5" in getBytes() hinzuzufügen, aber es gab einen Fehler zurück

2 Stimmen

@BlazeTama "MD5" ist keine Verschlüsselung, sondern ein Message-Digest-Algorithmus (und kein Algorithmus, der in neuen Anwendungen verwendet werden sollte). Eine Kodierung ist ein Algorithmuspaar, das Bytes in Strings und Strings in Bytes umwandelt. Ein Beispiel wäre "UTF-8", "US-ASCII", "ISO-8859-1", "UTF-16BE" und ähnliche. Verwenden Sie dieselbe Kodierung wie alle anderen Parteien, die einen Hash dieser Zeichenfolge berechnen, da Sie sonst unterschiedliche Ergebnisse erhalten.

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