我使用crypt()来哈希密码,像这样的河豚盐:
[a-zA-Z0-9] $ 2a $,2位数,$,21个字符
在这里我犯了一个错误,在第三个$ 21之后的字符长度不是22.但它工作正常所以我没有找到错误.
它适用于运行Windows和PHP 5.4.4的桌面以及使用php 5.3.x运行Amazon linux的AWS ec2,其中包含太短的盐.
有一天,我将AWS php更新为5.5.14.然后问题发生了.crypt()一直返回*0.
经过一番尝试,我在盐的末尾加了一个$,所以它变成22个字符.它再次工作并返回与以前相同的哈希字符串.虽然它不遵守河豚规则,但字符应为[./a-zA-Z0-9]
但是现在我将这个站点复制到另一台运行openSuSE 13.1和php 5.5.14的机器上,这个盐再次失败了.
我将php降级到5.4.20,但没有帮助.
新站点仍然需要旧数据库,所以我必须使密码哈希工作.
什么是影响此河豚盐长度错误兼容性问题的库或模块?Tt似乎不是PHP的版本.AWS 5.5.14
或者是否有另一个神奇的咒语可以再次救我?我尝试在[./a-zA-Z0-9]中为每个替换尾部$但是没有幸运,哈希字符串是不同的....
首先,我强烈建议使用新函数password_hash()和password_verify()来生成和验证新的哈希值。当然,这并不能解决旧哈希值的实际问题,但将它们标记为旧的可能是个好主意,这样它们就可以在用户下次登录时更新。
对于这个旧的哈希值,我会尝试验证它们,生成具有有效最后一个字符 22 的盐。 crypt 函数实际上仅使用字符 22 的部分位(盐的 126 位而不是 128 位)。因此最后一个字符 22 的组将以相同的哈希值结束。
请参阅此问题的答案Why does crypt/blowfish generated the same hash...
如果您尝试将所有相关字符 [.Oeu] 作为字符 22,则很有可能一种组合会生成与无效盐相同的结果。
编辑:
由于使用的盐成为密码哈希的一部分,因此您应该能够看到用作字符 22 的内容(第三个 $ 之后的第 22 个字符)。
| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |