我目前正在实现一个利用 PHP 的新(将作为 v5.5 的一部分发布)密码处理 API 的 webapp。我认为这真的很好,但我想知道是否有人知道为什么password_get_info()
不返回计算给定哈希时使用的盐值?RFC明确指出,有问题的函数不返回盐,但没有解释原因:
第二个元素是“选项”,它包括哈希算法使用的选项,除了使用的盐。
我问的原因是因为当用户的密码过期时,我需要检查他们是否没有重新提交与当前密码相同的密码。做到这一点的唯一方法是对新密码进行哈希处理,使用相同的算法、成本和盐,将生成的哈希值与数据库中当前的哈希值进行比较。算法和成本由password_get_info()
函数返回,而不是盐。目前,我substr($hash, 7, 22)
用来获取盐值,但这显然是特定于算法的,并且有点违背使用其他非常易于使用且功能强大的 API 的目的(如果我开始使用新算法,盐的位置可能很好改变)。
编辑:我是个白痴,我不需要重建哈希并比较生成的哈希,而是调用password_verify()
并检查它是否返回FALSE
。这将教会我在生病和疲倦时工作!