关于php:为什么password_verify适用于使用crypt和随机盐生成的旧密码?

Why does password_verify work on old passwords generated with crypt and a random salt?

我知道password_hash返回salt和hashing算法作为结果的一部分,因此我得到了password_verify工作的原因,并且将与password_hash生成的哈希向后兼容。

但是,我有一个来自PHP5.4环境的旧哈希数据库,它使用了crypt和随机生成的salt。令我惊讶的是,password_verify也为这些返回了正确和错误的预期值。我看到crypt也将有关salt和算法的信息预先添加到结果字符串中,但是password_get_info似乎没有解析它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
php > echo crypt('test1','salt');
saTBKtwSCLJ0A
php > echo crypt('test1','sa_anything');
saTBKtwSCLJ0A
php > echo crypt('test1','newsalt');
ne0fA1VwB4hx2
php > echo crypt('test3','$6$salt');
$6$salt$NGtBMjsb3SEYv95mjN8yKuZMkYSjFJQDt8yu8JMnXJLv/NWugOVDTnqPeBqp94mf6T20sHoY.wSNWwtTSPvqM0
php > var_dump(password_get_info('$6$salt$NGtBMjsb3SEYv95mjN8yKuZMkYSjFJQDt8yu8JMnXJLv/NWugOVDTnqPeBqp94mf6T20sHoY.wSNWwtTSPvqM0'));
array(3) {
  ["algo"]=>
  int(0)
  ["algoName"]=>
  string(7)"unknown"
  ["options"]=>
  array(0) {
  }
}

verify_password文档状态中的用户注释之一

This function can be used to verify hashes created with other functions like crypt().

但不说为什么。

我想知道在后台发生了什么,以及password_verify是否可以保证在密码生成的密码上工作,或者我是否应该继续检查这些密码。


"hash"实际上包含了散列机制和字符串开头的salt。

在您的示例中,$6$代表sha-512,您可以尝试man crypt获得更多的ID。

函数很容易得到正确的算法,并根据其散列值检查实际的密码。