2012-10-10 87 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(); 
} 
相关问题