Passwords 在密码散列中包含迭代计数安全吗

Passwords 在密码散列中包含迭代计数安全吗,passwords,cryptography,password-encryption,Passwords,Cryptography,Password Encryption,一位同事在进行了大量的研究(包括听取客户的建议)后,实现了我们的密码哈希代码 生成的密码散列包括salt(应该是OK的,并且是验证密码所必需的),还包括迭代计数,这对于密钥拉伸来说是很高的 迭代计数保存在数据库中很好,因为较低的计数可以在单元测试中使用,如果我们更改计数,那么现有保存的密码哈希仍然可以验证。但我想知道是否可以安全地包含这个数字,因为如果知道迭代次数,暴力攻击不是更容易吗?在我看来,这将防止对增量测试的每个迭代计数进行大量额外检查。将迭代计数包括在结果哈希中是可以的 最重要的是,当

一位同事在进行了大量的研究(包括听取客户的建议)后,实现了我们的密码哈希代码

生成的密码散列包括salt(应该是OK的,并且是验证密码所必需的),还包括迭代计数,这对于密钥拉伸来说是很高的


迭代计数保存在数据库中很好,因为较低的计数可以在单元测试中使用,如果我们更改计数,那么现有保存的密码哈希仍然可以验证。但我想知道是否可以安全地包含这个数字,因为如果知道迭代次数,暴力攻击不是更容易吗?在我看来,这将防止对增量测试的每个迭代计数进行大量额外检查。

将迭代计数包括在结果哈希中是可以的

最重要的是,当未来的硬件变得更快时,这允许您增加迭代次数。必须能够适应更快的硬件,而不丢失旧的哈希值

隐藏这个数字不会有多大帮助。如果不知道,攻击者会假定一个合理的数字,可能稍高一点。他不仅可以将最后一次迭代与散列值进行比较,还可以将两者之间的每一步进行比较。对于具有对数成本参数的BCrypt,这将是大约3-5个比较操作(太小的数字是不合理的),这不是什么大问题

像PHP这样的知名API也将包含cost参数

编辑:
隐藏迭代次数会给哈希过程增加一种秘密,攻击者必须猜测这个数字。虽然添加服务器端机密的可能性要大得多,但我在我的教程中尝试对此进行了解释(请看一看关于pepper和加密哈希值的部分)。

如果迭代计数不是太小,对攻击者也没有帮助。如果不想直接存储迭代计数,您可以只保存一个指示哈希方案和设置的数字,并使用它来确定PBKDF、salt大小和迭代计数。但一般来说,迭代计数可能是公共知识。我不明白:如果迭代计数为1000,那么打破散列不是需要1000次尝试吗?我看不出你怎么能在3-5分钟内做到这一点。@orbfish-这取决于你用PBKDF2算法定义了真正的迭代次数。在每1000次迭代之后,您都可以比较结果,因此您只计算一次哈希值,但要比较1000次。当然,在仅仅10次迭代之后进行比较是没有意义的(没有人会只进行10次迭代),您只比较1000次迭代中合理的一部分。使用BCrypt时,您不定义实际的迭代次数,而是传递一个成本系数
iterations=2^costfactor
,因此只有16、32、64、128。。。迭代是可能的,只有2^9、2^10、2^11、2^12才有意义进行比较。谢谢,现在就有意义了。