Gibt es eine Methode, um einen MD5-Hash einer Zeichenkette in Java zu erzeugen?
"LATIN1" != "ASCII" (oder "US-ASCII"). ASCII ist ein 7-Bit-Zeichensatz, Latin1 ist ein 8-Bit-Zeichensatz. Sie sind nicht identisch.
Gibt es eine Methode, um einen MD5-Hash einer Zeichenkette in Java zu erzeugen?
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.
"LATIN1" != "ASCII" (oder "US-ASCII"). ASCII ist ein 7-Bit-Zeichensatz, Latin1 ist ein 8-Bit-Zeichensatz. Sie sind nicht identisch.
(siehe joelonsoftware.com/articles/Unicode.html für eine viel bessere Begründung und Erklärung)
Dieses Thema ist auch nützlich, wenn Sie die resultierenden Bytes in eine Hex-Zeichenkette umwandeln müssen.
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:
byte[]
und berechnen den Hash in einem Arbeitsgang mit md.digest(bytes)
.MessageDigest
eine byte[]
Stück für Stück durch den Aufruf md.update(bytes)
. Wenn Sie mit dem Hinzufügen von Eingabebytes fertig sind, berechnen Sie den Hash mit [md.digest()
](https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/security/MessageDigest.html#digest()) .El byte[]
zurückgegeben von md.digest()
ist der MD5-Hash.
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.
Sie verwendet mehrere Methoden, um ihren internen Zustand zu verändern. Wie kann das Fehlen von Thread-Sicherheit überhaupt überraschend sein?
@Bombe: warum sollten wir das erwarten? haben über den internen Zustand von MessageDigest wissen wollen?
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;
}
@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,
Kleines Manko: m.reset() ist nicht direkt nach dem Aufruf von getInstance notwendig. Noch unbedeutender: "Ihr Text hier" muss in Anführungszeichen gesetzt werden.
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.
Sie sollten sich auch die DigestUtils Klasse des Apache gemeinsamer Codec Projekt, das sehr praktische Methoden zur Erstellung von MD5- oder SHA-Digests bietet.
Insbesondere die Methoden, die "sichere" kodierte Darstellungen der Byte-Daten in String-Form zurückgeben.
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.
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
Sie sollten die zu verwendende Kodierung in getBytes()
sonst wird Ihr Code auf verschiedenen Plattformen/Benutzereinstellungen unterschiedliche Ergebnisse liefern.
@PauloEbermann ist MessageDigest.getInstance("MD5"); nicht genug? Ich habe versucht, "MD5" in getBytes() hinzuzufügen, aber es gab einen Fehler zurück
@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 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.
2 Stimmen
stackoverflow.com/questions/304268/
46 Stimmen
MD5 mag als einseitiges Sicherheitsmerkmal unsicher sein, aber für allgemeine Prüfsummenanwendungen ist es immer noch gut geeignet.