【问题标题】:calculating which strings will have the same hash计算哪些字符串将具有相同的哈希值
【发布时间】:2011-03-10 09:10:47
【问题描述】:

使用 SHA-1 是否可以确定哪些有限字符串将呈现相等的哈希?

【问题讨论】:

  • 这取决于哈希函数。你在想什么哈希函数?
  • 嘿,为什么投反对票?这是一个合理的问题。如果这就是你投反对票的原因,至少发布一个可能的重复。
  • @user 请注意,回到您最初关于用非 SSN 标识符替换 SSN 的问题,散列冲突不是您需要关注的问题。您需要担心有人选择任意 SSN,对其进行哈希处理,然后查看哈希对应的数据库中的哪个名称(如果有)。如果有匹配项,那么很有可能就是这个人的 SSN。这就是人们在您之前的问题中谈论的关于盐渍和彩虹表的内容。

标签: algorithm hash


【解决方案1】:

您正在寻找的是Collision Problem 的解决方案(另请参阅collision attack)。 设计了一个设计良好且功能强大的加密哈希函数,目的是尽可能多地混淆数学,以使这个问题尽可能复杂。

事实上,一个好的哈希函数的衡量标准之一是发现冲突的难度。 (在其他措施中,反转哈希函数的难度)

需要注意的是,在输入是任意长度的字符串并且输出是固定长度的字符串的哈希中,Pigeonhole Principle 确保对于任何给定的字符串至少存在一次冲突。然而,找到这个字符串并不容易,因为它需要对基本上无限的字符串集合进行基本上盲目的猜测和检查。

读入理想的散列函数可能很有用。散列函数被设计为以下函数:

  • 输入的微小变化会导致输出发生剧烈、混乱的变化
  • 冲突减少到最低限度
  • 很难或理想情况下不可能逆转
  • 没有任何输入无法获得的散列值(这对于加密目的而言意义不大)

理论上的“完美”哈希算法是“随机预言机”——也就是说,对于每个输入,它输出一个完美随机输出,条件是对于相同的输入,输出将是相同的(这个条件由宙斯和小精灵之手通过魔法实现,或者以人类永远无法理解或弄清楚的方式实现)

不幸的是,这几乎是不可能的,最终,所有哈希都被判断为“强”,基于它们拥有多少这些品质以及达到什么程度。

像 SHA1 或 MD5 这样的哈希将非常强大,并且在计算上或多或少不可能找到冲突(在合理的时间范围内)。最终,您不需要找到不可能找到冲突的哈希。实际上,您只需要一个难度足够大以至于计算成本太高(即大约十亿或一万亿年才能找到碰撞)

由于所有哈希值都不完美,因此可以分析其内部工作原理并查看数学模式和启发式方法,并尝试沿着该模式找到冲突。这类似于散列函数为 %7...对数字 13 进行散列运算将是 13%7 = 6、89%7 = 5。如果您看到散列为 3,则可以使用您对模函数的数学理解轻松找到碰撞(即 10)1。对我们来说幸运的是,更强的散列函数具有非常、非常、非常难以理解的数学基础。 (理想情况下,很难,没有人会理解它!)

一些数字:

  • 使用数学中固有的模式,在世界顶级超级计算机上运行计算大约需要 13 天,才能找到单个给定 SHA-0 哈希的冲突。
  • 根据一位乐于助人的评论者的说法,MD5 冲突可以“快速”地生成,以至于对于敏感用途而言并不理想。
  • 到目前为止,还没有发现或证明适用于 SHA-1 的可行或实用/可用的碰撞发现方法,尽管正如 cmets 中指出的那样,已经发现了一些弱点。

这是similar SO question,它的答案比我的聪明得多。

1请注意,虽然这个散列函数对于碰撞来说很弱,但如果你的散列是,它是强大的,它完全不可能向后找到一个给定的键,比如说, 4. 有无限数量(即4, 11, 18, 25...)

【讨论】:

  • 每天阅读相同问题的相同答案,但很少写得这么好。
  • (值得一提的是,由于发现的弱点,MD5冲突可以在可行的时间内产生;虽然时间仍然不可行,但SHA1已被证明不太理想。寻找两者的替代品的竞争 - SHA3 - 现在正在进行,并将于 2012 年底结束)
  • @BlueRajaj:谢谢,Pflughoeft 先生。我已经注意到了值得一提的地方 =)
  • 很好的答案,除了:“事实上,我被告知人们已经预先计算了 2^128 个可能的 MD5 结果哈希中的每一个的所有冲突。” - 说什么?有无数个值会产生相同的哈希,所以这是不可能的。更不用说,即使为 2^128 个散列值中的每一个存储一个字节也需要 3e20 艾字节,并且以每秒 10 亿个散列的速度计算它需要 1e20 个世纪才能完成。
【解决方案2】:

答案是肯定的,因为至少你可以遍历给定长度的每个可能的字符串,计算所有字符串的哈希值,然后看看哪些是相同的。更有趣的问题是如何快速

延伸阅读:http://en.wikipedia.org/wiki/Collision_attack

【讨论】:

    【解决方案3】:

    这取决于哈希函数。使用简单的哈希函数,它可能是可能的。例如,如果散列函数只是简单地将字符串的 ASCII 字节值相加,则可以枚举给定长度的所有字符串,这些字符串产生给定的散列值。如果散列函数更复杂且“加密强度更高”(例如 MD5 或 SHA1),那么理论上是不可能的。

    【讨论】:

      【解决方案4】:

      大多数散列具有加密或接近加密的强度,因此散列以不明显的方式依赖于输入。专业的方法是使用彩虹表,它是预先计算的输入及其哈希表。所以蛮力检查基本上是唯一的方法。

      【讨论】:

        猜你喜欢
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 2012-07-12
        • 2011-12-02
        • 1970-01-01
        • 2016-10-08
        • 2021-05-09
        相关资源
        最近更新 更多