专用硬件,例如用于比特币挖掘的硬件,每秒可以执行超过 500 亿次哈希(截至 2013 年初。随着硬件变得更快,这是一个不断变化的目标)。
如果您对 PBKDF2 进行 1000 次迭代,那么这会将攻击从每秒 500 亿次减少到每秒 5000 万次。 10,000 次迭代将是每秒 500 万次。
然而,典型的 Web 服务器不会那么快。这对你来说会慢很多很多。您需要在自己的生产服务器上进行一些测试,可能会发现 10,000 次迭代太慢了。
因此,暴力破解 PBKDF2 的速度并不重要,重要的是您的服务器可以快速验证 PBKDF2 密码。您需要确定您认为需要多长时间(半秒?十分之一秒?百分之一秒?),然后调整 PBKDF2 轮数以适应该情况。
还要考虑客户使用的密码强度。如果他们都有很好的密码,那么你使用什么散列系统就无关紧要了。如果他们都使用糟糕的密码,那么 PBKDF2 不足以保护他们 - 你需要获得更多奇特的东西,比如苹果在 iPhone 中使用的硬件加盐哈希,试图将 4 位数字变成至少有一些数字的东西安全性(基本上,它们强制所有哈希由专用硬件芯片执行,这故意很慢。将数据移动到任何其他硬件并且无法解密)。
假设密码不在字典中(大多数密码都在字典中),那么密码强度的计算方法是将字母表中可能的字符数乘以每个字符一个 hibe。因此,如果密码包含字母(26 个字符的字母)和数字(另外 10 个字符),那么您有一个 36 个字符的字母,如果它是 6 个字符,则将其乘以自身 6 次。
因此,6 位字母数字密码是 36*36*36*36*36*36,或者如果您愿意:36^6。这为您提供了大约 21 亿个可能的密码......通常我们假设黑客会在大约一半的时候找到真正的密码,所以称之为 10 亿个。
如果您使用 PBKDF2 并且有 1,000 次迭代,那么拥有专用硬件的黑客将在大约 20 秒内猜出 10 亿个密码。这根本不是很好的安全性。
您可以通过使用更多轮的 PBKDF2(这会降低您的网站速度)或说服您的用户使用更好的密码来提高安全性。只需切换到 7 位而不是 6 位,或者添加大写字母甚至符号,它们就会显着提高其安全性。
Wolfram Alpha 对计算很有用:((36 ^ 6) / 50 million) seconds 其中 36 是字母的大小,6 是密码的长度,5000 万是黑客每秒可以使用的猜测次数(5000 万是攻击 PBKDF2 1000 发的严重攻击者)。
您的数据库中有多少个密码?如果破解个人密码需要 20 秒,那是我 30 天的数学还是 30 年?这取决于您有多少客户。