繁体   English   中英

无法解密MD5散列字节数组

[英]Unable to decrypt MD5 hashed byte array

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

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

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

在此输入图像描述

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

你有两个问题:

  • 您正在使用术语“解密”,就好像您实际上能够恢复原始密码一样。 事实并非如此。 希望你已经理解这一点,而你只是不恰当地使用“解密”一词
  • 你在字节数组上调用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解码器 (或许多其他解决方案)。
  • 那时,你已经获得了哈希的真正原始二进制数据。 如果需要,您可以将其转换为十六进制,如前所述。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM