PHP 5.5 的新password_hash函数中随机生成的密码盐如何有用?


How is the randomly generated password salt in PHP 5.5's new password_hash function even useful?

我刚刚阅读了PHP 5.5中的新功能,它包括新的密码散列功能(http://www.php.net/manual/en/function.password-hash.php(。现在,如果您查看描述,它的默认操作是如果您不指定密码盐,则随机生成密码盐。

但我看不出这有什么用。因为如果您正在散列密码以进行安全存储,并且盐是随机的。然后,当您运行用户输入的密码字符串时,如果每次的盐都不同,则每次生成的哈希值都会不同。因此,您将无法成功比较输入的有效密码与存储的密码哈希副本。

那么这怎么可能有用呢?

盐包含在哈希值中。

<?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并根据此信息验证密码。