【问题标题】:Avoiding hash collision in php when using sha1 for hashing使用sha1进行散列时避免php中的散列冲突
【发布时间】:2013-04-06 06:30:15
【问题描述】:

假设我在 php 中使用 sha1 函数时是否发生哈希冲突。

这段代码会永久避免它还是我必须使用任何其他方式

$filename=sha1($filename.'|'.microtime());

OR

$filename=sha1($filename.'|'.rand());

如果没有,此代码不提供哈希冲突保护。

如果我假设 db 中可能有超过 100,000 个条目,我应该怎么做才能避免任何类型的哈希冲突。

【问题讨论】:

  • 你可以生成一个更强的哈希php.net/manual/en/function.hash.php
  • 我会使用 SHA-2 并假设哈希冲突永远不会发生。对于一个好的散列来说,为两个不同的输入返回相同值的机会可以忽略不计。
  • “如果地球上所有 65 亿人都在编程,那么每一秒,每个人都在生成相当于整个 Linux 内核历史(100 万个 Git 对象)的代码,并将其推入一个巨大的Git 存储库,需要 5 年时间才能使该存储库包含足够的对象,以使单个 SHA-1 对象发生冲突的概率为 50%。” (引自git book

标签: php security hash sha


【解决方案1】:

这些都不能避免哈希冲突。

当您的算法生成特定大小的哈希时,会发生哈希冲突,而不管起始值如何。

哈希冲突是指两个不同的值,例如“mypassword”和“dsjakfuiUIs2kh-1jlks”,由于对它们执行的数学运算而最终生成相同哈希。

您无法编写代码来防止哈希冲突,这种情况发生的频率取决于您使用的哈希算法。

【讨论】:

  • 我在问是否假设发生特定值的哈希冲突。microtime() 值将无法使冲突不发生。
  • 使用 microtime() 绝对不会影响散列冲突的概率,因为它是被散列值的一部分
  • @asharma:Somestring + random number 与单独的Somestring 哈希值相同的可能性很小。但“不太可能”并不意味着“不可能”。虽然可能的 SHA-1 散列的总数非常大,但是可以散列的东西数量是无限的。您不能在没有冲突的情况下将无限数量的项目减少到有限数量。这根本不可能。
【解决方案2】:

只需 sha1() 整个文件路径,而不仅仅是文件名。 文件名 xy.png 只能是目录中的一个,因此您的哈希对于该文件名将是唯一的。 此外,这样做的好处是你不会有重复的文件(而使用 rand()/microtime() 你可以在同一个目录中获得同一个文件 10 次,如果它是一个 1GB 的文件可能会导致问题)

【讨论】:

    【解决方案3】:

    需要明确的是,您不能完全避免哈希冲突。这是对有限数量的输出的无限数量的输入,但您可以考虑文件大小、当前系统时间和用作salt 的其他数据等因素,这将增加您的消息摘要的熵。

    【讨论】:

      【解决方案4】:

      sha1 不太可能发生哈希冲突。 sha1碰撞的概率可以忽略不计

      而且哈希冲突风险是不切实际的。到目前为止还没有人发现 sha1 碰撞。所以你可以安全地使用它。

      使用像微时间或随机数这样的盐可能会降低概率,但你根本无法避免。

      而您使用的是 sha1(string),无论字符串是混合值还是单个字符串。所以使用 microtime 和 rand 函数不会影响哈希冲突的概率。

      因此,sha1(mixedvalue) 冲突可能等于或大于 sha1(filename) 的冲突,所以这当然没有用。

      所以不要担心,如果你愿意,可以使用这个或简单的方法,它不会在未来产生问题,考虑哈希冲突是浪费时间,机会非常非常少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-06
        • 2012-12-22
        • 1970-01-01
        相关资源
        最近更新 更多