【问题标题】:How are hash functions like MD5 unique?像 MD5 这样的哈希函数有何独特之处?
【发布时间】:2011-01-27 12:14:05
【问题描述】:

我知道 MD5 发生了一些冲突,但这更多是关于散列函数的高级问题。

如果 MD5 将任意字符串散列成一个 32 位十六进制值,那么根据 Pigeonhole Principle 肯定这不可能是唯一的,因为唯一的任意字符串比唯一的 32 位十六进制值要多。

【问题讨论】:

标签: hash theory md5 uniqueidentifier


【解决方案1】:

您说得对,它不能保证唯一性,但是 32 位十六进制值 (16^32) 中大约有 3.402823669209387e+38 个不同的值。这意味着,假设算法背后的数学给出了良好的分布,那么出现重复的几率非常小。您必须记住,当您考虑如何使用它时,可以复制。 MD5 通常用于确定是否已更改某些内容(即它是校验和)。修改某些内容并产生相同的 MD5 校验和的可能性极小。

编辑:(鉴于最近的新闻:SHA1 哈希) 上面的答案仍然成立,但您不应该期望 MD5 散列用作任何类型的安全检查以防止操纵。 SHA-1 散列为 2^32(超过 40 亿)倍的碰撞可能性降低,并且已经证明可以设计输入以产生相同的值。 (这在很久以前针对 MD5 进行了证明)。如果您希望确保没有人恶意修改某些内容以产生相同的哈希值,那么这些天,您需要在 SHA-2 上获得可靠的保证。

另一方面,如果它不在安全检查上下文中,MD5 仍然有用。

可以说 SHA-2 散列计算成本足够低,无论如何你都应该使用它。

【讨论】:

  • 设计哈希函数背后的聪明之处在于所有这些输出的可能性相同。如果您有两个几乎相同的文档,仅相差 1 位,它们将产生完全不同的哈希值。
  • 加密哈希的另一个有趣特性是它们被设计成难以“反转”或“定位”。换句话说,给定一个散列,应该很难想出一条会产生该散列的消息。
  • 有趣。这意味着,两封不同的电子邮件很有可能生成相同的 md5 哈希值,而 Gravatar 提供了错误的用户图片。 de.gravatar.com/site/implement/hash
  • 但请记住birthday problem
  • @NabiK.A.Z.从某种意义上说,是的,SHA-2 与 MD5 和 SHA-1 存在相同的问题,因为它们都受 OP 引用的鸽子洞原则的约束。然而,SHA-1 的鸽子洞比 MD5 多很多,而 SHA-2 比 SHA-1 多很多,这使得碰撞的可能性更小。据我所知,没有人设法解决导致相同 SHA-2 哈希的操作,但这只是所需的处理资源不同。
【解决方案2】:

你完全正确。但是哈希不是关于“唯一”,而是关于“足够独特”。

【讨论】:

    【解决方案3】:

    正如其他人所指出的,像 MD5 这样的哈希函数的目标是提供一种轻松检查两个对象是否相等的方法,而无需知道它们最初是什么(密码)或比较它们的整体(大文件) .

    假设你有一个对象O 和它的哈希hO。您获得另一个对象P 并希望检查它是否等于O。这可能是密码,或者是您下载的文件(在这种情况下,您将没有O,而是P 附带的hO 的哈希值)。首先,你对P 进行哈希运算得到 hP.

    现在有两种可能性:

    1. hO 和 hP 是不同的。这一定意味着OP 是不同的,因为对2 个值/对象使用相同的散列必须产生相同的值。哈希是确定性的。 没有误报。
    2. hO 和 hP 相等。正如您所说,由于鸽巢原则,这可能意味着不同的对象散列到相同的值,可能需要采取进一步的行动。

      一个。因为可能性的数量是如此之高,如果你对你的哈希函数有信心,说“嗯,有 2 分之一128 的碰撞机会(理想情况),所以我们可以假设O = P。例如,如果您限制字符的长度和复杂性,这可能适用于密码。这就是为什么您会看到存储在数据库中的密码哈希而不是密码本身。 湾。您可能会决定仅仅因为哈希值相等并不意味着对象相等,并直接比较OP您可能有误报。

    因此,虽然您可能有误报匹配,但您不会有误报。根据您的应用程序,以及您是否希望对象始终相等或始终不同,散列可能是一个多余的步骤。

    【讨论】:

      【解决方案4】:

      根据定义的性质,加密单向哈希函数不是Injective。 就哈希函数而言,“唯一”毫无意义。这些函数是由其他属性来衡量的,这会影响它们的强度,使得创建给定哈希的原像变得困难。例如,我们可能关心改变原像中的单个位会影响多少图像位。我们可能会关心进行暴力攻击(为给定的哈希图像找到一个prie-image)有多难。我们可能关心找到冲突有多难:找到两个具有相同哈希图像的前图像,用于birthday attack

      【讨论】:

        【解决方案5】:

        虽然如果要散列的值比生成的散列长得多,则很可能会发生冲突,但对于大多数用途而言,冲突的数量仍然足够低(有 2128 可能的哈希总数,因此理论上两个随机字符串产生相同哈希的几率接近 1038)。

        MD5 主要是为了进行完整性检查而创建的,因此它对最小的更改非常敏感。输入中的微小修改将导致完全不同的输出。这就是为什么仅根据哈希值很难猜出密码的原因。

        虽然哈希本身是不可逆的,但仍然可以通过纯暴力找到可能的输入值。这就是为什么在使用 MD5 存储密码散列时应始终确保添加盐的原因:如果在输入字符串中包含盐,则匹配的输入字符串必须包含完全相同的盐才能得到相同的结果输出字符串,因为否则与输出匹配的原始输入字符串在自动加盐后将无法匹配(即,您不能只是“反转” MD5 并使用它来登录,因为反转的 MD5 哈希很可能不是加盐的最初导致创建哈希的字符串)。

        所以哈希值不是唯一的,但是可以使身份验证机制使其足够唯一(这是密码限制代替加盐的一个有点合理的论据:导致相同哈希值的字符串集可能包含许多不遵守密码限制的字符串,因此通过蛮力反转哈希更加困难——显然盐仍然是一个好主意)。

        更大的哈希意味着相同输入集的可能哈希集更大,因此重叠的可能性更低,但在处理能力提高到足以使暴力破解 MD5 变得微不足道之前,对于大多数用途来说,它仍然是一个不错的选择。

        【讨论】:

          【解决方案6】:

          (好像是Hash Function Sunday。)

          加密哈希函数被设计为具有非常、非常、非常低的重复率。由于您所说的明显原因,利率永远不会为零。

          Wikipedia page 提供信息。

          【讨论】:

            【解决方案7】:

            正如迈克(以及其他所有人)所说,它并不完美,但它确实能胜任,而且碰撞性能确实取决于算法(实际上相当不错)。

            真正感兴趣的是文件或数据的自动操作,以使不同数据保持相同的哈希值,请参阅Demo

            【讨论】:

              【解决方案8】:

              正如其他人所回答的那样,哈希函数根据定义不能保证返回唯一值,因为对于无限数量的输入,哈希函数的数量是固定的。它们的关键特性是它们的碰撞是不可预测的

              换句话说,它们不容易可逆 - 因此,虽然可能有许多不同的输入会产生相同的哈希结果(“冲突”),但要找到其中任何两个在计算上是不可行的。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-03-01
                • 1970-01-01
                • 1970-01-01
                • 2012-08-17
                • 2011-05-05
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多