【问题标题】:Different MD5 results不同的 MD5 结果
【发布时间】:2014-07-14 08:20:05
【问题描述】:

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

PHP、MySQL 或在线 MD5 为 NtbPq 生成这个:

db94207ab2924504e0f590682645258a

应用程序为相同的密码生成了这个:

db94207ab292454e0f590682645258a
              ^

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

有什么解决方案我可以通过 java 使用 31 char md5 在 PHP 中进行验证?

编辑:问题是我还没有开发java应用程序,现在有400多个用户,我想移植到php中,我对java一无所知,我只想验证那些31个字符的md5在 php 中

【问题讨论】:

  • 一个 MD5 哈希应该有 32 位数字 (en.wikipedia.org/wiki/MD5),所以它会在你的代码中被截断。你能粘贴生成它的特定 PHP 函数吗?
  • 尝试使用不同的密码散列算法,因为 MD5 不安全。
  • 它的意思是 32 位数字,如果没有代码,很难判断是什么导致了截断。试试this question
  • @Justinas 如果他想移植用户,他不能改变算法并不是问题
  • java struts 应用程序正在生成 31 字符 md5,我没有 java 经验,我的应用程序与 32 字符 md5 完美配合,但我想移植 java md5 之前创建的 mysql 数据库和使用php登录用户

标签: java php md5


【解决方案1】:

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

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

然而,正如 cmets 中所指出的,无论如何都尽量避免使用 MD5 是值得的。这目前可能可行,也可能不可行,但它应该在您的中期路线图上。

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

【讨论】:

  • 问题是我没有开发java应用程序,现在有400多个用户,我想移植到php中,我对java一无所知
  • @Neox:从根本上说,Java 代码被破坏了。你是说你有很多存储损坏的MD5和吗? (实在不清楚你是什么情况。)
  • 我有 400 多个用户存储在 mysql db 中,其中 31 个字符的 md5 由 java 应用程序生成,需要移植到 php 应用程序中,这是主要问题
  • @Neox:我建议您让这些用户再次登录,以便您可以存储 valid MD5 总和(或者更好的是,升级到不同的加密哈希) .移植破碎对我来说似乎是一个非常糟糕的主意。
  • 我同意,我打算让用户在登录 php 应用程序后更改密码并使其成为 bcrypt,为了修复损坏的哈希,我必须在 java 中创建新模块,我不知道的,这就是为什么我要检查我是否可以在 php 中使用损坏的哈希来至少验证用户
【解决方案2】:

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

在我看来,同样的问题。

【讨论】:

  • 您应该将其标记为重复,而不是使用指向问题的链接来回答。
  • 我不太擅长在这里给出答案。而且我找不到任何标记为重复的选项 - 很抱歉。
  • @MightyPork:老实说,我认为这根本不是复制品。
  • 我不想修复 java 应用程序,我只想使用这个 java 应用程序为超过 400 个用户生成的 md5 在我的 php 应用程序中使用
【解决方案3】:

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

本指南向您展示如何操作。

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

【讨论】:

  • 但是在他能做到之前,用户必须先登录,用户无法登录的问题
  • 我同意这并不能解决他目前的问题。只是对未来的建议
  • 是的,这就是问题所在,我无法使用 31 个字符的 md5 验证登录
  • 您必须查看产生哈希码的部分并尝试在 php.ini 中执行相同的操作。将来按照@Arno_Geismar 的建议去做。
  • 是的,我计划将来集成 bcrypt,但现在我需要用户至少验证登录,我会检查 java 代码并将其发布在这里,因为我不懂我需要的 java这里有一些帮助。
猜你喜欢
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2023-04-05
相关资源
最近更新 更多