我刚才正在阅读PHP 5.5中的新特性,它包含了新的密码散列功能。现在,如果您查看描述,它的默认操作是随机生成一个密码salt(如果您没有指定密码salt)。
但我不明白这有什么用。因为如果为了安全存储而对密码进行哈希运算,那么salt是随机的。然后,当您运行用户为密码输入的字符串时,如果每次salt不同,则每次生成的散列将不同。因此,您将无法成功地将输入的有效密码与存储的密码哈希副本进行比较。
那么,这怎么可能有用呢?

最佳答案

盐包含在散列值中。

<?php

$hash = password_hash("password", PASSWORD_DEFAULT, ['salt' => 'saltsaltsaltsaltsaltsa']);
print_r(password_get_info($hash));
echo $hash;

输出:
Array
(
    [algo] => 1
    [algoName] => bcrypt
    [options] => Array
        (
            [cost] => 10
        )

)

$2y$10$saltsaltsaltsaltsaltsOPRDjePxJkNp7mjBEve63IqKPFT7ehNG

正如您所看到的,散列函数存储散列本身中散列过程的信息。然后password_verify()函数解析hash并基于此信息验证密码。

07-27 19:32