Berechnen Sie den Hash, indem Sie einen der folgenden Schritte ausführen:
Füttere die gesamte Eingabe als byte[]und berechne den Hash in einer Operation mit md.digest(bytes).
Führen Sie das MessageDigesteinen byte[]Klumpen zu einem Zeitpunkt durch den Aufruf md.update(bytes). Wenn Sie mit dem Hinzufügen von Eingabebytes fertig sind, berechnen Sie den Hash mit
md.digest().
Das byte[]zurückgegebene md.digest()ist der MD5-Hash.
Eine Sache, die hier nicht erwähnt wird und mich überrascht hat. Die MessageDigest-Klassen sind NICHT threadsicher. Wenn sie von verschiedenen Threads verwendet werden sollen, erstellen Sie einfach einen neuen, anstatt zu versuchen, sie wiederzuverwenden.
Mjuarez
39
Es verwendet mehrere Methoden, um seinen internen Zustand zu mutieren. Wie kann der Mangel an Gewindesicherheit überhaupt überraschen?
Bombe
90
@Bombe: Warum sollten wir erwarten müssen , über den internen Status von MessageDigest Bescheid zu wissen?
Dan Barowy
28
@DanBarowy gut, Sie werden es mutiert (dh das Aufrufen von Methoden, die keine Werte zurückgeben , aber andere Methoden führen zu unterschiedlichen Werten zurück) so , bis das Gegenteil bewiesen ist, sollten Sie immer davon ausgehen , dass es nicht-Thread - sicher , dies zu tun.
Bombe
3
Mit @Traubenfuchs MessageDigestkönnen Sie die Daten in Chunks eingeben . Mit einer statischen Methode wäre das nicht möglich. Obwohl Sie argumentieren können, sollten sie der Einfachheit halber trotzdem eine hinzugefügt haben, wenn Sie alle Daten auf einmal übergeben können.
user253751
690
Die MessageDigestKlasse kann Ihnen eine Instanz des MD5-Digests bereitstellen.
Wenn Sie mit Zeichenfolgen und Kryptoklassen arbeiten, müssen Sie immer die Codierung angeben, in der die Byte-Darstellung string.getBytes()angezeigt werden soll. Wenn Sie nur diese verwenden , wird die Plattform-Standardeinstellung verwendet. (Nicht alle Plattformen verwenden dieselben Standardeinstellungen.)
Wenn Sie viele Daten haben, schauen Sie sich die .update(byte[])Methode an, die wiederholt aufgerufen werden kann. Rufen Sie dann .digest()auf, um den resultierenden Hash zu erhalten.
Dieses Thema ist auch nützlich, wenn Sie die resultierenden Bytes in eine Hex-Zeichenfolge konvertieren müssen.
Wochen
1
Wie konvertierst du dann diesen Digest in einen String, damit wir ihn in MySQL einfügen können?
Humphrey
2
Besser noch, wo möglich verwenden yourString.getBytes(StandardCharsets.UTF_8). Dies verhindert die Handhabung eines UnsupportedEncodingException.
Hummeling Engineering BV
267
Wenn Sie die Antwort tatsächlich als Zeichenfolge im Gegensatz zu einem Byte-Array zurückhaben möchten, können Sie immer Folgendes tun:
String plaintext ="your text here";MessageDigest m =MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());byte[] digest = m.digest();BigInteger bigInt =newBigInteger(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: Nicht wahr, die BigInteger.toString-Methode gibt die vollständige Nummer in der angegebenen Basis zurück. 0x0606 wird als 606 gedruckt, nur nachgestellte Nullen werden weggelassen.
Spidey
11
Minor nitpick: m.reset () ist direkt nach dem Aufruf von getInstance nicht erforderlich. Kleinere: 'Ihr Text hier' erfordert doppelte Anführungszeichen.
David Leppik
Ab Java 11 können Sie hashtext = "0".repeat(32 - hashtext.length()) + hashtextanstelle von verwenden while, sodass die Editoren Sie nicht warnen, dass Sie eine Zeichenfolgenverkettung innerhalb einer Schleife durchführen.
Tom
Anstelle von m.update (plaintext.getBytes ()); Ich würde empfehlen, die Codierung anzugeben. wie m.update (plaintext.getBytes ("UTF-8")); getBytes () garantiert nicht die Codierung und kann von System zu System variieren, was zu unterschiedlichen MD5-Ergebnissen zwischen Systemen für denselben String führen kann.
user1819780
256
Möglicherweise möchten Sie auch die DigestUtils- Klasse des Apache Commons-Codec- Projekts betrachten, die sehr bequeme Methoden zum Erstellen von MD5- oder SHA- Digests bietet.
Insbesondere die Methoden, die "sichere" codierte Darstellungen der Byte-Daten in Zeichenfolgenform zurückgeben.
Rob
4
Es gibt jedoch keine einfache Möglichkeit, die DigestUtils-Klasse in Ihr Projekt aufzunehmen, ohne eine Tonne Bibliotheken hinzuzufügen oder die Klasse "pro Hand" zu portieren, für die mindestens zwei weitere Klassen erforderlich sind.
iuiz
Kann es auch nicht in Maven Repos finden. Grrrr.
Sparkyspider
5
Sollte sich in den zentralen Maven-Repositories befinden, es sei denn, ich werde verrückt: groupId = Commons-Codec-ArtefaktId = Commons-Codec-Version = 1.5
Nick Spacek
160
Ich habe es gefunden:
publicString MD5(String md5){try{
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");byte[] array = md.digest(md5.getBytes());StringBuffer sb =newStringBuffer();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){}returnnull;}
Auf der folgenden Seite nehme ich keine Anerkennung dafür, aber es ist eine Lösung, die funktioniert! Für mich funktionierten viele andere Codes nicht richtig. Am Ende fehlten mir Nullen im Hash. Dieser scheint der gleiche zu sein wie PHP. Quelle: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093
Sie sollten die Codierung angeben, in der verwendet werden soll getBytes(), da Ihr Code sonst auf verschiedenen Plattformen / Benutzereinstellungen unterschiedliche Ergebnisse erzielt.
Paŭlo Ebermann
@ PaŭloEbermann macht MessageDigest.getInstance ("MD5"); nicht genug? Ich habe versucht, "MD5" in getBytes () hinzuzufügen, aber es gab einen Fehler zurück
Blaze Tama
2
@BlazeTama "MD5" ist keine Codierung, sondern ein Message Digest-Algorithmus (und keiner, der in neuen Anwendungen verwendet werden sollte). Eine Codierung ist ein Algorithmuspaar, das Bytes in Zeichenfolgen und Zeichenfolgen in Bytes umwandelt. Ein Beispiel wäre "UTF-8", "US-ASCII", "ISO-8859-1", "UTF-16BE" und ähnliches. Verwenden Sie dieselbe Codierung wie bei jeder anderen Partei, die einen Hash dieser Zeichenfolge berechnet. Andernfalls erhalten Sie unterschiedliche Ergebnisse.
Paŭlo Ebermann
6
Für ein Beispiel des Zeichensatzes ... (verwenden Sie UTF-8, das ist meiner Meinung nach das beste und kompatibelste) ...byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
Richard
Da es nicht meine Lösung ist und ich nicht alle Szenarien selbst getestet habe, werde ich es unverändert lassen, obwohl ich denke, dass es wahrscheinlich eine gute Idee ist, Codierung usw. anzugeben.
dac2009
88
So benutze ich es:
finalMessageDigest messageDigest =MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(string.getBytes(Charset.forName("UTF8")));finalbyte[] resultByte = messageDigest.digest();finalString result =newString(Hex.encodeHex(resultByte));
Großartig. Es fällt nicht in die Falle, führende Nullen zu schneiden.
Markus Pscheidt
2
Beachten Sie, dass dies für Android nicht funktioniert, wenn Sie API-Level <19 verwenden. Sie müssen jedoch nur die zweite Zeile mit md5.update (string.getBytes ("UTF-8")) ändern. Dies wird jedoch noch eine weitere geprüfte Ausnahme hinzufügen ...
Fran Marzoa
34
Wir haben diese Lösung gefunden, die viel sauberer ist, wenn es darum geht, eine String-Darstellung von einem MD5-Hash zurückzugewinnen.
import java.security.*;import java.math.*;publicclass MD5 {publicstaticvoid main(String args[])throwsException{String s="This is a test";MessageDigest m=MessageDigest.getInstance("MD5");
m.update(s.getBytes(),0,s.length());System.out.println("MD5: "+newBigInteger(1,m.digest()).toString(16));}}
Warum hat diese Antwort -1, während die andere, kürzere und weniger beschreibende Antwort +146 hat?
Nilzor
4
Schön, BigInteger zu verwenden, um einen Hex-Wert +1 zu erhalten
Dave.B
5
Ich habe gerade herausgefunden, dass dies in einigen Fällen nur eine 31 Zeichen lange MD5-Summe erzeugt, nicht 32, wie es sein sollte
kovica
3
@kovica das liegt daran, dass die Anfangsnullen abgeschnitten werden, wenn ich mich recht erinnere. String.format("%032x", new BigInteger(1, hash)); Dies sollte dies lösen. 'Hash' ist das Byte [] des Hash.
Heshan Perera
Diese Antwort hat einen Fehler mit dem Zeichensatztyp!
Ich habe nur einen Einzeiler gesehen, der keine externe Bibliothek verwendet.
holmis83
Sofern ich mich nicht irre, wird dies immer in Großbuchstaben zurückgegeben, die nicht mit MD5s übereinstimmen, die ohne Verwendung von Hex erstellt wurden. Nicht einmal wirklich sicher, dass es ein wahrer md5 ist
walshie4
2
@ walshie4 gibt es kein MD5 ohne hex (siehe ietf.org/rfc/rfc1321.txt ), um es in Kleinbuchstaben zu bekommen, fügen Sie einfach .toLower () hinzu. Vergleichen Sie die Ergebnisse mit den Beispielen in z. B. en.wikipedia.org/wiki/MD5, dann haben Sie eine bessere Chance zu glauben, dass der Javas-Bibliothekscode korrekt ist.
Stapler
28
Ich habe eine Klasse (Hash), um einfachen Text in Hash in folgenden Formaten zu konvertieren: md5 oder sha1, ähnlich wie PHP funktioniert ( md5 , sha1 ):
publicclassHash{/**
*
* @param txt, text in plain format
* @param hashType MD5 OR SHA1
* @return hash in hashType
*/publicstaticString getHash(String txt,String hashType){try{
java.security.MessageDigest md = java.security.MessageDigest.getInstance(hashType);byte[] array = md.digest(txt.getBytes());StringBuffer sb =newStringBuffer();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){//error action}returnnull;}publicstaticString md5(String txt){returnHash.getHash(txt,"MD5");}publicstaticString sha1(String txt){returnHash.getHash(txt,"SHA1");}}
Die Antwort von Bombe ist richtig. Beachten Sie jedoch, dass SHA1 eine bessere Wahl ist, wenn Sie MD5 nicht unbedingt verwenden müssen (z. B. wegen Interoperabilität erzwungen), da MD5 Schwachstellen für die Langzeitanwendung aufweist.
Ich sollte hinzufügen, dass SHA1 auch theoretische Schwachstellen aufweist, jedoch nicht so schwerwiegend. Der aktuelle Stand der Technik beim Hashing ist, dass es eine Reihe von Kandidaten-Ersatz-Hash-Funktionen gibt, aber noch keine als Standard-Best Practice zum Ersetzen von SHA1 herausgekommen ist. Abhängig von Ihren Anforderungen sind Sie daher gut beraten, Ihren Hash-Algorithmus konfigurierbar zu machen, damit er in Zukunft ersetzt werden kann.
Könnten Sie mich auf einige Ressourcen verweisen, in denen ich über die relativen Vorzüge und Schwächen der einzelnen Ressourcen lesen kann?
Akshay
Wahrscheinlich ist das Beste, was Sie im Moment tun können, SHA1 zu verwenden und bereit zu sein, es in Zukunft zu ersetzen. Sie könnten neuere Funktionen verwenden, diese wurden jedoch noch nicht eingehend untersucht. Sie können Online-Sicherheitsressourcen nachverfolgen, um herauszufinden, wann sich dies ändert - zum Beispiel Bruce Schneiers Blog.
Frankodwyer
7
SHA1 ist übertrieben, es sei denn, Sie möchten einen kryptografisch sicheren Hash, dh Sie möchten nicht, dass der Hash bei der Rekonstruktion der ursprünglichen Nachricht hilft, und Sie möchten auch nicht, dass ein cleverer Angreifer eine andere Nachricht erstellt, die dem Hash entspricht. Wenn das Original kein Geheimnis ist und der Hash nicht für die Sicherheit verwendet wird, ist MD5 schnell und einfach. Beispielsweise verwendet Google Web Toolkit MD5-Hashes in JavaScript-URLs (z. B. foo.js? Hash = 12345).
Dies ist eine solide, eigenständige Bibliothek mit minimalen Abhängigkeiten. Gutes Zeug.
Ajax
Ich fand es sehr nützlich. Es dauerte 15357 ms für eine 4,57-GB-Datei, während die integrierte Java-Implementierung 19094 ms dauerte.
bkrish
11
Ich weiß nicht, ob dies für jemanden relevant ist, der dies liest, aber ich hatte gerade das Problem, das ich wollte
Laden Sie eine Datei von einer bestimmten URL herunter und
Vergleichen Sie den MD5 mit einem bekannten Wert.
Ich wollte es nur mit JRE-Klassen machen (keine Apache Commons oder ähnliches). Bei einer schnellen Websuche wurden mir keine Beispielcode-Schnipsel angezeigt, die beide gleichzeitig ausführen, sondern nur jede Aufgabe einzeln. Da dies erfordert, dass dieselbe Datei zweimal gelesen wird, hat es sich gelohnt, Code zu schreiben, der beide Aufgaben vereinheitlicht und die Prüfsumme beim Herunterladen der Datei im laufenden Betrieb berechnet. Dies ist mein Ergebnis (sorry, wenn es nicht perfektes Java ist, aber ich denke, Sie haben trotzdem die Idee):
Übrigens, bevor jemand außer mir bemerkt, wie schlecht meine JRE-Kenntnisse wirklich sind: Ich habe gerade DigestInputStream und DigestOutputStream entdeckt . Ich werde meine ursprüngliche Lösung bearbeiten, um zu reflektieren, was ich gerade gelernt habe.
Kriegaex
6
Schauen Sie sich den folgenden Link an, das Beispiel erhält einen MD5-Hash eines bereitgestellten Bildes:
MD5-Hash eines Bildes
Für das, was es wert ist, bin ich darauf gestoßen, weil ich GUIDs aus einem natürlichen Schlüssel für ein Programm synthetisieren möchte, das COM-Komponenten installiert. Ich möchte die Größe ändern, um den GUID-Lebenszyklus nicht zu verwalten. Ich werde MD5 verwenden und dann die UUID-Klasse verwenden, um eine Zeichenfolge daraus zu erhalten. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 wirft dieses Problem auf).
In jedem Fall kann java.util.UUID einen schönen String aus den MD5-Bytes erhalten.
Tatsächlich akzeptiert es nicht nur ein MD5-Byte-Array (Größe == 16). Sie können ein Byte-Array beliebiger Länge übergeben. Es wird mittels MD5 in ein MD5-Byte-Array konvertiert MessageDigest(siehe NameUUIDFromBytes ()
Im Gegensatz zu PHP, wo Sie einen MD5-Hashing Ihres Textes durchführen können, indem Sie einfach die md5-Funktion aufrufen, dh md5($text)in Java wurde dies etwas kompliziert. Normalerweise habe ich es implementiert, indem ich eine Funktion aufgerufen habe, die den md5-Hash-Text zurückgibt. Hier ist, wie ich es implementiert habe: Erstellen Sie zuerst eine Funktion, die md5hashingin Ihrer Hauptklasse wie unten angegeben benannt ist.
publicstaticString md5hashing(String text){String hashtext =null;try{String plaintext = text;MessageDigest m =MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());byte[] digest = m.digest();BigInteger bigInt =newBigInteger(1,digest);
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;}}catch(Exception e1){// TODO: handle exceptionJOptionPane.showMessageDialog(null,e1.getClass().getName()+": "+ e1.getMessage());}return hashtext;}
Rufen Sie nun die Funktion auf, wann immer Sie dies benötigen (siehe unten).
String text = textFieldName.getText();String pass = md5hashing(text);
Hier können Sie sehen, dass Hashtext mit einer Null versehen wird, damit er mit MD5-Hashing in PHP übereinstimmt.
MD5 ist vollkommen in Ordnung, wenn Sie nicht die beste Sicherheit benötigen und wenn Sie beispielsweise die Dateiintegrität überprüfen, spielt die Sicherheit keine Rolle. In diesem Fall möchten Sie möglicherweise etwas Einfacheres und Schnelleres in Betracht ziehen, z. B. Adler32, das auch von den Java-Bibliotheken unterstützt wird.
Was lässt Sie denken, dass Dateiintegrität kein Sicherheitsproblem ist?
Jeremy Huiskamp
5
Dieser gibt den genauen md5 an, den Sie von der md5-Funktion von mysql oder den md5-Funktionen von php usw. erhalten. Dies ist der, den ich verwende (Sie können ihn je nach Ihren Anforderungen ändern).
Dies ist wahrscheinlich die schlechteste Lösung, da führende Nullen entfernt werden.
Jannick
4
import java.security.MessageDigest
val digest =MessageDigest.getInstance("MD5")//Quick MD5 of text
val text ="MD5 this text!"
val md5hash1 = digest.digest(text.getBytes).map("%02x".format(_)).mkString
//MD5 of text with updates
digest.update("MD5 ".getBytes())
digest.update("this ".getBytes())
digest.update("text!".getBytes())
val md5hash2 = digest.digest().map(0xFF& _).map("%02x".format(_)).mkString
//Output
println(md5hash1 +" should be the same as "+ md5hash2)
Sie können MD5-Hash für einen bestimmten Text generieren, indem Sie die Methoden in der MessageDigestKlasse im java.securityPaket verwenden. Unten finden Sie das vollständige Code-Snippet.
Die Ausgabe der MD5-Funktion ist ein 128-Bit-Hash, der durch 32 Hexadezimalzahlen dargestellt wird.
Wenn Sie eine Datenbank wie MySQL verwenden, können Sie dies auch einfacher tun. Die Abfrage Select MD5(“text here”)gibt den MD5-Hash des Texts in der Klammer zurück.
Antworten:
Du brauchst
java.security.MessageDigest
.Rufen Sie
MessageDigest.getInstance("MD5")
an, um eine MD5-Instanz zu erhalten, dieMessageDigest
Sie verwenden können.Berechnen Sie den Hash, indem Sie einen der folgenden Schritte ausführen:
byte[]
und berechne den Hash in einer Operation mitmd.digest(bytes)
.MessageDigest
einenbyte[]
Klumpen zu einem Zeitpunkt durch den Aufrufmd.update(bytes)
. Wenn Sie mit dem Hinzufügen von Eingabebytes fertig sind, berechnen Sie den Hash mitmd.digest()
.Das
byte[]
zurückgegebenemd.digest()
ist der MD5-Hash.quelle
MessageDigest
können Sie die Daten in Chunks eingeben . Mit einer statischen Methode wäre das nicht möglich. Obwohl Sie argumentieren können, sollten sie der Einfachheit halber trotzdem eine hinzugefügt haben, wenn Sie alle Daten auf einmal übergeben können.Die
MessageDigest
Klasse kann Ihnen eine Instanz des MD5-Digests bereitstellen.Wenn Sie mit Zeichenfolgen und Kryptoklassen arbeiten, müssen Sie immer die Codierung angeben, in der die Byte-Darstellung
string.getBytes()
angezeigt werden soll. Wenn Sie nur diese verwenden , wird die Plattform-Standardeinstellung verwendet. (Nicht alle Plattformen verwenden dieselben Standardeinstellungen.)Wenn Sie viele Daten haben, schauen Sie sich die
.update(byte[])
Methode an, die wiederholt aufgerufen werden kann. Rufen Sie dann.digest()
auf, um den resultierenden Hash zu erhalten.quelle
yourString.getBytes(StandardCharsets.UTF_8)
. Dies verhindert die Handhabung einesUnsupportedEncodingException
.Wenn Sie die Antwort tatsächlich als Zeichenfolge im Gegensatz zu einem Byte-Array zurückhaben möchten, können Sie immer Folgendes tun:
quelle
hashtext = "0".repeat(32 - hashtext.length()) + hashtext
anstelle von verwendenwhile
, sodass die Editoren Sie nicht warnen, dass Sie eine Zeichenfolgenverkettung innerhalb einer Schleife durchführen.Möglicherweise möchten Sie auch die DigestUtils- Klasse des Apache Commons-Codec- Projekts betrachten, die sehr bequeme Methoden zum Erstellen von MD5- oder SHA- Digests bietet.
quelle
Ich habe es gefunden:
Auf der folgenden Seite nehme ich keine Anerkennung dafür, aber es ist eine Lösung, die funktioniert! Für mich funktionierten viele andere Codes nicht richtig. Am Ende fehlten mir Nullen im Hash. Dieser scheint der gleiche zu sein wie PHP. Quelle: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093
quelle
getBytes()
, da Ihr Code sonst auf verschiedenen Plattformen / Benutzereinstellungen unterschiedliche Ergebnisse erzielt.byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
So benutze ich es:
wo Hex ist:
org.apache.commons.codec.binary.Hex
aus dem Apache Commons-Projekt .quelle
String result = Hex.encodeHexString(resultByte);
Ich habe gerade commons-codec.jar heruntergeladen und ein perfektes PHP wie md5 bekommen. Hier ist manuell .
Importieren Sie es einfach in Ihr Projekt und verwenden Sie es
und da hast du es.
quelle
Ich habe festgestellt, dass dies der klarste und prägnanteste Weg ist, dies zu tun:
quelle
Wir haben diese Lösung gefunden, die viel sauberer ist, wenn es darum geht, eine String-Darstellung von einem MD5-Hash zurückzugewinnen.
Der Code wurde von hier extrahiert .
quelle
String.format("%032x", new BigInteger(1, hash));
Dies sollte dies lösen. 'Hash' ist das Byte [] des Hash.Eine andere Option ist die Verwendung der Guava Hashing-Methoden :
Praktisch, wenn Sie bereits Guava verwenden (was Sie wahrscheinlich tun sollten, wenn Sie dies nicht tun).
quelle
Hashing.md5().hashString("my string").asBytes();
Eine weitere Implementierung:
quelle
Ich habe eine Klasse (Hash), um einfachen Text in Hash in folgenden Formaten zu konvertieren: md5 oder sha1, ähnlich wie PHP funktioniert ( md5 , sha1 ):
Testen mit JUnit und PHP
PHP-Skript:
PHP-Skript ausgeben:
Beispiel verwenden und mit JUnit testen:
Code in GitHub
quelle
Keine Notwendigkeit, es zu kompliziert zu machen.
DigestUtils funktioniert einwandfrei und macht es Ihnen bequem, mit
md5
Hashes zu arbeiten.oder
Sie können entweder andere Verschlüsselungsmethoden wie
sha
oder verwendenmd
.quelle
Meine nicht sehr aufschlussreiche Antwort:
quelle
String.format("%1$032X", big)
ein Großbuchstabenformat zu habenEs gibt auch eine
DigestUtils
Klasse im Frühling :http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/DigestUtils.html
Diese Klasse enthält die Methode
md5DigestAsHex()
, die den Job ausführt.quelle
Sie können versuchen, zu folgen. Details und Download-Codes finden Sie hier: http://jkssweetlife.com/java-hashgenerator-md5-sha-1/
quelle
Die Antwort von Bombe ist richtig. Beachten Sie jedoch, dass SHA1 eine bessere Wahl ist, wenn Sie MD5 nicht unbedingt verwenden müssen (z. B. wegen Interoperabilität erzwungen), da MD5 Schwachstellen für die Langzeitanwendung aufweist.
Ich sollte hinzufügen, dass SHA1 auch theoretische Schwachstellen aufweist, jedoch nicht so schwerwiegend. Der aktuelle Stand der Technik beim Hashing ist, dass es eine Reihe von Kandidaten-Ersatz-Hash-Funktionen gibt, aber noch keine als Standard-Best Practice zum Ersetzen von SHA1 herausgekommen ist. Abhängig von Ihren Anforderungen sind Sie daher gut beraten, Ihren Hash-Algorithmus konfigurierbar zu machen, damit er in Zukunft ersetzt werden kann.
quelle
Eine weitere Implementierung: Schnelle MD5-Implementierung in Java
quelle
Ich weiß nicht, ob dies für jemanden relevant ist, der dies liest, aber ich hatte gerade das Problem, das ich wollte
Ich wollte es nur mit JRE-Klassen machen (keine Apache Commons oder ähnliches). Bei einer schnellen Websuche wurden mir keine Beispielcode-Schnipsel angezeigt, die beide gleichzeitig ausführen, sondern nur jede Aufgabe einzeln. Da dies erfordert, dass dieselbe Datei zweimal gelesen wird, hat es sich gelohnt, Code zu schreiben, der beide Aufgaben vereinheitlicht und die Prüfsumme beim Herunterladen der Datei im laufenden Betrieb berechnet. Dies ist mein Ergebnis (sorry, wenn es nicht perfektes Java ist, aber ich denke, Sie haben trotzdem die Idee):
quelle
Schauen Sie sich den folgenden Link an, das Beispiel erhält einen MD5-Hash eines bereitgestellten Bildes: MD5-Hash eines Bildes
quelle
Für das, was es wert ist, bin ich darauf gestoßen, weil ich GUIDs aus einem natürlichen Schlüssel für ein Programm synthetisieren möchte, das COM-Komponenten installiert. Ich möchte die Größe ändern, um den GUID-Lebenszyklus nicht zu verwalten. Ich werde MD5 verwenden und dann die UUID-Klasse verwenden, um eine Zeichenfolge daraus zu erhalten. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 wirft dieses Problem auf).
In jedem Fall kann java.util.UUID einen schönen String aus den MD5-Bytes erhalten.
quelle
MessageDigest
(siehe NameUUIDFromBytes ()quelle
Im Gegensatz zu PHP, wo Sie einen MD5-Hashing Ihres Textes durchführen können, indem Sie einfach die md5-Funktion aufrufen, dh
md5($text)
in Java wurde dies etwas kompliziert. Normalerweise habe ich es implementiert, indem ich eine Funktion aufgerufen habe, die den md5-Hash-Text zurückgibt. Hier ist, wie ich es implementiert habe: Erstellen Sie zuerst eine Funktion, diemd5hashing
in Ihrer Hauptklasse wie unten angegeben benannt ist.Rufen Sie nun die Funktion auf, wann immer Sie dies benötigen (siehe unten).
Hier können Sie sehen, dass Hashtext mit einer Null versehen wird, damit er mit MD5-Hashing in PHP übereinstimmt.
quelle
MD5 ist vollkommen in Ordnung, wenn Sie nicht die beste Sicherheit benötigen und wenn Sie beispielsweise die Dateiintegrität überprüfen, spielt die Sicherheit keine Rolle. In diesem Fall möchten Sie möglicherweise etwas Einfacheres und Schnelleres in Betracht ziehen, z. B. Adler32, das auch von den Java-Bibliotheken unterstützt wird.
quelle
Dieser gibt den genauen md5 an, den Sie von der md5-Funktion von mysql oder den md5-Funktionen von php usw. erhalten. Dies ist der, den ich verwende (Sie können ihn je nach Ihren Anforderungen ändern).
quelle
Versuche dies:
quelle
quelle
Sie können MD5-Hash für einen bestimmten Text generieren, indem Sie die Methoden in der
MessageDigest
Klasse imjava.security
Paket verwenden. Unten finden Sie das vollständige Code-Snippet.Die Ausgabe der MD5-Funktion ist ein 128-Bit-Hash, der durch 32 Hexadezimalzahlen dargestellt wird.
Wenn Sie eine Datenbank wie MySQL verwenden, können Sie dies auch einfacher tun. Die Abfrage
Select MD5(“text here”)
gibt den MD5-Hash des Texts in der Klammer zurück.quelle
Dies ist, was ich hierher gekommen bin - eine praktische Scala-Funktion, die eine Zeichenfolge von MD5-Hash zurückgibt:
quelle
Es gibt einen Artikel über Codingkit darüber. Überprüfen Sie: http://codingkit.com/a/JAVA/2013/1020/2216.html
quelle