我想使用数据块的SHA-256哈希作为索引中的键来维护唯一数据块的列表(大小最大为1MiB)。显然有可能发生哈希冲突,那么减少这种风险的最佳方法是什么?如果我还计算了该块的(例如)MD-5哈希,并使用组合(SHA-256,MD-5)作为键,那么发生碰撞的几率与某些384位哈希函数相同,还是因为我使用了不同的哈希函数而变得更好?

感谢信息!

编辑:我的数据块来自硬盘驱动器上的普通用户数据,但是总共将达到PB级。

Edit2:作为后续(请告诉我是否应移至其他问题):由于块的大小可能有所不同,但可能会增加达到某个预先配置的限制(例如1MiB),如果我将密钥的块部分的(64位)大小设为密钥,将如何影响抗冲击性?这样,您只能使具有相同大小的块发生碰撞...

评论

在Edit2上,最多将大小添加为密钥的一部分,这将最多增加一些安全性(但是在大方案中,因为哈希函数已经非常安全了,所以实际上并不重要)。在最坏的情况下,它什么也不会添加。但是,我想不出一种方法来摆脱系统的安全性。

与Edit2一样,请谨慎执行,因为错误消息可能会导致信息泄漏(即文件的长度可能会泄漏)。

#1 楼

碰撞的风险只是理论上的;在实践中不会发生。花在担心这种碰撞危险上的时间浪费了时间。考虑一下,即使您有$ 2 ^ {90} $美元的1MB块(即存储在1TB硬盘上的数十亿亿个块,这些磁盘也将像美国一样堆成一堆,高出几公里),仍然存在风险发生碰撞的次数低于$ 2 ^ {-76} $。另一方面,被从动物园中逃脱的大猩猩咬伤的风险每天至少为$ 2 ^ {-60} $,即比SHA-256碰撞发生的可能性大65,000倍,而超出可能的范围。换句话说,在发生一次碰撞之前,您可以期待65,000次连续的凶杀大猩猩的造访。因此,如果您知道什么对您有好处,请放下MD5,然后去买一把shot弹枪。


SHA-256和MD5。事实证明,这并没有像人们想象的那样增强安全性。 384位的总大小肯定不会提供比384位哈希函数所提供的碰撞更安全的保护;但是它实际上比这要弱得多:仅凭SHA-256并不能真正强大得多。有关血腥细节,请参见前面的问题和本研究文章。可以总结为以下几点:当并行使用多个哈希函数并连接输出时,总的抵御能力并不比单个函数中的最强函数强。

当然,MD5本身具有很强的抗碰撞能力,因此不应将其用于较新的设计。

评论


$ \ begingroup $
虽然这当然很有趣,但它确实遗漏了一点:如果被逃跑的大猩猩殴打的概率是$ 2 ^ {-60} $,那么被两个逃跑的大猩猩砸伤的概率不是$ 0.5 \乘以2 ^ {-60} $,但$(2 ^ {-60})^ 2 = 2 ^ {-120} $。因此,在发现碰撞之前,您真的不能指望被25万只连续的大猩猩所伤。但是,您仍然比被撞伤的可能性更大。
$ \ endgroup $
–雨披
2011年11月11日在21:49



$ \ begingroup $
@poncho:每天$ 2 ^ {-60} $。因此,$ 2 ^ {-120} $是同一天遇到两只大猩猩的概率。您可以按时间范围进行查看:平均而言,每2 ^ {60} $天,您就会遇到一只大猩猩。您每$ 2 ^ {76} $天就会遇到一次SHA-256碰撞(我的估计有误,因此有65000头大猩猩,而不是250000)(假设您每天重新生成$ 2 ^ {90} $ 1MB块)。因此,每次碰撞您实际上都会获得$ 2 ^ {16} $的大猩猩-但不是一次就发生,这是一次大规模的大猩猩军队进攻! (这很怪异)
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
2011年11月11日22:00



$ \ begingroup $
啊,我错过了这一点。另一方面,我正在研究您真的会受到从动物园逃脱的大猩猩的攻击的可能性:快速Google展示了过去十年间至少三人实际上受到了大猩猩从动物园逃跑的攻击(没有严重)。这将此类事件的概率限制为约3美元/(7000000000 x 365 x 10)\大约2 ^ {-43} $。因此,与在同一天遭到两个独立大猩猩袭击的可能性相比,发现碰撞的可能性不大(!)
$ \ endgroup $
–雨披
2011年11月12日14:39



$ \ begingroup $
@Ricky:如果我们知道如何手工制作数据块以触发SHA-256冲突,并且比随机块获得更好的成功,那么这将被宣传为SHA-256的突破。目前尚不知道SHA-256有这种中断。当前攻击MD5和SHA-1的方法似乎不太适用于SHA-256(已尝试过)。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
2011-11-13 14:48

$ \ begingroup $
请记住,大猩猩逃逸不一定是独立事件。 :-)
$ \ endgroup $
–善待您的Mod
2012年12月22日在20:03

#2 楼


碰撞的危险只是理论上的;在实际中不会发生。


除非有特定情况。给出的说明暗示该系统将是某种形式的重复数据删除文件系统或备份系统。对于大多数用户而言,碰撞风险很小。

但是,对于一类特定的用户,则存在更大的风险。这些用户是密码哈希研究人员,他们可能会认为高清数据内容中的哈希冲突比普通joe更有可能,仅仅是因为他们试图制造这种冲突。

因此,如果成为重复数据删除的文件系统或备份系统,并且密码哈希研究人员利用它,两个不同数据块发生冲突哈希的风险要比普通joe大。

评论


$ \ begingroup $
如另一条评论中所述,增加碰撞可能性的任何成功都将破坏哈希。因此,您正在猜测研究人员可以破解哈希的可能性,而不是冲突的可能性。 crypto.stackexchange.com/questions/1170/…
$ \ endgroup $
–布伦特
20 Dec 25 '21:26

#3 楼

要有大约50%的碰撞机会,您需要$ 2 ^ {128} $个数据块。这来自生日问题。您是否期望您的清单那么大?我会对此表示怀疑,因为那将是一个天文数字的数据(远远超过PB)。

话说回来,MD5的碰撞也不太可能是碰撞对于SHA-256,那么做双重哈希操作可能会很好,但是如果您担心碰撞,为什么不直接使用SHA-384(或SHA-512)呢?

评论


$ \ begingroup $
感谢您的答复。我想我的问题是:SHA-384是否比SHA-256和MD-5组合更好?是的,我确实预期会有大量的数据块。假设有$ 2 ^ {64} $个区块,这是否意味着发生碰撞的可能性为25%?
$ \ endgroup $
– Theodor Kleynhans
2011年11月11日15:10



$ \ begingroup $
不,对于$ 2 ^ {64} $个块,大约有$(2 ^ {64})^ 2/2 ^ {256} = 2 ^ {-128} \约3 * 10 ^ {-仅使用SHA-256作为散列,发生冲突的概率为39}%。我认为,这种可能性非常低,因此不值得再做任何事情。
$ \ endgroup $
–雨披
2011年11月11日15:19



$ \ begingroup $
@TheodorKleynhans,看起来像大猩猩答案中指出的SHA-384比SHA-256 + MD5更好。 :)而且,$ 2 ^ {64} $大约是一个Exbibyte。您甚至预期会有这么多存储空间吗?
$ \ endgroup $
–mikeazo
2011年11月11日17:16



$ \ begingroup $
@Theodor:对于随机碰撞,简单地看一下组合输出大小$ n $(以位为单位)就足够了:您需要大约$ 2 ^ {n / 2} $块才有机会。由于$ 256 + 128 = 384 $,概率完全相同。如果您担心攻击者会进行恶意冲突,请避免MD5的冲突抗性被破坏,并避免串联不同的哈希函数,例如Thomas的回答。
$ \ endgroup $
–PaŭloEbermann
2011年11月12日在2:36



$ \ begingroup $
SHA-384比SHA-256和MD-5组合要好得多。首先,它甚至比单独使用SHA-256还要快(在现代硬件上,假设大多数散列都在32字节以上的对象上)。其次,由于MD5的弱点,每个SHA-512位要比每个MD5位要强,因此它的安全性可能比SHA-256和MD5更好。您提议将SHA位换成MD5位,这显然是个失败的主张。 (这无关紧要。这就像太阳会在100亿年还是150亿年内燃烧掉。)
$ \ endgroup $
– David Schwartz
2011年11月13日4:24



#4 楼

几乎没有冲突的风险,但是作为一个好的软件开发人员,请编写您的代码来处理它:

如果哈希值相等,则比较块长度,如果哈希值相等,则逐字节比较块,并且如果它们不同或长度不同,则1)增加一个在哈希ID末尾连接的整数计数器(在其他任何地方应该为0),2)记录日志,3)获利。

CPU密集型部分是比较,但是不用担心,它仅在重复的情况下才会发生,即使比较字节也应是轻量级的。通过选择CRC32作为哈希函数来测试代码。

编辑:不要低估密码研究,没有人可以保证在5年内不会找到冲突,因此请保护自己免受攻击恶意用户以及大猩猩。

评论


$ \ begingroup $
如果发生恶意冲突,则通过创建哈希冲突来构建一个非常慢的哈希图,可能导致拒绝服务攻击。
$ \ endgroup $
–PaŭloEbermann
2012-12-26 at 0:44



$ \ begingroup $
@PaŭloEbermann:的确如此,但是建议的另一种说法将使备份的数据混乱,这更糟!
$ \ endgroup $
– jimis
2012-12-26 19:05:

$ \ begingroup $
我认为对DoS的关注在很大程度上不重要;它要求某人找到许多SHA-256冲突(目前尚不知道),即使如此,DoSing仍受用户可以上传块的速度的严格限制。即使在将来的某个时刻,许多SHA-256冲突都为人所知,您也有足够的时间对其做出反应-这些冲突不会一次全部变为可用,即使如此,上传速度也会受到限制将给您时间做出反应。只需每隔一段时间对数据库中的冲突计数进行一次检查,您可能会好起来的。
$ \ endgroup $
–乔纳森·林斯塔德(Jonathan Ringstad)
2014年7月26日14:56



$ \ begingroup $
@Amadiro SHA-256容易受到长度扩展攻击。一旦发现1个碰撞,就可以将其用作前缀来产生无限的碰撞。 DoS风险是真实的!
$ \ endgroup $
– Navin
17年3月13日在11:10

$ \ begingroup $
@Navin意味着比较长度(相等)后,从最后一个字节开始逐个字节进行比较会更有效率
$ \ endgroup $
– nitzel
20年1月2日,15:12