黑客如何知道密码被哈希了多少次?

信息安全 密码 密码学 哈希
2021-08-25 22:35:04

我在这个网站和其他网站上阅读了很多关于安全和哈希函数的问题。我不是专家,只是一个好奇的头脑,据我了解,用于散列密码的迭代越多越好,你应该得到一个输出等于一个输入(与损坏的函数的模冲突)。在这方面,如果迭代次数不同,输出将不一样。

但我不明白的是,一个试图找到平原的黑客如何知道使用了多少次迭代。因为他必须知道还是我错过了什么?

4个回答

轮数通常与密码和哈希一起存储。例如,使用 bcrypt:

$2a$10$oEuthjiY8HJp/NaBCJg.bu76Nt4eY4jG/S3sChJhZjqsCvhRXGztm

10 表示工作因子,在哈希时间方面有效地增加了 10 位熵来蛮力。2^10 = 1024 rounds.

它与哈希一起存储,以防摩尔定律需要提高工作因子。

如果您的系统具有对所有帐户都相同的秘密工作因素,则可以将其用作额外的安全措施,就像辣椒一样。事实上,如果攻击者能够设置自己的密码并查看哈希值,您需要将其与胡椒粉结合使用,否则他们将能够通过查看生成的哈希值来确定正在运行的迭代次数。但是,与使用每个单独的密码一起存储时相比,在未来进行此操作会更加复杂,因为您需要存储一个指示符,表明每个密码使用了哪个迭代配置版本。但是,您可以将秘密工作因素添加到与散列一起存储的值中。

Veracrypt 最近添加了一个 PIM(个人迭代乘数)功能,可以用作额外的秘密来保护您的加密数据。

黑客如何知道密码被哈希了多少次?和你一样。

散列密码的目的是使密码无法确定(实际上非​​常困难),即使可以完全访问所有数据

散列的另一个要求是服务器必须能够确定输入的密码是否正确。这意味着在登录过程中的某个时刻,服务器必须有权访问完整的密码散列公式。

改变散列数量的目的主要是为了减缓暴力攻击并增加彩虹表的搜索空间,这在没有任何保密性的情况下工作。这就是轮数通常与散列一起存储在数据库中的原因,如 SilverlightFox 的回答。

有一些解决方案可以单独存储轮数并尝试对其保密,这可能会增加额外的保护层。但是在评估散列系统时,我们必须假设攻击者知道我们所知道的一切

毕竟,如果有一个地方可以存储保证不被泄露的轮数,我们可以只将密码存储在那里,而根本不用担心散列。

迭代次数和盐值存储在同一个数据库中,通常与密码哈希本身在同一个字段中。因为站点需要像潜在的攻击者一样了解这些事情,所以它们必须很容易获得。例如,bcrypt散列密码包含 (log base 2 of the) 的迭代次数,由 $ 符号与散列的其余部分分隔。

虽然当前接受的答案是正确的,并且迭代次数通常存储在哈希本身所在的位置,即使情况并非如此:

  1. 根据Kerckhoff 原则,您应该假设攻击者可以发现。在实践中,他们可以通过使用已知密码创建自己的登录名或计时登录尝试来找出答案。

  2. 即使迭代次数未知,它也只会增加攻击者检查所有迭代所需的时间,至少使用常见的密码散列函数,例如PBKDF2,您可以从中派生 1000 次迭代散列单次迭代的 999 次迭代哈希。攻击者只需将中间值与密码哈希值进行比较。