0

我有一个密码作为 md5 哈希存储在 ldap 中:{MD5}3CydFlqyl/4AB5cY5ZmdEA== 从外观上看,它是 base64 编码的。如何将从 ldap 接收的字节数组转换为可读的 md5 哈希样式字符串,如下所示:1bc29b36f623ba82aaf6724fd3b16718?哈希或 ldap 的一部分是否{MD5}添加了它并且应该在解码之前将其删除?

我尝试使用 commons base64 lib,但是当我这样称呼它时:

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

它返回这个 - [B@24bf1f20。可能这是一个错误的编码,但是当我将它转换为 UTF-8 时,我看到了不可读的字符。那么,我能做些什么来解决这个问题?

4

2 回答 2

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();
}
于 2013-01-24T20:22:12.553 回答
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();
}
于 2012-10-10T15:37:28.720 回答