迭代哈希函数虽然它减少了搜索空间

时间:2013-12-30 17:29:16

标签: security encryption hash passwords

我正在阅读此article有关您应该隐藏密码的次数

在对密码进行哈希处理之前,会在密码中添加salt以防止字典攻击和彩虹表攻击。

ORIP答复中的评论员说

  散列哈希不是你应该做的事情,因为可能性   哈希冲突随着每次迭代而增加,这可能会减少   搜索空间(盐没有帮助),但这是无关紧要的   基于密码的加密。要达到这个256位搜索空间   哈希你需要一个完全随机的密码,长度为40个字符   所有可用的键盘字符(log2(94 ^ 40))

erickson的答案推荐

  

通过预先计算表,攻击者计算了哈希值   在每次尝试。现在需要多长时间才能找到密码   完全取决于散列候选人需要多长时间。这一次是   通过哈希函数的迭代增加。迭代次数是   通常是密钥导出函数的参数;今天,很多   移动设备使用10,000到20,000次迭代,而服务器则可能   使用100,000或更多。 (bcrypt算法使用术语“成本”   因子“,这是所需时间的对数度量。”

我的问题是

1)为什么我们迭代哈希函数,因为每次迭代都会减少搜索空间,从而更容易破解密码

2)搜索空间意味着什么?

3)为什么缩小搜索空间与基于密码的加密无关

4)什么时候缩小搜索空间相关?

3 个答案:

答案 0 :(得分:3)

让我们从基本问题开始:什么是搜索空间?

搜索空间是必须搜索的所有值的集合,以便找到所需的值。在AES-256的情况下,总密钥空间为2 ^ 256。这是一个非常惊人的大数字。这是大多数人在说AES不能被强迫的时候所抛出的数字。

“8个字母的小写字母序列”的搜索空间是26 ^ 8,或大约200亿(~2 ^ 37),从加密的角度来看,这是一个微小的,无关紧要的数字,可以搜索到漂亮很快。每秒1,000,000次检查不到3天。真正的密码是从更小的集合中选择的,因为大多数人不会输入8个完全随机的字母。 (你可以用大写字母和数字和符号来表示这一点,但人们也可以选择一小部分。)

好的,所以人们喜欢输入简短的密码,但我们想让它们难以暴力破解。因此,我们需要一种方法将“易于猜测的密码”转换为“难以猜测的密钥”。我们称之为密钥推导函数(KDF)。我们需要两件事:

  • KDF必须“在计算上无法与随机区分”。这意味着散列函数没有倒数可以比强力搜索更快地计算。
  • KDF应该花费非常重要的时间进行计算,因此强制使用微小的密码空间仍然非常困难。理想情况下,它应该像粗暴强制整个密钥空间那样难以实现,但很难将它推到那么远。

第一点是你的问题“我们为什么不关心碰撞?”的答案。这是因为碰撞虽然可能存在,但却无法以计算有效的方式进行预测。如果可以有效地预测碰撞,那么你的KDF函数就无法与随机区分开来。

KDF与“重复散列”不同。重复散列可以与随机区分开来,并受到重大攻击(最值得注意的是length-extension attacks)。

PBKDF2,作为特定的KDF示例,被证明在计算上无法与随机区分,只要它具有伪随机函数(PRF)即可。 PRF被定义为本身在计算上与随机无法区分。 PBDFK2使用HMAC,证明它是PRF,只要它提供至少具有弱抗冲突性的散列函数(the requirement is actually a bit weaker than even that)。

请注意“证明”这个词。良好的密码学生活在数学安全证明之上。它不仅仅是“打结很多结,希望它能保持下去。”

因此,为什么我们不担心碰撞,这只是一点点数学,但我们也要考虑一些直觉。

在普通英语键盘上可轻松输入的16个字符(荒谬的长)密码总数约为95 ^ 16或2 ^ 105(不计入15,14,13等密码长度) ,但由于95 ^ 16几乎比95 ^ 15大两个数量级,所以它足够接近)。现在,考虑到每个密码,我们将随机将其映射到10,000个中间密钥(通过10,000次迭代的PBKDF2)。这让我们得到了2 ^ 118个随机选择,我们希望永远不会在我们的哈希中碰撞。有什么机会?

好吧,2 ^ 256(我们的总空间)除以2 ^ 118(我们的键)是2 ^ 138。这意味着我们使用的空间远远少于10 ^ -41,甚至可能是远程可能的所有密码。如果我们随机选择这些(并且PRF的定义说我们是),那么两次碰撞的可能性很小。如果两个人以某种方式做到了,那么攻击者就无法预测它。

带走课程:使用PBKDF2(或其他好的KDF,如scrypt或bcrypt)将密码转换为密钥。使用大量迭代(至少10,000-100,000)。不要担心碰撞。

您可能有兴趣在Brute-Forcing Passwords中对此进行更多讨论。

答案 1 :(得分:1)

  1. 正如第二个片段所说的那样,每次迭代都会让每个“猜测”黑客花费更长时间,因此增加了破解平均密码所需的总时间。

  2. 在您使用多次迭代后,搜索空间是密码的所有可能哈希值。每次迭代都会缩小搜索空间。

  3. 由于#1,随着搜索空间的大小减小,检查每种可能性的时间会增加,从而平衡这种负面影响。

  4. 根据第二个片段,答案#1和#3说它实际上不是。

  5. 我希望这是有道理的,这是一个非常复杂的话题。

答案 2 :(得分:1)

迭代的原因是让攻击者更难以强制哈希。如果您对一个值进行了一轮哈希处理,那么为了预先计算一个表来破解该哈希值,您需要执行1 *键空间哈希。如果你执行1000哈希的值,那么它将需要1000 *键空间的工作。

搜索空间通常是指可构成密码的字符组合总数。

我想说搜索空间的减少是无关紧要的,因为密码通常不会通过尝试0000000,然后是0000001等来破解。相反,它们试图通过使用字典和组合来破解。基本上存在一些可能被破解的密码领域(如“密码”,“abcdef1”,“goshawks”等),但创建更大的工作因素会使攻击者更难以击中所有空间中可能的密码。将它与盐相结合意味着他们必须为那些可能的密码做所有的工作,对于他们想要破解的每个哈希。

如果您尝试破解随机的内容并且可以占用搜索空间中的任何值,搜索空间的减少就会变得相关。