2012-10-10 140 views
0

我有一個密碼存儲在ldap中作爲md5哈希:{MD5}3CydFlqyl/4AB5cY5ZmdEA== 從外觀上看,它是base64編碼的。 如何將從ldap收到的字節數組轉換爲如下所示的良好可讀md5哈希樣式字符串:1bc29b36f623ba82aaf6724fd3b16718? 是{MD5}散列或ldap的一部分添加它,它應該在解碼之前被刪除?將Base64編碼的md5轉換爲可讀的字符串

我試圖使用公共的base64 lib中,但是當我這樣稱呼它:

String b = Base64.decodeBase64(a).toString(); 

它返回 - [[email protected]。可能它是一個錯誤的編碼,但是當我將它轉換爲UTF-8時,我看到了不可讀的字符。 那麼,我能做些什麼來解決這個問題?

+0

只是爲了澄清的東西在這裏爲您服務。字符串「[B @ 24bf1f20」是decodeBase64返回的字節數組的對象類型ID和內存地址。換句話說,字節數組開始於內存位置0x24bf1f20。只是要清楚:這個數字不是數據,它是一個內存地址。 –

回答

1

decodeBase64返回字節數組

爲了將其轉換爲十六進制數字的字符串:

public static string ByteArrayToString(byte[] ba) 
{ 
    StringBuilder hex = new StringBuilder(ba.Length * 2); 
    foreach (byte b in ba) 
    hex.AppendFormat("{0:x2}", b); 
    return hex.ToString(); 
} 
+0

我不需要十六進制數字,我需要像這樣的字符串 - 1bc29b36f623ba82aaf6724fd3b16718 - 要存儲爲md5哈希 –

+0

呃,scuse me,但「1bc29b36f623ba82aaf6724fd3b16718」是十六進制數字。你問如何散列字節數組,或者你問如何將字節數組轉換爲可讀的十六進制數字串(如1bc29 ...)? –

+0

好吧,對不起,我是個白癡,你說得對。也許我應該使用公共Hex.EncodeHex(byte [])呢?據我所知,它會做和你的代碼一樣的工作,但是沒有我添加額外的代碼。 –

2

看來上面的回答是爲C#,因爲存在用於StringBuilder類沒有這樣AppendFormat方法在Java中。

這裏是正確的解決方案:

public static String getMd5Hash(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException 
{ 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    byte[] thedigest = md.digest(str.getBytes("UTF-8")); 

    StringBuilder hexString = new StringBuilder(); 

    for (int i = 0; i < thedigest.length; i++) 
    { 
     String hex = Integer.toHexString(0xFF & thedigest[i]); 
     if (hex.length() == 1) 
      hexString.append('0'); 

     hexString.append(hex); 
    } 

    return hexString.toString().toUpperCase(); 
} 
相關問題