【问题标题】:Unable to decrypt MD5 hashed byte array无法解密 MD5 散列字节数组
【发布时间】:2012-12-09 08:12:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java hash bytearray md5 spring-ldap


    【解决方案1】:

    这里有两个问题:

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

    基本上你只需要将字节数组转换为十六进制字符串。有多种方法可以做到这一点 - 在您自己的代码中,或使用第三方库,例如 Apache Commons Code 及其 Hex 类。如果您不想包含额外的库,则在 Stack Overflow 上有 loads 代码 sn-ps 用于字节数组到十六进制字符串的转换,例如 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(或许多其他解决方案)。
    • 此时,您已经获得了散列的真实原始二进制数据。然后,您可以根据需要将其转换为十六进制,如前所述。

    【讨论】:

    • String hexString = new String(Hex.encodeHex(byteArrayPassword)); 这给了我 7b4d44357d784d70434f4b43354934494e7a464361623357456d773d3d 而不是 c4ca4238a0b923820dcc509a6f7584。
    • 现在它给出了这些输出,我仍然无法转换回原始密码的十六进制值hexString = hexString.substring(5); // xMpCOKC5I4INzFCab3WEmw== byte[] bytes = Base64.decodeBase64(hexString.getBytes()); hexString = Hex.encodeHex(bytes).toString(); // [C@4c065f0a
    • @talha06:您现在正在通过char[] 呼叫toString()。不要那样做。要么使用Hex.encodeHexString,要么调用String(char[]) 构造函数。
    • 好的,知道了!非常感谢 Jon Skeet,你真的帮了我很多耐心。
    【解决方案2】:

    你不能解密 MD5 哈希,这是一种单向哈希函数。

    【讨论】:

    • 不,我的意思是将散列字节数组转换为十六进制
    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2014-09-09
    • 2013-04-24
    相关资源
    最近更新 更多