我将密码存储在ldap中作为md5哈希:{MD5}3CydFlqyl/4AB5cY5ZmdEA==
从它的外观来看,它是base64编码的。
如何将从ldap接收的字节数组转换为可读的md5-hash-style字符串,如下所示:1bc29b36f623ba82aaf6724fd3b16718
?
{MD5}
是散列的一部分还是ldap添加它,它应该在解码前删除?
我试过使用commons base64 lib,但是当我这样称它时:
String b = Base64.decodeBase64(a).toString();
它返回 - [B@24bf1f20
。可能这是一个错误的编码,但当我将其转换为UTF-8时,我看到不可读的字符。
那么,我该怎么做才能解决这个问题呢?
答案 0 :(得分:2)
看来上面的答案是针对C#的,因为Java中的StringBuilder类没有这样的AppendFormat方法。
这是正确的解决方案:
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();
}
答案 1 :(得分: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();
}