我想防止重复的内容。我不想保留内容的副本,所以我决定只保留 md5 签名。
我读到确实会发生 md5 冲突,不同的内容可能会给出相同的 md5 签名。
你觉得md5够用吗?
我应该一起使用 md5 和 sh1 吗?
人们已经能够在人为的情况下故意产生 MD5 冲突,但为了防止重复内容(在没有恶意用户的情况下),它已经足够了。
话虽如此,如果你可以使用 SHA-1(或 SHA-2),你应该 - 你会在碰撞中稍微安全一点,但可以衡量。
MD5 应该没问题,碰撞很少,但如果你真的很担心,你也可以使用 sha-1。
虽然我猜签名真的没有那么大,所以如果你有空闲的处理周期和磁盘空间,你可以两者都做。但如果空间或速度有限,我会选择一个。
如果存在哈希冲突,为什么不简单地逐字节比较内容呢?哈希冲突非常罕见,因此您只需很少对字节进行字节检查。这样,只有在项目实际重复时才会检测到重复项
md5应该足够了。是的,可能会发生冲突,但发生这种情况的可能性非常小,除非你真的在跟踪数十亿条内容,否则我不会担心它。
如果您真的害怕意外碰撞,只需同时进行 MD5 和 SHA1 哈希并比较它们。如果它们都匹配,则它是相同的内容。如果任何一个不同,那就是不同的内容。
组合算法仅用于混淆,但不会增加散列算法的安全性。
恕我直言,MD5 无论如何都无法使用。研究人员证明了伪造 MD5 哈希值,他们证明了能够伪造产生 MD5 冲突的内容,从而为生成伪造的 CSR 以从 RapidSSL 购买他们不拥有的域名的证书打开了大门。 立即安全!第 179 集解释了这个过程。
对我来说,基于 SHA 的哈希更强大,大多数开发平台都支持它,所以选择很容易。剩下的决定因素是块大小。
MD5 坏了,SHA1 接近了。使用 SHA2。
编辑
根据 OP 的更新,这里的故意碰撞似乎不是一个严重的问题。对于无意的散列,任何具有至少 64 位输出的像样的散列都可以。
一般来说,我仍然会避免使用 MD5 甚至 SHA1,但没有理由对此持教条主义。如果该工具适合这里,那么一定要使用它。
时间戳 + md5 一起就足够安全了。