Wie kann ich einen MD5-Hash generieren?

1007

Gibt es eine Methode zum Generieren von MD5-Hash eines Strings in Java?

Akshay
quelle
40
MD5 ist möglicherweise als Einweg-Sicherheitsfunktion unsicher, eignet sich jedoch weiterhin für allgemeine Prüfsummenanwendungen.
Rustyx
Sie können in PHP versuchen, sehr einfach zu lösen.
Anupam Haldkar

Antworten:

602

Du brauchst java.security.MessageDigest.

Rufen Sie MessageDigest.getInstance("MD5")an, um eine MD5-Instanz zu erhalten, die MessageDigestSie verwenden können.

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.

Bombe
quelle
144
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.)

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.

koregan
quelle
"LATIN1"! = "ASCII" (oder "US-ASCII"). ASCII ist ein 7-Bit-Zeichensatz, Latin1 ist ein 8-Bit-Zeichensatz. Sie sind nicht gleich.
Bombe
8
(Siehe joelonsoftware.com/articles/Unicode.html für eine viel bessere Begründung und Erklärung)
Piskvor verließ das Gebäude am
14
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 = 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;
}
user49913
quelle
12
@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.

lutzh
quelle
2
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:

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

dac2009
quelle
15
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:

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.Hexaus dem Apache Commons-Projekt .

adranale
quelle
14
Wenn Sie Apache Commons Codec trotzdem verwenden, können Sie Folgendes
squiddle
13
Ich würde die letzte Zeile durch folgende ersetzen:String result = Hex.encodeHexString(resultByte);
bläulich
84

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.

Eugene
quelle
1
Dies ist die Methode, die denselben Rückgabewert wie die MySQL-Funktion md5 (str) liefert. Viele der anderen Antworten gaben andere Werte zurück.
Rwitzel
1
Dies funktioniert nicht richtig unter Android, da Android Commons-Codec 1.2 bündelt, für den Sie diese Problemumgehung
EpicPandaForce
76

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()));
Rednoah
quelle
3
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.*;

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 .

Heshan Perera
quelle
2
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!
Dawid Drozd
31

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

andrewrjones
quelle
3
oder mit einer der Abkürzungsmethoden:Hashing.md5().hashString("my string").asBytes();
Kurt Alfred Kluever
4
@KurtAlfredKluever vergessen Sie nicht, den Zeichensatz wie 'Hashing.md5 (). HashString ("my string", Charsets.UTF_8) .asBytes ()' einzufügen
Justin
31

Eine weitere Implementierung:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
Stapler
quelle
2
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 ):

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";

PHP-Skript ausgeben:

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

fitorec
quelle
Wie @CedricSimon sagte, genau das habe ich gesucht. Upvote hier .. Danke!
Joabe Lucena
24

Keine Notwendigkeit, es zu kompliziert zu machen.
DigestUtils funktioniert einwandfrei und macht es Ihnen bequem, mit md5Hashes zu arbeiten.

DigestUtils.md5Hex(_hash);

oder

DigestUtils.md5(_hash);

Sie können entweder andere Verschlüsselungsmethoden wie shaoder verwenden md.

Fatih Karatana
quelle
22

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;
}
Marioosh
quelle
und String.format("%1$032X", big)ein Großbuchstabenformat zu haben
Alex
17

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();
}
}
ylu
quelle
16

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.

frankodwyer
quelle
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).
David Leppik
12

Eine weitere Implementierung: Schnelle MD5-Implementierung in Java

String hash = MD5.asHex(MD5.getHash(new File(filename)));
Lukasz R.
quelle
1
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):

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)
        );
}
Kriegaex
quelle
1
Ü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


quelle
6

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();
Mihai Danila
quelle
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 ()
-Quellcode
6
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();
Giancarlo Romeo
quelle
6

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.

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.

Geordy James
quelle
5

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
2
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).

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

}
Aurangzeb
quelle
4

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 "";
    }
}
Marcelo Lopes
quelle
2
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)
HimalayanCoder
quelle
1
Ist das Kotlin Sprache?
Isuru
3
@Isuru sieht aus wie Scala
Gildor
4

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.

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.

Prasanna LM
quelle
2

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(""){_ + _}
Priyank Desai
quelle
0
 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

Shouyu
quelle