it-swarm.com.de

Wie kann ich einen MD5-Hash generieren?

Gibt es eine Methode, um MD5-Hash einer Zeichenfolge in Java zu generieren?

931
Akshay

Java.security.MessageDigest ist dein Freund. Rufen Sie getInstance("MD5") auf, um einen MD5-Nachrichten-Digest zu erhalten, den Sie verwenden können.

564
Bombe

Die MessageDigest-Klasse kann eine Instanz des MD5-Digest bereitstellen.

Wenn Sie mit Strings und den Crypto-Klassen arbeiten, stellen Sie sicher, dass always die Kodierung für die Bytedarstellung angibt. Wenn Sie nur string.getBytes() verwenden, wird der Plattformstandard verwendet. (Nicht alle Plattformen verwenden die gleichen 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.

663
koregan

Vielleicht 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.

252
lutzh

Wenn Sie die Antwort tatsächlich als Zeichenfolge im Gegensatz zu einem Byte-Array zurückgeben möchten, können Sie immer 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;
}
251
user49913

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 kann ich nichts dafür sagen, aber es ist eine Lösung, die funktioniert! Für mich funktionierte viel anderer Code nicht richtig, und am Ende fehlten mir 0s im Hash .. __ dasselbe wie PHP hat . source: http://m2tec.be/blog/2010/02/03/Java-md5-hex-0093

153
dac2009

So verwende 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 .

84
adranale

Ich habe gerade commons-codec.jar heruntergeladen und ein perfektes PHP wie MD5 erhalten. Hier ist manual .

Importieren Sie es einfach in Ihr Projekt und verwenden Sie es

String Url = "your_url";

System.out.println( DigestUtils.md5Hex( Url ) );

und dort hast du es.

82
Eugene

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()));
66
rednoah

Ich habe diese Lösung gefunden, die im Hinblick auf das Abrufen einer String-Darstellung von einem MD5-Hash viel sauberer ist.

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 aus hier extrahiert.

32
Heshan Perera

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 sonst wahrscheinlich der Fall sein sollte).

31
andrewrjones

Eine andere Implementierung:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
30
stacker

Ich habe eine Klasse (Hash) zum Konvertieren von Klartext in Hash-Formaten in den Formaten: MD5 oder SHA1, ähnlich wie PHP ( 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");
    }
}

Testen mit JUnit und PHP

PHP-Skript:

<?php

echo 'MD5 :' . md5('Hello World') . "\n";
echo 'SHA1:' . sha1('Hello World') . "\n";

Skript ausgeben PHP:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

Beispiel verwenden und mit JUnit testen:

    public class HashTest {

    @Test
    public void test() {
        String txt = "Hello World";
        assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt));
        assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt));
    }

}

Code in GitHub

https://github.com/fitorec/Java-hashes

28
fitorec

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;
}
22
marioosh

Keine Notwendigkeit, es zu kompliziert zu machen. DigestUtils funktioniert gut und macht es Ihnen bequem, mit MD5-Hashes zu arbeiten.

DigestUtils.md5Hex(_hash);

oder

DigestUtils.md5(_hash);

Sie können auch andere Verschlüsselungsmethoden wie sha oder md verwenden.

19
Fatih Karatana

Bombes Antwort ist korrekt, es sei denn, Sie müssen unbedingt MD5 verwenden (z. B. wegen Interoperabilität zwingend erforderlich). Eine bessere Wahl ist SHA1, da MD5 Schwachstellen für den Langzeitgebrauch aufweist.

Ich sollte hinzufügen, dass SHA1 auch theoretische Schwachstellen aufweist, jedoch nicht so gravierend. Der gegenwärtige Stand der Technik beim Hashing ist, dass es eine Anzahl von Kandidaten-Ersatz-Hash-Funktionen gibt, aber noch keine als bewährte Standardmethode zum Ersetzen von SHA1 aufgetaucht ist. Abhängig von Ihren Anforderungen ist es daher ratsam, Ihren Hash-Algorithmus so zu konfigurieren, dass er in Zukunft ersetzt werden kann.

16
frankodwyer

In Spring gibt es auch eine DigestUtils-Klasse:

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. 

15
Raul Luna

Sie können folgendes versuchen. Einzelheiten und Downloadcodes 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();
}
}
14
ylu

Eine weitere Implementierung: Schnelle MD5-Implementierung in Java

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

Ich weiß nicht, ob dies für jeden relevant ist, der dies liest, aber ich hatte nur das Problem, das ich wollte

  • eine Datei von einer bestimmten URL herunterladen und
  • vergleichen Sie das MD5 mit einem bekannten Wert.

Ich wollte es nur mit JRE-Klassen machen (kein Apache Commons oder ähnliches). Bei einer schnellen Websuche wurden mir keine Beispielcodeausschnitte angezeigt, die beide gleichzeitig nur jede Aufgabe einzeln ausführen. Da dies erforderlich ist, um dieselbe Datei zweimal zu lesen, dachte ich mir, dass es sich möglicherweise lohnt, Code zu schreiben, der beide Aufgaben vereint und die Prüfsumme während des Herunterladens der Datei berechnet. Dies ist mein Ergebnis (sorry, wenn es nicht perfektes Java ist, aber ich schätze, Sie bekommen 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)
        );
}
9
kriegaex

Schauen Sie sich den folgenden Link an, das Beispiel liefert einen MD5-Hash eines bereitgestellten Bildes: MD5-Hash eines Bildes

6
Thomas

Ich bin 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 zusammenarbeiten, um den GUID Lebenszyklus nicht zu verwalten. Ich verwende MD5 und dann die UUID-Klasse, 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 Nice-String aus den MD5-Bytes abrufen.

return UUID.nameUUIDFromBytes(md5Bytes).toString();
6
Mihai Danila

MD5 ist vollkommen in Ordnung, wenn Sie nicht die beste Sicherheit benötigen. Wenn Sie beispielsweise die Dateiintegrität prüfen, ist Sicherheit kein Thema. In einem solchen Fall möchten Sie vielleicht etwas Einfacheres und schnelleres in Betracht ziehen, z. B. Adler32, das auch von den Java-Bibliotheken unterstützt wird.

5
Mike
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();
4
Giancarlo Romeo

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 "";
    }
}
4
Marcelo Lopes
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)
3
HimalayanCoder

dieses gibt das genaue MD5 an, wie Sie es von Mysql's MD5-Funktion oder PHP-MD5-Funktionen usw. erhalten. Dies ist die, die ich verwende (Sie können entsprechend Ihren Bedürfnissen ä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;            
    }

}
3
Aurangzeb

Im Gegensatz zu PHP, bei dem Sie einen MD5-Hashing Ihres Textes durchführen können, indem Sie einfach md5-Funktion aufrufen, dh md5($text), wurde dies in Java etwas kompliziert. Ich habe es normalerweise implementiert, indem ich eine Funktion aufrief, die den MD5-Hashtext zurückgibt. So habe ich es implementiert: Erstellen Sie zunächst eine Funktion mit dem Namen md5hashing in Ihrer Hauptklasse (siehe unten). 

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.

String text = textFieldName.getText();
String pass = md5hashing(text);

Hier sehen Sie, dass Hashtext mit einer Null angehängt wird, damit er mit md5-Hashing in PHP übereinstimmt.

3
Geordy James

Dafür habe ich hergekommen - eine praktische Scala-Funktion, die einen MD5-Hash-String zurückgibt: 

def md5(text: String) : String = Java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
2
Priyank Desai

Sie können MD5-Hash für einen bestimmten Text erzeugen, indem Sie die Methoden in der Klasse MessageDigest im Paket Java.security verwenden. Unten ist der vollständige Code-Ausschnitt,

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 auf einfachere Weise tun. Die Abfrage Select MD5(“text here”) gibt den MD5-Hash des Textes in der Klammer zurück. 

0
Prasanna L M
 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));
 }
}

Darüber gibt es einen Artikel über Codingkit. Check out: http://codingkit.com/a/Java/2013/1020/2216.html

0
shouyu