Gibt es eine Methode zum Generieren von MD5-Hash eines Strings in Java?
Gibt es eine Methode zum Generieren von MD5-Hash eines Strings in Java?
Antworten:
Du brauchst java.security.MessageDigest
.
Rufen Sie MessageDigest.getInstance("MD5")
an, um eine MD5-Instanz zu erhalten, die MessageDigest
Sie verwenden können.
Berechnen Sie den Hash, indem Sie einen der folgenden Schritte ausführen:
byte[]
und berechne den Hash in einer Operation mit md.digest(bytes)
.MessageDigest
einen 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.
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.)
import java.security.*;
..
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);
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.
yourString.getBytes(StandardCharsets.UTF_8)
. Dies verhindert die Handhabung eines UnsupportedEncodingException
.
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 = 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;
}
hashtext = "0".repeat(32 - hashtext.length()) + hashtext
anstelle von verwenden while
, 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.
Ich habe es 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 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
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:
final MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(string.getBytes(Charset.forName("UTF8")));
final byte[] resultByte = messageDigest.digest();
final String result = new String(Hex.encodeHex(resultByte));
wo Hex ist: org.apache.commons.codec.binary.Hex
aus dem Apache Commons-Projekt .
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
String Url = "your_url";
System.out.println( DigestUtils.md5Hex( Url ) );
und da hast du es.
Ich habe festgestellt, dass dies der klarste und prägnanteste Weg ist, dies zu tun:
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
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.*;
public class MD5 {
public static void main(String args[]) throws Exception{
String s="This is a test";
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(s.getBytes(),0,s.length());
System.out.println("MD5: "+new BigInteger(1,m.digest()).toString(16));
}
}
Der Code wurde von hier extrahiert .
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 :
Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();
Praktisch, wenn Sie bereits Guava verwenden (was Sie wahrscheinlich tun sollten, wenn Sie dies nicht tun).
Hashing.md5().hashString("my string").asBytes();
Eine weitere Implementierung:
import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(
MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
Ich habe eine Klasse (Hash), um einfachen Text in Hash in folgenden Formaten zu konvertieren: md5 oder sha1, ähnlich wie PHP funktioniert ( md5 , sha1 ):
public class Hash {
/**
*
* @param txt, text in plain format
* @param hashType MD5 OR SHA1
* @return hash in hashType
*/
public static String getHash(String txt, String hashType) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance(hashType);
byte[] array = md.digest(txt.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) {
//error action
}
return null;
}
public static String md5(String txt) {
return Hash.getHash(txt, "MD5");
}
public static String sha1(String txt) {
return Hash.getHash(txt, "SHA1");
}
}
<?php
echo 'MD5 :' . md5('Hello World') . "\n";
echo 'SHA1:' . sha1('Hello World') . "\n";
MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0
public class HashTest {
@Test
public void test() {
String txt = "Hello World";
assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt));
assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt));
}
}
Keine Notwendigkeit, es zu kompliziert zu machen.
DigestUtils funktioniert einwandfrei und macht es Ihnen bequem, mit md5
Hashes zu arbeiten.
DigestUtils.md5Hex(_hash);
oder
DigestUtils.md5(_hash);
Sie können entweder andere Verschlüsselungsmethoden wie sha
oder verwenden md
.
Meine nicht sehr aufschlussreiche Antwort:
private String md5(String s) {
try {
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(s.getBytes(), 0, s.length());
BigInteger i = new BigInteger(1,m.digest());
return String.format("%1$032x", i);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
String.format("%1$032X", big)
ein Großbuchstabenformat zu haben
Sie können versuchen, zu folgen. 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();
}
}
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.
Eine weitere Implementierung: Schnelle MD5-Implementierung in Java
String hash = MD5.asHex(MD5.getHash(new File(filename)));
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):
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)
);
}
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.
return UUID.nameUUIDFromBytes(md5Bytes).toString();
MessageDigest
(siehe NameUUIDFromBytes ()
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();
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 md5hashing
in Ihrer Hauptklasse wie unten angegeben benannt ist.
public static String 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 = new BigInteger(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 exception
JOptionPane.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.
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).
public static String md5( String input ) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(input.getBytes( "UTF-8" ));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; i++) {
sb.append( String.format( "%02x", array[i]));
}
return sb.toString();
} catch ( NoSuchAlgorithmException | UnsupportedEncodingException e) {
return null;
}
}
Versuche dies:
public static String getHashMD5(String string) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
BigInteger bi = new BigInteger(1, md.digest(string.getBytes()));
return bi.toString(16);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(MD5Utils.class
.getName()).log(Level.SEVERE, null, ex);
return "";
}
}
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 MessageDigest
Klasse im java.security
Paket verwenden. Unten finden Sie das vollständige Code-Snippet.
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;
public class MD5HashGenerator
{
public static void main(String args[]) throws NoSuchAlgorithmException
{
String stringToHash = "MyJavaCode";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(stringToHash.getBytes());
byte[] digiest = messageDigest.digest();
String hashedOutput = DatatypeConverter.printHexBinary(digiest);
System.out.println(hashedOutput);
}
}
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.
Dies ist, was ich hierher gekommen bin - eine praktische Scala-Funktion, die eine Zeichenfolge von MD5-Hash zurückgibt:
def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* MD5 encryption
*
* @author Hongten
*
*/
public class MD5 {
public static void main(String[] args) {
System.out.println(MD5.getMD5("123456"));
}
/**
* Use md5 encoded code value
*
* @param sInput
* clearly
* @ return md5 encrypted password
*/
public static String getMD5(String sInput) {
String algorithm = "";
if (sInput == null) {
return "null";
}
try {
algorithm = System.getProperty("MD5.algorithm", "MD5");
} catch (SecurityException se) {
}
MessageDigest md = null;
try {
md = MessageDigest.getInstance(algorithm);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte buffer[] = sInput.getBytes();
for (int count = 0; count < sInput.length(); count++) {
md.update(buffer, 0, count);
}
byte bDigest[] = md.digest();
BigInteger bi = new BigInteger(bDigest);
return (bi.toString(16));
}
}
Es gibt einen Artikel über Codingkit darüber. Überprüfen Sie: http://codingkit.com/a/JAVA/2013/1020/2216.html