【问题标题】:Is hash always different for different strings? [duplicate]对于不同的字符串,哈希总是不同的吗? [复制]
【发布时间】:2014-03-20 17:17:37
【问题描述】:

我尝试通过md5 算法使用文件名对文件的路径进行哈希处理,当然文件名在系统中总是不同的。我很感兴趣的是这个散列对于不同的文件总是会有所不同还是散列可以重复?

可以让我从不同的文件中获得相同的哈希值吗?有什么限制吗?谢谢

【问题讨论】:

  • 不,“哈希冲突”或“冲突”是两个不同字符串生成相同哈希时使用的术语
  • 这是冲突的证明:3v4l.org/2vrMi
  • @JohnConde 但是当我打印这两个哈希时它们是不同的,不明白为什么?
  • @Victor 这是因为两个哈希返回的字符串都以“0e ...”为星号,所以PHP将它们视为浮点数并且它们最终相等。只需使用 === 进行比较,它就会给出正确的结果3v4l.org/4jLl0

标签: php hash md5


【解决方案1】:

您的文件名不太可能发生哈希冲突,但是有可能,因此您可能希望将其视为应用程序中潜在的错误来源(取决于您要哈希的字符串数量) )。

你没有提到你散列文件名是否有任何加密原因,如果你确实需要对文件名进行安全加密,你应该改用php crypt() 函数(md5 散列长期以来一直不被认为是安全的时间http://www.kb.cert.org/vuls/id/836068)

【讨论】:

    【解决方案2】:

    哈希冲突是当今密码学和通用计算机科学中的一个主要问题。虽然 md5 是一种广为人知和使用的散列,但其中的冲突可能非常普遍。碰撞不太可能发生,但它们可能会发生。除非有人试图创建它们,否则它们通常不会发生。

    我在这里提交的问题是存在 340282366920938463463374607431768211456 可能的 md5 哈希(因为它们显示为十六进制样式,可能有 16 个字符被提升到 32 个字符长度的幂),但是有无限数量的字符串可以被散列(当然排除了计算限制)。

    但是,如果可能发生冲突,开发人员该怎么办?

    我最近与我的一位新朋友会面,他经营的业务除其他外涉及密码学。他说了我以前从未想过的话。由于我缺乏逐字逐句回忆的记忆,大致是这样的:“当然,你可以欺骗我的 md5,但试着欺骗我的 md5 和我的 sha256。”他的意思是,作为开发人员,我们有大量的编程选项,我们应该利用它们。我们有 md5、gost、sha-family,而且名单还可以继续。使用 sha256 和 md5 对字符串进行哈希处理,您会发现发生冲突的机会大大降低。事实上,它可能会降低到几乎没有碰撞机会的地步。

    这个的实现:

    <?php $salt = "my_secret_salt"; /* this should have numbers, spaces, letters, special characters, etc. */ $stringToHash = $theUsersCookieValues; $time = time(); $hash_1 = hash('md5', $time . $salt . $stringToHash); $hash_2 = hash('sha256', $time . $salt . $stringToHash); setcookie("time_created", $time); setcookie("user", $theUserCookieValues); setcookie("hash_1", $hash_1); setcookie("hash_2", $hash_2); ?> 虽然这涉及 cookie,而不是文件名,但在我看来,它仍然是实现这一原则的好方法。

    【讨论】:

    • 好吧,您可以使用 512 位或更多位的更大散列,而不是使用两个散列。
    • 是的,但纯粹从速度的角度来看,sha256 和 md5 的计算时间(我只是做一个假设)比 sha512 花费的时间少一些。最重要的是,512 位散列只是 1 个散列。 1 个哈希值仍然比 2 个哈希值更容易被欺骗。虽然这两种方式都极不可能,并且可能需要几十年后才能找到碰撞,但我仍然大胆猜测,同时愚弄 md5 和 sha256 比愚弄单个 512 的可能性更小。话虽如此,一个人可以做两个 512 和 2 种不同的盐,但这似乎有点过头了。
    • "1 个哈希值仍然比 2 个哈希值更容易欺骗。"不,情况并非如此,因为在 sha 512 位上发生碰撞的可能性远小于在 sha256 上发生碰撞的可能性 x md5 碰撞的可能性。
    • 但是,您发现的 md5 和 sha256 的冲突必须彼此相同。
    • 至于计算较大哈希的速度,可以通过使用位数等于 256 + 128 位的单个哈希来缓解。
    【解决方案3】:

    是的,您可能会遇到哈希冲突。请参阅有关鸽巢原理和生日悖论的维基百科文章以了解原因。

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 2021-05-09
      • 2018-07-16
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多