password_hash中的盐值存储在哪里?

8
根据相对较新的PHP文档: password_hash函数使用随机盐(我们不需要担心.. O_O),因此如果我理解正确,盐必须存储在某个地方,否则用户注册网站后将无法登录(不同的盐=>不同的哈希)。 该函数文档没有提及与数据库的交互,而且我认为仅通过数据库才能扩展存储每个用户的数据,那么这个函数到底在哪里存储随机盐?像会话数据一样的txt文件吗?

8
使用默认设置时,盐值被存储在哈希中。你有好好阅读“绝妙”的手册吗?我是说,彻底地阅读了吗? - Funk Forty Niner
3
“函数文档没有提及与数据库的交互” - 为什么要提及呢?那是你的工作。继续努力!我是说,去谷歌一下吧!;-) - Funk Forty Niner
哦,明白了...O_O 谢谢。 - CoffeDeveloper
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
11

让我们通过别人告诉你的例子来学习:

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

输出:

$2y$11$abcdefghijklmnopqrstuu7aZVUzfW85EB4mHER81Oudv/rT.rmWm

加粗的部分是计算成本和盐,它们嵌入在生成的哈希中。

您可以将其传回password_verify,它会相应地处理它:

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

1
成本越高,CPU 的压力就越大;-) 把它调到 50 看看需要多长时间来哈希这个东西,哈哈。 - Funk Forty Niner
@Fred-ii- 哈哈,我刚从文档的一个示例中提取了它,然后修改了生成的哈希值为已知值。 - sjagr
我记得使用了20作为成本数值,处理起来要大约20-30秒,哈哈。每增加一个大于或等于20的成本需要一秒钟处理?听起来差不多对啦;-) - Funk Forty Niner
阅读文档并使用粗体的方式对我有很大帮助!良好的基础解释。 - Cayce K

5
password_hash函数手册中写明:

使用的算法、成本和盐值都将作为哈希的一部分返回。 因此,验证哈希所需的所有信息都已包含在其中。这使得password_verify()函数可以验证哈希而无需单独存储盐值或算法信息。

因此,在您保存在数据库中的哈希值中已经包含了盐值。

3
是的,这个话题已经被多种方式提及过了;-) 如果我早知道的话,我会把我的“评论”改成“回答”,然后大赚一笔!喜提嘻哈舞动的表情 - Funk Forty Niner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,