无法解密MD5散列字节数组

时间:2012-12-09 08:12:01

标签: java hash bytearray md5 spring-ldap

我正在使用带有Spring LDAP的Apache DS进行身份验证和用户管理。 Apache DS将密码字段作为散列字节数组发送,因此我需要将其解密为String。我正在使用 MD5 哈希。

例如,这是用于使用Apache DS Studio输入密码的窗口:

(为了演示,我想告诉输入的密码 1

enter image description here

Apache DS将密码字段作为散列字节数组发送。当我尝试使用如下的Spring LDAP时,我得到了 [B @ 66ca6254 。我需要解密它并获得它的十六进制值,如上面所示 c4ca4238a0b923820dcc509a6f75849b

2 个答案:

答案 0 :(得分:3)

你有两个问题:

  • 您正在使用“解密”一词,就像您实际上能够恢复原始密码一样。事实并非如此。希望你已经理解这一点,而你只是不恰当地使用“解密”一词
  • 您在字节数组上调用toString()。这就是赋予值“[B @ 66ca6254”的价值,这表明您调用它的对象是字节数组,然后是散列。你真正感兴趣的是字节数组的十六进制表示。

基本上你只需要将字节数组转换为十六进制字符串。有多种方法可以做到这一点 - 在您自己的代码中,或使用第三方库,如Apache Commons Code及其Hex类。如果您不想包含额外的库,则在堆栈溢出上有字节数组到十六进制字符串转换的加载代码片段,例如here。 (还有javax.xml.bind.DataTypeConverter,但我个人不想将它用于一般转换 - 它对我来说太像是特定于XML的类型。我敢说它会工作正常,它只是给人一种错误的印象在代码中。)

编辑:既然你已经告诉我们你得到的字节,你只想使用十六进制。您已经获得了"{MD5}xMpCOKC5I4INzFCab3WEmw=="的ASCII编码形式,它本身显示它是MD5,然后是base64编码版本。因此,您应该:

  • 使用new String(data, "ASCII")
  • 将字节数组转换为字符串
  • 检查字符串是否以"{MD5}"
  • 开头
  • 将字符串的 rest 解码为base64(即删除前5个字符,然后通过base64解码运行其余字符)。同样,您可以使用Apache Commons Codec,或this public domain base64 decoder(或许多其他解决方案)。
  • 此时,您已获得散列的真实原始二进制数据。如果需要,您可以将其转换为十六进制,如前所述。

答案 1 :(得分:0)

你不能解密MD5哈希,它是单向哈希函数。