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创建的散列”时,它会被记录下来工作。