为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
动漫人物 2023-03-11 16:30:19
长话短说,我有一些密码在 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)中验证这些格式错误的密码?
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

作为一种解决方法,我最终实际上将旧版本的 PHP 用于单个目录,我可以在其中调用file_get_contents()并使用旧的(错误的)算法检索哈希,但在其他地方仍然使用更现代的 PHP 版本。

然而,这不是一个合适的解决方案,因为它在技术上没有回答这个问题: “我如何在更新版本的 PHP 中验证这些格式错误的密码?”

因此,除非似乎没有其他可能的解决方案,否则我不会将此标记为已接受的答案(但我认为为了完整性起见应该添加此答案)。


查看完整回答
反对 回复 2023-03-11
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

找到了一个实际的解决方案。通过强制加盐,事实证明 PHP 将无效的“$2”STD_DES 加盐解释为“q2”。

因此,这个问题的答案是可以在较新版本的 PHP 中验证这些散列,方法是更改用于比较散列的盐,使其以“q2”而不是“$2”开头。从那里开始,可以substr_replace($str, '$', 0, 1);在执行相等性检查时调用将新添加的“q”字符替换回“$”字符。

作为一个轶事,显然我得到的信息是不正确的,并且哈希值是在 PHP 5.3.29 中生成的,这与文档所说的退回到在版本 5.3.2 中修补的 STD_DES 相矛盾。


查看完整回答
反对 回复 2023-03-11
?
MM们

TA贡献1886条经验 获得超2个赞

你可能正在寻找

password_hash ( string $password , int $algo [, array $options ] ) : string



查看完整回答
反对 回复 2023-03-11
  • 3 回答
  • 0 关注
  • 65 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信