1

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

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

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

在此处输入图像描述

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

4

2 回答 2

3

你这里有两个问题:

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

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

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

  • 使用将字节数组转换为字符串new String(data, "ASCII")
  • 检查字符串是否以"{MD5}"
  • 将字符串的其余部分解码为base64(即去掉前5 个字符,然后通过base64 解码运行其余部分)。同样,您可以为此使用 Apache Commons Codec,或此公共域 base64 解码器(或许多其他解决方案)。
  • 此时,您已经获得了哈希的真正原始二进制数据。然后,您可以根据需要将其转换为十六进制,如前所述。
于 2012-12-09T08:21:11.760 回答
0

您无法解密 MD5 哈希,它是一种方式的哈希函数。

于 2012-12-09T08:19:51.167 回答