Come posso generare un hash MD5?


Risposte:


602

Hai bisogno java.security.MessageDigest.

Chiama MessageDigest.getInstance("MD5")per ottenere un'istanza MD5 MessageDigestche puoi usare.

Calcola l'hash eseguendo una delle seguenti operazioni:

  • Alimenta l'intero input come a byte[]e calcola l'hash in un'unica operazione con md.digest(bytes).
  • Dai da mangiare a MessageDigestun byte[]pezzo alla volta chiamando md.update(bytes). Quando hai finito di aggiungere byte di input, calcola l'hash con md.digest().

Il byte[]restituito da md.digest()è l'hash MD5.


144
Una cosa che non è stata menzionata qui e mi ha sorpreso. Le classi MessageDigest NON sono thread-safe. Se verranno utilizzati da thread diversi, basta crearne uno nuovo, invece di provare a riutilizzarli.
mjuarez,

39
Utilizza più metodi per mutare il suo stato interno. In che modo la mancanza di sicurezza del filo può sorprendere del tutto?
Bombe

90
@Bombe: perché dovremmo aspettarci di avere di conoscere lo stato interno di MessageDigest?
Dan Barowy,

28
@DanBarowy, lo stai mutando (cioè chiamando metodi che non restituiscono valori ma fanno sì che altri metodi restituiscano valori diversi) quindi fino a prova, altrimenti dovresti sempre presumere che non sia sicuro per i thread farlo.
Bombe,

3
@Traubenfuchs MessageDigestti permette di inserire i dati in blocchi. Ciò non sarebbe possibile con un metodo statico. Sebbene si possa sostenere che avrebbero dovuto aggiungerne uno comunque per comodità quando è possibile passare tutti i dati in una volta.
user253751

690

La MessageDigestclasse può fornire un'istanza del digest MD5.

Quando lavori con le stringhe e le classi crypto assicurati di specificare sempre la codifica in cui vuoi che sia rappresentata la rappresentazione in byte. Se la usi solo string.getBytes(), utilizzerà la piattaforma predefinita. (Non tutte le piattaforme utilizzano le stesse impostazioni predefinite)

import java.security.*;

..

byte[] bytesOfMessage = yourString.getBytes("UTF-8");

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);

Se disponi di molti dati, dai un'occhiata al .update(byte[])metodo che può essere chiamato ripetutamente. Quindi chiama .digest()per ottenere l'hash risultante.


“LATIN1”! = “ASCII” (o “US-ASCII”). ASCII è un set di caratteri a 7 bit, Latin1 è un set di caratteri a 8 bit. Non sono gli stessi.
Bombe

8
(vedi joelonsoftware.com/articles/Unicode.html per una spiegazione e una spiegazione molto migliori)
Piskvor lasciò l'edificio il

14
Questo argomento è utile anche se è necessario convertire i byte risultanti in stringa esadecimale.
settimana

1
Quindi come si converte questo thigest in una stringa in modo da poterlo inserire in mysql?
Humphrey,

2
Meglio ancora, dove possibile usare yourString.getBytes(StandardCharsets.UTF_8). Questo impedisce la gestione di un UnsupportedEncodingException.
Hummeling Engineering BV

267

Se in realtà vuoi che la risposta sia una stringa anziché una matrice di byte, puoi sempre fare qualcosa del genere:

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: non è vero, il metodo BigInteger.toString restituirà il numero completo nella base specificata. 0x0606 verrà stampato come 606, vengono omessi solo zeri finali,
Spidey,

11
Minore nitpick: m.reset () non è necessario subito dopo aver chiamato getInstance. Più minore: "qui il tuo testo" richiede virgolette doppie.
David Leppik,

Da Java 11 in poi, puoi usare al hashtext = "0".repeat(32 - hashtext.length()) + hashtextposto di while, quindi gli editor non ti avvertiranno che stai eseguendo la concatenazione di stringhe all'interno di un loop.
tom

Invece di m.update (plaintext.getBytes ()); Consiglierei di specificare la codifica. come m.update (plaintext.getBytes ("UTF-8")); getBytes () non garantisce la codifica e può variare da sistema a sistema, il che può comportare risultati MD5 diversi tra sistemi per la stessa stringa.
user1819780

256

Potresti anche voler esaminare la classe DigestUtils del progetto codec commons apache , che fornisce metodi molto convenienti per creare digest MD5 o SHA.


2
In particolare, i metodi che restituiscono rappresentazioni codificate "sicure" dei dati byte in forma di stringa.
Rob,

4
Tuttavia, non esiste un modo semplice per inserire la classe DigestUtils nel tuo progetto senza aggiungere tonnellate di librerie o porting della classe "per mano" che richiede almeno altre due classi.
iuiz,

Non riesco a trovarlo nei repository Maven. Grrrr.
sparkyspider,

5
Dovrebbe essere nei repository Maven centrali, a meno che non impazzisca: groupId = commons-codec artefactId = commons-codec version = 1.5
Nick Spacek,

160

Trovato questo:

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

sul sito qui sotto, non me lo merito, ma è una soluzione che funziona! Per me un sacco di altro codice non ha funzionato correttamente, ho finito per perdere 0 nell'hash. Questo sembra essere lo stesso di PHP. fonte: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093


15
È necessario specificare la codifica in cui utilizzare getBytes(), altrimenti il ​​codice otterrà risultati diversi su piattaforme / impostazioni utente diverse.
Paŭlo Ebermann,

@ PaŭloEbermann fa MessageDigest.getInstance ("MD5"); non abbastanza? Ho provato ad aggiungere "MD5" in getBytes () ma ha restituito un errore
Blaze Tama,

2
@BlazeTama "MD5" non è una codifica, è un algoritmo di digest dei messaggi (e non uno che dovrebbe essere usato in nuove applicazioni). Una codifica è una coppia di algoritmi che trasforma i byte in stringhe e le stringhe in byte. Un esempio potrebbe essere "UTF-8", "US-ASCII", "ISO-8859-1", "UTF-16BE" e simili. Usa la stessa codifica di ogni altra parte che calcola un hash di questa stringa, altrimenti otterrai risultati diversi.
Paŭlo Ebermann,

6
Per un esempio del set di caratteri ... (usa UTF-8, questo è il migliore e il più compatibile secondo me) ...byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
Richard

Dal momento che non è la mia soluzione, e non ho testato personalmente tutti gli scenari, la lascerò invariata, anche se penso che specificare la codifica ecc. Sia probabilmente una buona idea.
dac2009,

88

Ecco come lo uso:

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

dove Hex è: org.apache.commons.codec.binary.Hexdal progetto Apache Commons .


14
Se usi comunque Apache Commons Codec puoi usare: commons.apache.org/codec/api-release/org/apache/commons/codec/…
squiddle

13
Vorrei sostituire l'ultima riga con questa:String result = Hex.encodeHexString(resultByte);
bluastro

84

Ho appena scaricato commons-codec.jar e ho ottenuto un PHP perfetto come md5. Ecco il manuale .

Basta importarlo nel tuo progetto e utilizzarlo

String Url = "your_url";

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

E il gioco è fatto.


1
Questo è il metodo che fornisce lo stesso valore di ritorno della funzione MySQL md5 (str). Molte altre risposte hanno restituito altri valori.
rwitzel,

1
Questo non funziona bene su Android, perché Android impacchetta commons-codec 1.2, per il quale è necessario questa soluzione: stackoverflow.com/a/9284092/2413303
EpicPandaForce

76

Ho trovato che questo è il modo più chiaro e conciso per farlo:

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));

3
Grande. Non cade nella trappola del taglio degli zeri iniziali.
Markus Pscheidt,

2
Attenzione, non funzionerà per Android se si utilizza il livello API <19, ma è sufficiente modificare la seconda riga con md5.update (string.getBytes ("UTF-8")); Questo aggiungerà ancora un'altra eccezione controllata da gestire, però ...
Fran Marzoa,

34

Ho trovato questa soluzione molto più pulita in termini di recupero di una rappresentazione String da un hash MD5.

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

Il codice è stato estratto da qui .


2
Perché questa risposta -1 mentre l'altra risposta più breve e meno descrittiva ha +146?
Nilzor,

4
Bello usare BigInteger per ottenere un valore esadecimale +1
Dave.B

5
Ho appena scoperto che in alcuni casi questo genera solo una somma di MD5 lunga 31 caratteri, non 32 come dovrebbe essere
kovica

3
@kovica questo perché, gli zeri di partenza vengono troncati se ricordo bene .. String.format("%032x", new BigInteger(1, hash)); Questo dovrebbe risolvere questo. 'hash' è il byte [] dell'hash.
Heshan Perera,

Questa risposta ha un bug con il tipo di set di caratteri!
Dawid Drozd,

31

Un'altra opzione è quella di utilizzare i metodi di hash guava :

Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();

Comodo se stai già usando Guava (che se non lo sei, probabilmente dovresti esserlo).


3
o usando uno dei metodi di scelta rapida:Hashing.md5().hashString("my string").asBytes();
Kurt Alfred Kluever,

4
@KurtAlfredKluever non dimenticare di inserire il set di caratteri come 'Hashing.md5 (). HashString ("my string", Charsets.UTF_8) .asBytes ()'
Justin

31

Un'altra implementazione:

import javax.xml.bind.DatatypeConverter;

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

2
Ho visto solo una riga che non utilizza una libreria esterna.
holmis83,

A meno che non mi sbagli, questo ritorna sempre in maiuscolo, che non si allinea con gli md5 creati senza usare hex. Non sono nemmeno sicuro che sia un vero md5
walshie4,

2
@ walshie4 non c'è MD5 senza hex (vedi ietf.org/rfc/rfc1321.txt ), per farlo in minuscolo è sufficiente aggiungere .toLower (). Confronta i risultati con gli esempi in es. En.wikipedia.org/wiki/MD5, quindi avrai maggiori possibilità di credere che il codice della libreria Javas sia corretto.
impilatore

28

Ho una classe (hash) per convertire il testo normale in hash nei formati: md5 o sha1, simillar che funzioni 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");
    }
}

Test con JUnit e PHP

Script PHP:

<?php

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

Output script PHP:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

Utilizzando esempio e test con JUnit:

    public class HashTest {

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

}

Codice in GitHub

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


Come diceva @CedricSimon, è esattamente quello che stavo cercando. Vota qui .. Grazie!
Joabe Lucena,

24

Non c'è bisogno di renderlo troppo complicato.
DigestUtils funziona bene e ti mette a tuo agio mentre lavori con gli md5hash.

DigestUtils.md5Hex(_hash);

o

DigestUtils.md5(_hash);

È possibile utilizzare qualsiasi altro metodo di crittografia come shao md.


22

La mia risposta non molto rivelatrice:

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

e String.format("%1$032X", big)avere un formato maiuscolo
alex


17

Puoi provare a seguire. Vedi i dettagli e scarica i codici qui: 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

La risposta di Bombe è corretta, tuttavia nota che, a meno che tu non debba assolutamente usare MD5 (ad es. Forzato per l'interoperabilità), una scelta migliore è SHA1 poiché MD5 presenta punti deboli per un uso a lungo termine.

Dovrei aggiungere che SHA1 ha anche vulnerabilità teoriche, ma non così gravi. L'attuale stato dell'arte nell'hash è che esistono numerose funzioni hash sostitutive candidate ma nessuna è ancora emersa come la migliore pratica standard per sostituire SHA1. Quindi, a seconda delle tue esigenze, ti consigliamo di rendere configurabile il tuo algoritmo hash in modo che possa essere sostituito in futuro.


Potresti indicarmi alcune risorse, dove posso leggere i meriti e i punti deboli relativi di ciascuno?
Akshay,

Probabilmente il meglio che puoi fare al momento è usare SHA1 ed essere pronto a sostituirlo in futuro. Potresti utilizzare le nuove funzioni ma non sono ancora state oggetto di grandi ricerche. È possibile tenere traccia delle risorse di sicurezza online per scoprire quando questo cambia, ad esempio il blog di Bruce Schneier.
frankodwyer,

7
SHA1 è eccessivo a meno che tu non voglia un hash crittograficamente sicuro, cioè non vuoi che l'hash aiuti a ricostruire il messaggio originale, né vuoi che un aggressore intelligente crei un altro messaggio che corrisponda all'hash. Se l'originale non è un segreto e l'hash non viene utilizzato per motivi di sicurezza, MD5 è semplice e veloce. Ad esempio, Google Web Toolkit utilizza gli hash MD5 negli URL JavaScript (ad esempio foo.js? Hash = 12345).
David Leppik,

12

Un'altra implementazione: implementazione MD5 veloce in Java

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

1
Questa è una libreria solida e indipendente con dipendenze minime. Roba buona.
Ajax

L'ho trovato molto utile. Sono stati necessari 15357 ms per un file da 4,57 GB, mentre l'implementazione integrata java ha richiesto 19094 ms.
bkrish,

11

Non so se questo è rilevante per chiunque legga questo, ma ho appena avuto il problema che volevo

  • scarica un file da un determinato URL e
  • confronta il suo MD5 con un valore noto.

Volevo farlo solo con le classi JRE (no Apache Commons o simili). Una rapida ricerca sul Web non mi ha mostrato frammenti di codice di esempio che eseguivano entrambi contemporaneamente, ma solo ciascuna attività separatamente. Poiché questo richiede di leggere lo stesso file due volte, ho pensato che sarebbe valsa la pena scrivere del codice che unifica entrambe le attività, calcolando al volo la somma di controllo durante il download del file. Questo è il mio risultato (scusate se non è perfetto Java, ma credo che abbiate preso l'idea comunque):

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
Oh, a proposito, prima che qualcuno, tranne me stesso, notasse quanto male fosse la mia conoscenza di JRE: ho appena scoperto DigestInputStream e DigestOutputStream . Ho intenzione di modificare la mia soluzione originale per riflettere ciò che ho appena imparato.
Kriegaex,

6

Dai un'occhiata al seguente link, l'esempio ottiene un hash MD5 di un'immagine fornita: hash MD5 di un'immagine


6

Per quello che vale, mi sono imbattuto in questo perché voglio sintetizzare GUID da una chiave naturale per un programma che installerà componenti COM; Voglio sintetizzare in modo da non gestire il ciclo di vita del GUID. Userò MD5 e poi userò la classe UUID per estrarne una stringa. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 solleva questo problema).

In ogni caso, java.util.UUID può ottenere una bella stringa dai byte MD5.

return UUID.nameUUIDFromBytes(md5Bytes).toString();

in realtà accetta non solo array di byte MD5 (dimensione == 16). È possibile passare array di byte di qualsiasi lunghezza. Verrà convertito in array di byte MD5 mediante MD5 MessageDigest(vedere il codice sorgente nameUUIDFromBytes () )
Lu55

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

A differenza di PHP in cui è possibile eseguire un hash MD5 del testo semplicemente chiamando la funzione md5, ad esempio md5($text), in Java è stato reso un po 'complicato. Di solito l'ho implementato chiamando una funzione che restituisce il testo hash md5. Ecco come l'ho implementato, per prima cosa crea una funzione chiamata md5hashingall'interno della tua classe principale come indicato di seguito.

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

Ora chiama la funzione ogni volta che è necessario come indicato di seguito.

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

Qui puoi vedere che hashtext è aggiunto con uno zero per farlo corrispondere con hash md5 in PHP.


5

MD5 è perfetto se non hai bisogno della migliore sicurezza e se stai facendo qualcosa come il controllo dell'integrità dei file, la sicurezza non è una considerazione. In tal caso potresti voler considerare qualcosa di più semplice e veloce, come Adler32, che è supportato anche dalle librerie Java.


2
Cosa ti fa pensare che l'integrità dei file non sia un problema di sicurezza?
Jeremy Huiskamp,

5

questo fornisce l'esatto md5 come si ottiene dalla funzione md5 di mysql o dalle funzioni md5 di php ecc. Questo è quello che uso (puoi cambiare in base alle tue esigenze)

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

prova questo:

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
Questa è probabilmente la soluzione peggiore in quanto elimina gli zeri iniziali.
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
Questa è la lingua di Kotlin?
Isuru,

3
@Isuru sembra Scala
gildor,

4

È possibile generare l'hash MD5 per un determinato testo facendo uso dei metodi nella MessageDigestclasse nel java.securitypacchetto. Di seguito è riportato lo snippet di codice completo,

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

L'output della funzione MD5 è un hash a 128 bit rappresentato da 32 numeri esadecimali.

Nel caso, se si utilizza un database come MySQL, è possibile farlo anche in un modo più semplice. La query Select MD5(“text here”)restituirà l'hash MD5 del testo tra parentesi.


2

Questo è ciò per cui sono venuto qui: una comoda funzione scala che restituisce una stringa di hash MD5:

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

C'è un articolo su Codingkit al riguardo. Scopri: http://codingkit.com/a/JAVA/2013/1020/2216.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.