18

MD5 和 SHA-1 哈希在碰撞攻击方面存在弱点。SHA256 没有,但它输出 256 位。我可以安全地获取前 128 位或后 128 位并将其用作散列吗?我知道它会更弱(因为它的位数更少)但否则它会起作用吗?

基本上,我想用它来唯一标识文件系统中可能有一天包含一万亿个文件的文件。我知道生日问题,并且 128 位哈希应该在万亿文件中产生大约万亿分之一的机会,即会有两个具有相同哈希的不同文件。我可以忍受这些可能性。

我不能忍受的是,如果有人可以轻松地、故意地插入一个具有相同哈希值和文件开头字符的新文件。我相信 MD5 和 SHA1 这是可能的。

4

4 回答 4

8

是的,这会奏效。从理论上讲,最好将两半异或在一起,但即使是截断的 SHA256 也比 MD5 强。您仍然应该将结果视为 128 位散列而不是 256 位散列。

在这种特殊情况下,我的特别建议是使用 HASH + uniquifier 存储和引用,其中 uniquifier 是您之前使用此哈希看到的不同文件的数量。这样,如果有人试图为 SHA256 存储未来发现的碰撞向量,您就不会完全倒下。

于 2010-06-11T23:24:53.477 回答
3

但是这值得吗?如果每个文件都有一个哈希,那么每个文件基本上都有开销。假设每个文件必须占用至少512 个字节(一个典型的磁盘扇区),并且您将这些散列存储得足够紧凑,以免每个散列占用的空间超过散列大小。

所以,即使你所有的文件都是 512 字节,最小的,你说的要么16 / 512 = 3.1%32 / 512 = 6.3%. 实际上,我敢打赌您的平均文件大小更高(除非您的所有文件都是 1 个扇区......),因此开销会更少。

现在,散列所需的空间量与您拥有的文件数量成线性关系。额外的空间值那么多吗?即使您有提到的万亿文件 - 那1 000 000 000 000 * 16 = ~29 TiB是很大的空间,但请记住:您的数据将是1 000 000 000 000 * 512 = 465 TiB. 3%实际上,这些数字毫无价值,因为它仍然是6%开销。但在这个级别,你有半 PB 的存储空间,15​​ TB 重要吗?在任何层面上,3%储蓄是否意味着什么?请记住,如果它们更大,您可以节省更少。(它们可能是:祝你好运,以该硬盘大小获得 512 字节的扇区大小。)

那么,这种3%或更少的磁盘节省是否值得潜在的安全风险。(我不会回答,因为这不是我的一杯茶。)

或者,您能否以某种合乎逻辑的方式将文件组合在一起,从而减少文件?(我的意思是,如果你有数万亿个 512 字节的文件,你真的想要散列磁盘上的每个字节吗?)

于 2010-06-11T23:21:54.120 回答
0

是的,这会奏效。

作为记录,有已知的针对 MD5 的冲突攻击,但 SHA-1 攻击此时完全是理论上的(还没有发现 SHA-1 冲突......但是)。

于 2010-06-11T22:58:37.717 回答
0

Crypto 做了类似的事情,例如以太坊地址是 Keccak(SHA-3 的前身)哈希的低 160 位。

在此处输入图像描述

于 2021-08-25T16:41:17.810 回答