Rfc2898DeriveBytes迭代次数的目的和最佳实践

10
Rfc2898DeriveBytes类的IterationCount属性有什么作用?虽然MSDN没有给出太多解释,但它确实指出建议最小值为1,000。

如果我将其设置为1,000,为什么不是1,000,000或1,000,000,000?推荐使用1,000背后的原因是什么,是否有确定每个用例所需正确值的最佳实践?

1个回答

20

Rfc2898DeriveBytes实现了PBKDF2算法。该算法使用盐和密钥拉伸(即迭代多次)从密码中创建一个相对安全的密钥(密码长度正常情况下不是很安全)。为了使暴力破解密码更加困难,它使用迭代次数(这是线性成本的增加以创建密钥)。成本对于合法用户和攻击者来说是相同的,但攻击者必须遍历所有可能的密码。

没有标准化的数量;基本上,您将其设置为对于CPU性能而言可接受的值。1000是标准内推荐的值,但该标准已经存在了一些年头。现在,您应该以至少10K为起点,任何超过10K的值都会使攻击者更难找到生成相同“密钥”的密码。

+[编辑] 请查找当前推荐的迭代次数。请注意,摩尔定律仍然有效,并且PBKDF2本身不使用指数比例来计算迭代次数。确保其他密码处理程序也是安全的(例如密码强度反馈、最大重试次数等)。

显然,更重要的密钥应该得到更好的保护。请注意,生成一个真正安全的密码比增加迭代次数更有影响——当然,同时使用良好的密码和高迭代次数是最好的。


我知道这是一个广泛的主题(委婉地说),很可能超出了这个论坛的范围,但您能否简要阐述迭代过程中发生的事情?例如,“在每次迭代中,会发生‘X’,从而使得结果密钥更加强大。” - rory.ap
4
简化一下,HASH(x)会进行一次迭代,而HASH(HASH(HASH(x)))会进行三次迭代。PBKDF2并不是那么简单,但基本思想是这样的。 - ntoskrnl
@ntoskrnl -- 谢谢,这正是我在寻找的。而owlstead,感谢你的答案。 - rory.ap
@roryap 感谢您的接受,我已删除标准链接,因为我必须承认您需要一些知识才能知道标准中的函数F是HMAC,它依赖于哈希。总体思路保持不变:哈希值在自身和一些其他数据上进行迭代。 - Maarten Bodewes
HASH(HASH(HASH(x))) 是彩虹表的候选项。最好使用 Rfc2898。 - Maxim
是的,上面的解释忽略了盐。在每个密码哈希中使用Rfc2889与一个随机或至少是唯一的盐。您可能需要存储该盐,并且我建议还要存储迭代次数,以便在更改密码时可以进行更新。 - Maarten Bodewes

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