2012-11-30 12 views
5

Qualcosa nella parte posteriore della mia testa mi sta dicendo che mi manca qualcosa di ovvio qui.MessageDigest MD5 Algorithm non restituisce quello che mi aspetto

Sto integrando un progetto java esistente con una API di terze parti che utilizza un hash md5 di una chiave API per l'autenticazione. Non funziona per me, e durante il debug mi sono reso conto che gli hash che sto generando non corrispondono agli esempi che hanno fornito. Ho trovato alcuni siti Web che creano hash MD5 dalle stringhe per controllare i loro esempi e, per quanto posso dire, ho sbagliato e hanno ragione.

ad esempio, in base allo this website, la stringa "ciao" genera un hash di "5d41402abc4b2a76b9719d911017c592". (FWIW Non so nulla su questo sito web, tranne che sembra correttamente hash gli esempi che ho). Quando eseguo attraverso il mio codice ottengo:

XUFAKrxLKna5cZ2REBfFkg ==

Ecco il semplice metodo che sto utilizzando per generare l'hash md5/string .:

private String md5(String md5Me) throws Exception { 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    md.reset(); 
    md.update(md5Me.getBytes("UTF-8")); 

    return Base64.encodeBase64String(md.digest()); 
} 

ho usato molto metodo simile per autenticare con successo un'API diversa usando l'algoritmo SHA1 la settimana scorsa. Mi chiedo se il problema è legato a org.apache.commons.net.util.Base64.encodeBase64String ... Qualsiasi aiuto è molto apprezzato, se solo alcuni test per vedere se il byteArray è corretto ma la stringa convertita è sbagliata .

+1

md.digest() dovrebbe contenere byte che stai cercando, li codifichi ulteriormente utilizzando l'algoritmo Base64 e ottieni risultati diversi – hoaz

+0

Ho bisogno di convertire quei byte in una stringa per una richiesta http, c'è un modo migliore per farlo ? – eric

+1

new String (byte [] bytes) – Andy

risposta

8

per esempio, secondo questo sito, la stringa "ciao" genera un hash di "5d41402abc4b2a76b9719d911017c592". (FWIW Non so nulla su questo sito web, tranne che sembra correttamente hash gli esempi che ho). Quando eseguo attraverso il mio codice ottengo:

XUFAKrxLKna5cZ2REBfFkg ==

Entrambi sono corretti modi di rappresentare lo stesso hash sedici byte. 5d41402abc4b2a76b9719d911017c592 rappresenta ogni byte dell'hash come due cifre esadecimali, mentre XUFAKrxLKna5cZ2REBfFkg== utilizza Base-64 per rappresentare ogni tre byte dell'hash come quattro caratteri.

Per generare l'esadecimale-versione che questa API di terze parti è in attesa, è possibile modificare questo:

Base64.encodeBase64String(md.digest()); 

a questo:

String.format("%032x", new BigInteger(1, md.digest())); 

(in gran parte prese da this StackOverflow answer).

Tuttavia, si potrebbe voler considerare l'utilizzo di una libreria esterna per questo. Perception, in un commento sopra, menziona Apache Commons DigestUtils. Se lo usi, vorrai the md5hex method.

+0

Contrassegnare questo come corretto poiché risolve il mio problema, spiega cosa diavolo sta succedendo e fa riferimento al suggerimento di Perception di utilizzare DigestUtils (che funziona anche). Grazie! – eric

+0

@eric: Prego! – ruakh

2

L'algoritmo di hash md5 fa parte dell'API java principale, quindi non è necessario alcuno strumento per librerie esterne. Ecco il metodo che ho usato per crittografare una password con MD5.

import java.security.MessageDigest; 

/** 
* Use to encrypt passwords using MD5 algorithm 
* @param password should be a plain text password. 
* @return a hex String that results from encrypting the given password. 
*/ 
public static String encryptPassword(String password) { 
    try { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     md.update(password.getBytes()); 

     byte byteData[] = md.digest(); 

     StringBuffer hexString = new StringBuffer(); 
     for (int i=0;i<byteData.length;i++) { 
      String hex=Integer.toHexString(0xff & byteData[i]); 
      if(hex.length()==1) hexString.append('0'); 
      hexString.append(hex); 
     } 
     return hexString.toString(); 
    } 
    catch(java.security.NoSuchAlgorithmException missing) { 
     return "Error."; 
    } 
} 
Problemi correlati