如何持续保持有关本年度的硬件bcrypt轮数?(How to continuously keep t

2019-07-28 13:10发布

我看到,轮数设置为推荐($currentYear - 2000) ,以考虑摩尔定律,使2013将是13轮,因此2^13的总迭代。 当然,你需要考虑到自己的硬件,以确保它不会花太长时间(我看到1 second推荐为“安全”检查密码/散列和13发落在周围的标志在我当前的硬件)。

这是否对社交类型的网站听起来合理吗? 或者,我会用在未来制定自己了非常缓慢的密码检查($currentYear - 2000)

此外,你如何应对不断变化的轮数从一年到下一个? 不会改变的回合数改变哈希,因此不能让你从2013年到2014年检查的哈希值,因为检查将使用一个额外的圆? 你必须每年重新计算每一个哈希值,不然怎么会准确地工作?

Answer 1:

首先,我怀疑这一建议(调整基于一年费用)。 该费用应根据您的硬件有多快,而不是当前的日期。 如果不从现在至2015年间升级服务器,没有理由要增加成本。 你要做的就是慢已经缓慢的过程。

随着中说,我还质疑1秒,大多数情况的使用建议。 如果你正在处理高度敏感的信息,1秒(或更长的可能)是确定的。 但对于一般的网站,我通常为0.25〜0.5秒之间建议。 在某些情况下,你可以去下,但我不会没有强有力的理由。

现在,这个问题本身。 当您使用crypt()password_hash()迭代次数被存储在返回哈希格式。 事实上,盐为好。 因此,要计算哈希所需的所有信息包含在它!

如果你不使用任何的API的(或者说,我保持填充工具:的密码COMPAT ),那么我真的想知道为什么你不是。 不要发明自己的密码加密。 不要使用使用本地哈希(如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;
}

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

编辑 - 跟进到@ AnotherParker的评论:

罪犯不停止升级他们的crackingboxes只是因为你没有升级服务器。 你需要增加工作参数随着时间的推移,挫败脱机攻击。

排序也是如此。 那么,真实的,但错过什么,我说的是上面的点。

散列函数的成本参数是一个时间的努力权衡。 你权衡一些时间来添加额外的努力,每个哈希。 在同样的硬件,花费更多的时间将产生更多的工作。 另一种方式来获得更多的工作是获得更快的硬件。

但该建议是测试您当前的硬件散列函数,并使其作为昂贵的,你可以合理地做到这一点。 如果0.5秒是,你能负担得起的今天,除非你升级你的服务器硬件最大的,是如何增加的成本会帮助你? 总之,它不会因为你会打破你已经确定的最大时间限制是很重要的。

所以,你可以在不增加工作参数,而也增加了服务器的功能,除非你已经产生了微弱的哈希值。

此外,检查出这个答案的主题



Answer 2:

当您使用bcrypt,回合数是生成散列的一部分:

crypt ( 'Password', '$2a$04$thisshallbemysalt' );

会导致类似

$2a$04$thisshallbemysalt.rAnd0ml0ok1ngch4rsh3re

2a第一$符号后面代表的是bcrypt度算法,以及未来04代表的回合数-所以通过看散列你可以看到有多少轮在那里完成创建它。

所以,当你决定现在是时候了轮数,你可以检查在生成存储的哈希使用的回合数时,在用户登录 - 如果它不是你目前的数个回合,你再散列密码那里,那么,并将其保存为新的哈希(检查自己的密码是否匹配现有的哈希,当然 ;-))



Answer 3:

的想法, 关键拉伸是让暴力破解unfeasable因为计算散列数百或数千次花费,每一轮,额外的时间是相同的攻击者的系统上。

如果花费1秒或0.9秒即2.5秒,是不是真的很重要。 我们的想法是,它是unfeasable穷举每秒百万密码哈希。 这是计数,不发的实际数量的因素。

如果您使用,例如,SHA256散列的系统可以做X(说1,000,000)每秒的哈希值。 通过键拉伸(和因而散列,例如,500倍)你把这个系统下降到每秒百万/ 500 = 2000尝试针对每个密码。 你有效地的500的一个因素。如果你使用750圆你......究竟减慢攻击! 按750的系数放慢攻击者,但增加轮的数量会影响您的系统/网站/应用,以及使你不想去过高 “只是要确定”; 用户会抱怨慢登录!

这源于以下事实,例如,SHA1 / 256/512,MD4 / 5等的优化速度 。 和你想要的是一个速度优化算法,你可以慢下来的攻击。 所以每隔几年,你只需通过登录时间为您的用户仍然保持可接受的一些因素增加回合数,但它会攻击足以令它不值得尝试暴力破解哈希减慢(或至少迫使他们把重点放在少了很多帐户,而不是所有账户为例)。

当您轮的数量,您老调重弹的CBroe解释 。

我不知道是谁用2($ currentYear - 2000年)提出了建议(!我喜欢看到源没关系, 发现 ),但如果你问我这是总公牛。 我建议你阅读的答案更加紧密,并检查了这个问题/答案 。

如果您bcrypt需要0.2到0.5秒(这是一个可以接受的“延迟”如果你问我在登录时),这将意味着攻击者可以蛮力按所给的相同的硬件第二种及如果他/ 5〜2散列她大量投资5000/2000或500万/ 200万可能。 这仍然不是feasable穷举整个为160bit(SHA1),256位(SHA256)或在可接受的时间(或者甚至寿命)甚至448bit(bcrypt)空间。



文章来源: How to continuously keep the number of bcrypt rounds relevant to the current year's hardware?