将Base64编码的md5转换为可读的String

时间:2012-10-10 15:32:14

标签: java string base64 md5

我将密码存储在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时,我看到不可读的字符。 那么,我该怎么做才能解决这个问题呢?

2 个答案:

答案 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();
}