password_hash的salt存储在哪里


Where is the salt stored for password_hash?

根据(相对)新的PHP文档:

password_hash函数使用随机salt(我们不应该担心..O_O),所以如果我正确理解,salt必须存储在某个地方,否则用户在注册到网站后将无法登录(不同的salt=>不同的hash。)

函数文档中没有任何关于与数据库交互的内容,而且由于我认为存储每个用户的数据只有在数据库中才是可扩展的,所以该函数到底在哪里存储随机盐?类似会话数据的txt文件?

让我们从其他人告诉你的事情中举例学习:

$options = [
    'cost' => 11,
    'salt' => 'abcdefghijklmnopqrstuv',
];
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT, $options)."'n";

输出:

$2y$11$abcdefghijklmnopqrstuu7aZVUzfW85EB4mHER81Oudv/rR.mWm

粗体部分是您的成本和盐,分别嵌入到生成的哈希中。

你可以把它吐回password_verify,它会相应地处理它:

print_r(password_verify('rasmuslerdorf', '$2y$11$abcdefghijklmnopqrstuu7aZVUzfW85EB4mHER81Oudv/rT.rmWm')); // true

password_hash手动状态为

所使用的算法、成本和salt将作为哈希的一部分返回。因此,验证哈希所需的所有信息包含在其中。这允许password_verify()函数验证散列,而不需要单独存储salt或算法信息

因此,salt已经包含在您保存在数据库中的散列中。