不同的MD5结果

时间:2014-07-14 08:20:05

标签: java php md5

我正在将用Java struts开发的应用程序移植到PHP,数据库在MySQL中,

PHP,MySQL或在线MD5为NtbPq产生了这个:

db94207ab2924504e0f590682645258a

应用程序使用相同的密码生成此内容的位置:

db94207ab292454e0f590682645258a
              ^

注意缺少的1个字符。现在Java应用程序运行完美并记录用户,但PHP无法验证并说它与PHP md5函数不匹配。

有没有任何解决方案我可以使用java char md5来验证PHP?

编辑:问题是我还没有开发java应用程序,现在有超过400个用户,我想在php中移植,我不知道关于java的事情,我只是想非常那些31个字符md5在PHP

3 个答案:

答案 0 :(得分:2)

我强烈怀疑如果一个字节的前导nybble为0,那么你在应用程序中使用的十六进制转换是失败的。这可能是因为你在应用程序本身中有十六进制转换代码,而不是使用标准库。

解决方案:找到十六进制转换代码,将其删除,然后使用标准库。例如,正如你的评论似乎是产生错误结果的Java代码(你的帖子不是很清楚),你可以使用Apache Commons Codec

然而,正如评论中所述,无论如何都应该尽量避免使用MD5。现在可能也可能不可行,但它应该在你的中期路线图上。

编辑:作为临时措施,您可以编写自己的PHP代码来模拟破坏。基本上,您需要执行正常的MD5散列,然后获取十六进制结果并从中移除任何出现在偶数位置的“0”。因此,例如“ab0120”最终会变为“ab120” - 因为第一个'0'位于第2位,但最后一个'0'位于第5位。或者,自己执行十六进制转换,一次转换一个字节并从每个双字符结果中修剪任何前导'0'字符。应尽快删除此代码,用于验证存储MD5哈希值较差的用户是否有效。

答案 1 :(得分:0)

我认为这可能对您有所帮助: Java md5, the PHP way

对我来说就像是同样的问题。

答案 2 :(得分:0)

我要做的是将md5哈希存储在您的数据库中,每当您检测到该特定用户的登录时,将其转换为PBKDF2(它更安全)。然后你可以删除旧的md5。

本指南介绍如何操作。

https://crackstation.net/hashing-security.htm#javasourcecode