【发布时间】:2023-02-21 19:03:42
【问题描述】:
我有两个 docker 容器,一个是 PHP 8.2.3,另一个是 PHP 7.4.30。
另外,我有包含现有密码哈希的数据库(最初由 Yii2 框架创建,使用密码 password_hash,在未知环境中)。
我制作了 test.php,输出了两件事:
var_dump(password_get_info('$2a$07$6c2eb62b00df224f3d20$.qzdiDRZejMnGytXWsA7Jid7RpWazDc6'))
和
var_dump(password_verify('password', '$2a$07$6c2eb62b00df224f3d20$.qzdiDRZejMnGytXWsA7Jid7RpWazDc6'))
在 PHP 7.4 中,结果是:
array(3) {
["algo"]=>
NULL
["algoName"]=>
string(7) "unknown"
["options"]=>
array(0) {
}
}
和
bool(true)
在 PHP 8.2 中:
array(3) {
["algo"]=>
NULL
["algoName"]=>
string(7) "unknown"
["options"]=>
array(0) {
}
}
和
bool(false)
我知道可能使用了不同的哈希算法。但是应该在散列本身中指定(并因此识别)散列算法。
另外,两个引擎都不知道算法。但是,PHP 7.4 能够验证密码。
为什么会这样?
从文档:
请注意,password_hash() 返回算法、成本和盐作为一部分 返回的哈希值。因此,需要的所有信息 验证哈希是否包含在其中。这允许验证功能 验证散列而无需单独存储盐或
【问题讨论】:
-
FWIW,似乎是该 PHP 版本(以及其他两个版本)中的一个错误:3v4l.org/aJlhb
-
多么...哦,非常感谢。这太不可思议了。怎么会?因为是小版本。超级奇怪
-
可能与此修复特别相关:bugs.php.net/bug.php?id=81744
-
虽然我真的找不到与此相关的实际代码更改,但这是这些受影响版本中唯一相关的更改:php.net/ChangeLog-8.php#8.2.3、php.net/archive/2023.php#2023-02-14-3
标签: php