gpt4 book ai didi

php - 如何持续保持与当年硬件相关的 bcrypt 轮数?

转载 作者:可可西里 更新时间:2023-10-31 23:02:40 25 4
gpt4 key购买 nike

我看到建议将轮数设置为 ($currentYear - 2000) 以解释摩尔定律,因此 2013 年将是 13 轮,因此2^13 总迭代次数。当然,您需要考虑您自己的硬件以确保它不会花费太长时间(我看到 1 秒 被推荐为检​​查密码/哈希值的“安全”,并且大约需要 13 轮在我当前的硬件上做标记)。

对于社交网络类型的网站来说,这听起来合理吗?或者我是否会在将来使用 ($currentYear - 2000) 设置自己的密码检查速度非常慢?

此外,您如何处理将轮数从一年更改为下一年?改变轮数不会改变哈希值,因此不允许您在 2014 年检查 2013 年的哈希值,因为检查会使用额外的一轮?您是否必须每年重新计算每个散列,或者它究竟如何工作?

最佳答案

首先,我质疑该建议(根据年份调整成本)。成本应该基于你的硬件有多快,而不是当前日期。如果从现在到 2015 年不升级服务器,就没有理由增加成本。您所做的只是让本来就很慢的过程变慢。

话虽如此,我也对大多数情况下 1 秒的建议提出质疑。如果您处理的是高度敏感的信息,1 秒(或更长)就可以了。但对于普通网站,我通常建议在 0.25 到 0.5 秒之间。在某些情况下,您可以降低价格,但如果没有充分的理由我不会这样做。

现在,回到问题本身。当您使用 crypt()password_hash() ,迭代计数以返回哈希格式存储。事实上,盐也是如此。所以计算散列所需的所有信息都包含在其中!

如果您没有使用这些 API(或我维护的 polyfill:password-compat),那么我真的很想知道您为什么不使用。不要发明自己的密码加密。不要使用使用 native 哈希的库(如 phpass),除非你有充分的理由(出于某些政府合规性原因,或与 PHP <= 5.2 的兼容性)。

普遍认为bcrypt是当今最强的哈希格式。 SCrypt 更强大,但也有一些问题,而且它仍然很新(并且在 PHP 核心中尚不可用)。所以只需使用 bcrypt...

password_hash() api 有一种机制可以让你做你想做的事:password_needs_rehash() .基本上,您传入哈希和您今天使用的选项,它会告诉您是否需要重新哈希:

if (password_verify($password, $hash)) {
if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 14])) {
$hash = password_hash($password);
update_password_in_database($hash);
}
$loggedin = true;
}

阅读RFC for password_hash()有关它的更多信息(我从大量来源收集数据,并在 RFC 中包含引用)。

编辑 - 跟进@AnotherParker 的评论:

Criminals don't stop upgrading their crackingboxes just because you didn't upgrade your server. You do need to increase the work parameter over time to thwart offline attacks.

有点真实。嗯,是的,但没有捕获我上面所说的重点。

散列函数的成本参数是时间-努力的权衡。您权衡了一些时间来为每个哈希添加额外的工作。在相同的硬件上,花费更多的时间会产生更多的工作。产生更多工作的另一种方法是获得更快的硬件。

但建议是在您当前的硬件上测试哈希函数,并使其尽可能昂贵。如果 0.5 秒是您今天可以承受的最大值,除非您升级服务器硬件,否则增加成本对您有何帮助?简而言之,它不会,因为您将打破您已经确定的最长时间限制很重要。

因此,除非您已经在生成弱哈希,否则您不能在不增加服务器功能的情况下增加工作参数。

另外,查看 this answer on the subject

关于php - 如何持续保持与当年硬件相关的 bcrypt 轮数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15662729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com