使用sha1进行散列时避免在php中进行哈希冲突

时间:2013-04-13 21:38:26

标签: php security hash sha

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

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

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

OR

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

你正在使用的是sha1(字符串)字符串是混合值还是单个字符串。因此使用microtime和rand函数不会影响任何哈希冲突概率。

因此,sha1(mixedvalue)碰撞有可能等于或大于sha1(文件名)的碰撞,所以当然没有用。

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

答案 1 :(得分:2)

为了清楚起见,你无法完全避免哈希冲突。对于有限数量的输出,它是无限数量的输入,但您可以考虑文件的大小,当前系统时间和用作salt的其他数据等内容,这将增加消息摘要的熵

答案 2 :(得分:1)

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

当您使用生成特定大小的哈希值的算法时,无论起始值如何,都会发生哈​​希冲突。

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

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

答案 3 :(得分:1)

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