我使用crypt()来散列密码,并带有河豚盐,如下所示:



在这里,我犯了一个错误,即第三个$之后的字符长度是21而不是22。但是它工作正常,所以我没有找到错误。

它可以在运行Windows和php 5.4.4的我的桌面上运行,也可以在运行Amazon linux和php 5.3.x的AWS ec2上运行,但时间太短了。

有一天,我将AWS php更新到5.5.14。那么问题就出现了。 crypt()始终返回* 0。

经过一番尝试后,我在盐的末尾添加了一个$,使其变为22个字符。并且它再次起作用,并返回与以前相同的哈希字符串。尽管不遵守河豚规则,但字符应为[./a-zA-Z0-9]

但是现在我将此站点复制到另一台运行带有PHP 5.5.14的openSuSE 13.1的计算机,此盐再次失败了。

我将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 generate the same hash...

如果您尝试使用所有相关的字符[.Oeu]作为字符22,则很有可能一种组合会产生与无效盐相同的结果。

编辑:

由于用过的盐变成了密码哈希的一部分,因此您应该能够看到什么被用作字符22(第三个$之后的第22个字符)。

关于php crypt()河豚盐长度向后兼容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24799946/

10-16 13:31