升级使用无效 CRYPT_STD_DES 盐生成的 PHP (<5.3.2) 密码

长话短说,我有一些密码在 PHP 版本中被不正确地加盐和散列,如果加盐无效,允许 crypt() 函数回退到 CRYPT_STD_DES 算法。

然而在 PHP 5.3.2+ 中:

5.3.2 修正了 Blowfish 在无效回合上返回“失败”字符串(“*0”或“*1”)而不是回退到 DES 的行为。

造成这个问题的原因是盐中包含“$”字符,因为它本来是一种河豚盐(但在不知不觉中变形了)。

因此,我无法手动执行以下操作: crypt($pass, "$a"); 因为那现在也不是有效的 CRYPT_STD_DES 盐。盐必须在“./0-9A-Za-z”范围内。它只是按照 PHP 开发人员的预期返回“*0”。

如何在较新版本的 PHP(理想情况下至少为 7.1)中验证这些格式错误的密码?


动漫人物
浏览 82回答 3
3回答

qq_花开花谢_0

作为一种解决方法,我最终实际上将旧版本的 PHP 用于单个目录,我可以在其中调用file_get_contents()并使用旧的(错误的)算法检索哈希,但在其他地方仍然使用更现代的 PHP 版本。然而,这不是一个合适的解决方案,因为它在技术上没有回答这个问题:&nbsp;“我如何在更新版本的 PHP 中验证这些格式错误的密码?”因此,除非似乎没有其他可能的解决方案,否则我不会将此标记为已接受的答案(但我认为为了完整性起见应该添加此答案)。

沧海一幻觉

找到了一个实际的解决方案。通过强制加盐,事实证明 PHP 将无效的“$2”STD_DES 加盐解释为“q2”。因此,这个问题的答案是可以在较新版本的 PHP 中验证这些散列,方法是更改用于比较散列的盐,使其以“q2”而不是“$2”开头。从那里开始,可以substr_replace($str, '$', 0, 1);在执行相等性检查时调用将新添加的“q”字符替换回“$”字符。作为一个轶事,显然我得到的信息是不正确的,并且哈希值是在 PHP 5.3.29 中生成的,这与文档所说的退回到在版本 5.3.2 中修补的 STD_DES 相矛盾。

MM们

你可能正在寻找password_hash ( string $password , int $algo [, array $options ] ) : string
打开App,查看更多内容
随时随地看视频慕课网APP