【问题标题】:Can I prevent duplicate content using md5?我可以使用 md5 防止重复内容吗?
【发布时间】:2010-11-10 10:31:23
【问题描述】:

我想防止重复内容。我不想保留内容的副本,所以我决定只保留 md5 签名。

我了解到确实会发生 md5 冲突,不同的内容可能会给出相同的 md5 签名。

你觉得 md5 够用吗?

我应该同时使用 md5 和 sh1 吗?

【问题讨论】:

  • 我们在谈论多少内容?
  • 这无关紧要,因为 SHA2 摘要的大小足以使意外碰撞几乎不可能发生。
  • 这回答了你的问题 - stackoverflow.com/questions/201705/…
  • 明显的后续问题:我们关心的是故意的碰撞还是只是偶然的碰撞?
  • 感谢您的澄清。基于此,似乎存在故意冲突是可能的,但 URL(短,7 位)的性质可能使得难以制造也是有效 URL 的冲突。考虑到这一点,并且假设没有强烈的 ($$$) 故意碰撞的动机,即使使用 MD5 也可以。

标签: md5 hash


【解决方案1】:

人们已经能够在人为的情况下故意产生 MD5 冲突,但对于防止重复内容(在没有恶意用户的情况下)来说已经绰绰有余了。

话虽如此,如果您可以使用 SHA-1(或 SHA-2),那么您应该使用 - 您将在一定程度上避免碰撞,但可以衡量地更安全。

【讨论】:

  • 即使存在恶意用户,这应该没问题,不是吗?首先发布合法内容 -> 恶意用户制造故意冲突 -> 恶意用户被拒绝发布内容
  • (这里关于 samoz 的回答的评论顺序:stackoverflow.com/questions/1121701/… 地址 Spencer 的评论。)
  • MD5 适合这种情况,因为 CPU 成本低。如果您仍然担心由于碰撞导致的误报,请先运行 MD5,然后在命中后,使用 SHA-2 验证其真实性而不是碰撞(误报)。这就是我们所做的,在 99.99999999999% 的时间内获得 MD5 的低 CPU 成本和仅在需要时获得 SHA2 的高精度。
【解决方案2】:

MD5应该没问题,碰撞很少,但如果你真的很担心,你也可以使用sha-1。

虽然我猜签名真的没有那么大,所以如果你有空闲的处理周期和磁盘空间,你可以同时做。但如果空间或速度有限,我会选择一个。

【讨论】:

  • MD5 不好,因为它现在很容易故意碰撞。
  • 所以?首先发布合法内容 -> 恶意用户制造故意冲突 -> 恶意用户被拒绝发布内容。
  • 恶意用户故意为尚未发布的内容制造冲突 ( 合法用户尝试发布内容 -> 合法用户被拒绝发布内容。
  • @Spencer:我敢打赌答案是 42
  • 我完全赞成盐,但我认为它在这里行不通。如果您对每条内容使用不同的盐,那么您将无法检测到重复项。如果你使用相同的盐并且它被人们知道,那么它就不会提供任何防御。从本质上讲,salt 所做的只是稍微模糊了哈希算法。
【解决方案3】:

如果存在哈希冲突,为什么不简单地逐字节比较内容呢?哈希冲突非常罕见,因此您只需很少对字节进行字节检查。这样,只有在项目实际重复时才会检测到重复

【讨论】:

    【解决方案4】:

    md5 应该足够了。是的,可能会发生冲突,但发生这种情况的可能性非常小,除非您真正跟踪数十亿条内容,否则我不会担心。

    【讨论】:

      【解决方案5】:

      如果您真的害怕意外碰撞,只需同时进行 MD5 和 SHA1 哈希并比较它们。如果它们都匹配,则它是相同的内容。如果其中任何一个不同,那就是不同的内容。

      【讨论】:

        【解决方案6】:

        组合算法仅用于混淆,但不会增加散列算法的安全性。

        MD5 太坏了,无论如何都无法使用,恕我直言。研究人员证明了伪造 MD5 哈希值,他们证明了能够伪造产生 MD5 冲突的内容,从而为生成伪造的 CSR 以从 RapidSSL 购买他们不拥有的域名的证书打开了大门。 Security Now! episode 179 explains the process.

        对我来说,基于 SHA 的哈希值更强大,而且大多数开发平台都支持它,因此选择起来很容易。剩下的决定因素就是块大小。

        【讨论】:

        • 我只想补充一点,SHA-1 已经显示出弱点,所以一般推荐使用 SHA-2。
        【解决方案7】:

        一个时间戳 + md5 一起就足够安全了。

        【讨论】:

        • 这真的取决于内容;例如您不希望对图像使用时间戳,因为两个图像可能是逐字节重复的,但具有不同的创建/修改时间戳。
        【解决方案8】:

        MD5 坏了,SHA1 接近它。使用 SHA2。

        编辑

        根据 OP 的更新,在这里故意碰撞似乎不是一个严重的问题。对于无意的哈希,任何具有至少 64 位输出的像样的哈希都可以。

        总的来说,我仍然会避免使用 MD5 甚至 SHA1,但没有理由对此持教条主义的态度。如果该工具适合这里,那么一定要使用它。

        【讨论】:

        • 你能否链接到一些证据表明 SHA-1 像 MD5 一样被破坏?
        • 我认为在这种情况下,SHA1 是矫枉过正。他并没有试图保护任何东西(比如密码),而是防止重复。 MD5 很适合这个目的。
        • 接近了,但还没有坏掉。见en.wikipedia.org/wiki/SHA_hash_functions#SHA-1
        • @Thomas,SHA2 系列具有多种摘要大小,可以进行调整以避免生日悖论。即使最小的是 256 位,与 MD5 的 128 位相反。我对上下文也不太了解,但如果故意碰撞有风险,那么绝对排除 MD5。
        • 但是在防止重复时,故意碰撞会发生的最坏情况是,不是重复的东西会被标记为重复。我认为无论如何,较小的摘要大小和罕见的碰撞都是值得的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多