由于破解哈希的最佳资源池是比特币网络,目前的速度为 2.14 ExaHashes/s。
我想问一下,如果这个网络的资源被指向破解河豚,以及(通过扩展)bcrypt,那么在使用 bcrypt 保护密码时要保持的最低成本因素是多少?
由于破解哈希的最佳资源池是比特币网络,目前的速度为 2.14 ExaHashes/s。
我想问一下,如果这个网络的资源被指向破解河豚,以及(通过扩展)bcrypt,那么在使用 bcrypt 保护密码时要保持的最低成本因素是多少?
简短的回答:如果您比较 x86 上的速度,PHP 的最大成本为 31(2^31 次迭代)对于强密码(随机 8 字符)来说足够安全。并不是说它可以使用,在桌面上生成一个哈希大约需要 200 个小时。
长答案:(由于缺乏准确的哈希性能数据,没有关于密码强度和惰性近似的细节,误差很大。)
在 6 个字母的密码和长度为 10 的数字和特殊字符的密码之间,原始暴力破解的成本可能会相差数十亿倍。(小写字母为 26^6 = 3.0E+8,mixalpha-num-all 为 94^10 = 5.3e+19)散列速度可能因实现而异。
因此,如果用户从 1000 个最常用的密码中选择一个,它与 3 位数的密码一样好,这使得问题实际上无关紧要。
为此,答案是“尽你所能,我们不能把每个人都从自己身上拯救出来”
但是,让我们做一个简单的计算来得到一个想法。假设数据库设置了“与 8 个随机字符一样好”的最低要求
具有所有小写和大写 ASCII 字符的字符集,所有数字和特殊字符将出现 6161234432565770 组合
现在让我们了解一下哈希的性能。我能找到的唯一并排比较是这样的: https ://pthree.org/2014/12/26/sha512crypt-versus-bcrypt/
它指出默认工作因子 10 大约等于 80.000 轮 SHA512crypt 。 现在SHA 512 只花费 256 时间的 120%
所以这使得成本(10)的 bcrypt 大约等于 100.000 轮 SHA256。
两位数的成本参数是底层基于 Blowfish 的哈希算法的迭代计数的以 2 为底的对数,必须在 04-31 范围内,超出此范围的值将导致 crypt() 失败
成本(10) = 2^10 = 1024 次迭代。所以比特币的算法 SHA256 每次迭代快大约 100 倍。假设比特币网络可以执行 2.14E+18 SHA256/秒,这将归结为 BCrypt/秒的 2.14E+16 次迭代。charset mixalpha-numeric-all中length-8随机密码的keyspace约为6.16E+16
这是一种相当不可行的蛮力,目前可以认为是安全的。
如果密码强度适中,BCrypt 中的最大“成本”足以应对整个当前的比特币网络。
但是,BCrypt 与 SHA512 的比较提到 cost(20) 在工作站上已经花费了 > 3 分钟,因此目前如此大的成本是不切实际的。外推 2^12*3.12/60 =~ 213 小时
也许你问错了问题:
您不想问我使用什么工作因素(迭代次数)?(使用 KDF/自适应散列),您想问一个散列需要多长时间?并从中计算功因数。
后者的答案是“只要你能容忍”。更多专家在这里https://security.stackexchange.com/a/3993/69959
因此,要回答您的问题,您需要知道所述网络计算哈希所需的时间。或者更有用的是给定功因数的 H/s。Bcrypt 基准通常被引用为5的bcrypt(5)
工作因子。如果您可以获得所述网络的 bcrypt(5) 的 H/s,那么您就有了与其他破解基准进行比较的基础。
我为本地设备找到的最好的是这个8x GTX Titan X cudaHashcat Benchmark,它将以133 KH/s的速度破解 bcrypt(5) (在撰写本文时)。这是与分布式破解网络进行比较的良好基础。
请注意,分布式哈希破解并不是什么新鲜事,我们应该假设这种能力将比任何公开可用的破解能力高出许多数量级。
您在问使用什么工作因素来保证密码安全?
这是我的个人规则:
在本地开发机器和将部署您的应用程序的 Web 服务器节点上对您的 bcrypt 进行基准测试。然后选择你愿意让你的用户经历的最长的(就用户体验而言)时间。对我来说,这大约是 1000 毫秒(记住:注册和登录屏幕;不经常发生)。然后找到恰好在那个时间段内的工作因素,并选择本地开发和产品中最慢的。