Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么密码验证对使用crypt和随机salt生成的旧密码有效?_Php_Php Password Hash - Fatal编程技术网

Php 为什么密码验证对使用crypt和随机salt生成的旧密码有效?

Php 为什么密码验证对使用crypt和随机salt生成的旧密码有效?,php,php-password-hash,Php,Php Password Hash,我知道password\u hash返回salt和hash算法作为结果的一部分,因此我了解了password\u verify工作的原因,并将与password\u hash生成的哈希向后兼容 但是,我有一个PHP5.4环境中的旧哈希数据库,它使用crypt和随机生成的salt。令我惊讶的是,password\u verify也会返回这些参数的预期值true和false。我看到crypt还将有关salt和算法的信息预先添加到结果字符串中,但是password\u get\u info似乎没有解析

我知道
password\u hash
返回salt和hash算法作为结果的一部分,因此我了解了
password\u verify
工作的原因,并将与
password\u hash
生成的哈希向后兼容

但是,我有一个PHP5.4环境中的旧哈希数据库,它使用crypt和随机生成的salt。令我惊讶的是,
password\u verify
也会返回这些参数的预期值true和false。我看到crypt还将有关salt和算法的信息预先添加到结果字符串中,但是
password\u get\u info
似乎没有解析它

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\u password
文档状态中的一个用户注释

此函数可用于验证使用其他函数(如crypt())创建的哈希

但没有说明原因

我想知道在后台发生了什么,以及
password\u verify
是否保证对加密生成的密码有效,或者我是否仍然应该检查它们。

哈希“实际上包含哈希机制和字符串开头的salt

在您的示例中,
$6$
代表SHA-512,您可以尝试使用
man crypt
获取更多的ID


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

password\u hash()是一个简单的crypt()包装,与现有密码散列兼容。更重要的是,如果它以2个字母开头,则意味着它是旧的
crypt()
算法。看起来就是这样的情况,但我想知道为什么password\u get\u info不返回algoName=>“sha-512”@Simone,因为password\u get\u info的输入是“password\u hash创建的散列”时,它会被记录下来工作。