Wie kann ich einen MD5-Hash generieren?


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.


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.


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

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.


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


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 .


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.


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

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 .


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


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

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


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.


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

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

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.


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

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

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


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

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

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.


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.


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

}

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

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)

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.


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(""){_ + _}

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.