在使用MD5哈希时,要避免碰撞的可能性,字符串长度最长可以达到多少?
这应该通过对特定字符集中所有可能的字符串进行哈希计算,逐渐增加字符串长度,直到出现第二次哈希(冲突)为止。然后,没有发生冲突的最大字符串长度将比冲突对中较长的字符串长度少一个字符。
MD5、SHA1等算法是否已经进行过这样的测试?
在使用MD5哈希时,要避免碰撞的可能性,字符串长度最长可以达到多少?
这应该通过对特定字符集中所有可能的字符串进行哈希计算,逐渐增加字符串长度,直到出现第二次哈希(冲突)为止。然后,没有发生冲突的最大字符串长度将比冲突对中较长的字符串长度少一个字符。
MD5、SHA1等算法是否已经进行过这样的测试?
具有讽刺意味的是,我在发表上一个答案几周后,两位中国研究人员谢涛和冯登国发布了MD5的新单块碰撞。直到现在,我才知道这篇论文。单个MD5块意味着输入大小为64字节或512位。请注意,这些输入大部分相同,只有2个比特位不同。
他们的方法将于2013年1月发表,但可以使用论文中的数字来验证他们的碰撞:
>>> from array import array
>>> from hashlib import md5
>>> input1 = array('I', [0x6165300e,0x87a79a55,0xf7c60bd0,0x34febd0b,0x6503cf04,
0x854f709e,0xfb0fc034,0x874c9c65,0x2f94cc40,0x15a12deb,0x5c15f4a3,0x490786bb,
0x6d658673,0xa4341f7d,0x8fd75920,0xefd18d5a])
>>> input2 = array('I', [x^y for x,y in zip(input1,
[0, 0, 0, 0, 0, 1<<10, 0, 0, 0, 0, 1<<31, 0, 0, 0, 0, 0])])
>>> input1 == input2
False
>>> md5(input1).hexdigest()
'cee9a457e790cf20d4bdaa6d69f01e41'
>>> md5(input2).hexdigest()
'cee9a457e790cf20d4bdaa6d69f01e41'
更新:该论文已于2013年3月发表:Tao Xie和Fanbao Liu和Dengguo Feng - MD5上快速碰撞攻击
然而,如果您有更多的空间来玩耍,几千字节大小的碰撞计算速度会更快--它们可以在任何普通计算机上在几小时内计算出来。
以前至少使用了两个MD5块长度的输入来生成最短碰撞(128字节,1024位)。攻击者可以任意选择第一个块中的前缀,其余部分将被计算并显示为无意义的字符。
以下是两个不同碰撞输入的示例,您可以尝试在Python中运行:
>>> from binascii import unhexlify
>>> from hashlib import md5
>>> input1 = 'Oded Goldreich\nOded Goldreich\nOded Goldreich\nOded Go' + unhexlify(
... 'd8050d0019bb9318924caa96dce35cb835b349e144e98c50c22cf461244a4064bf1afaecc582'
... '0d428ad38d6bec89a5ad51e29063dd79b16cf67c12978647f5af123de3acf844085cd025b956')
>>> len(input1)
128
>>> md5(input1).hexdigest()
'd320b6433d8ebc1ac65711705721c2e1'
>>> input2 = 'Neal Koblitz\nNeal Koblitz\nNeal Koblitz\nNeal Koblitz\n' + unhexlify(
... '75b80e0035f3d2c909af1baddce35cb835b349e144e88c50c22cf461244a40e4bf1afaecc582'
... '0d428ad38d6bec89a5ad51e29063dd79b16cf6fc11978647f5af123de3acf84408dcd025b956')
>>> md5(input2).hexdigest()
'd320b6433d8ebc1ac65711705721c2e1'
在215个Playstation 3节点群集上,Mark Stevens用了2天时间生成这两个特定的输入:)
生日悖论的数学使得碰撞概率的拐点大约在sqrt(N)处,其中N是哈希函数中不同bin的数量,因此对于一个128位哈希,当你达到大约64位时,你有相当大的可能性会有1次碰撞。所以我的猜测是对于完整的8字节字符串集合,有一定的碰撞可能性,对于9字节字符串,这种可能性非常高。
编辑:这假设MD5哈希算法导致输入bytestring到输出哈希的映射接近“随机”(与将字符串更均匀地分布在可能哈希集合中的情况相比,其中情况更接近16字节)。
此外,对于更具体的数字答案,如果您查看其中一种近似值来计算碰撞概率,则可以得到
p(k) ≈ 1 - e-k(k-1)/(2*2128),其中k = 可能输入空间的大小= 2m,其中输入bytestring长度为m位。
8字节字符串集合:p(264) ≈ 1 - e-0.5 ≈ 0.3935
一组由9个字节字符串组成:p(272) ≈ 1 - e-2144/(2*2128) = 1 - e-215 = 1 - e-32768 ≈ 1。
此外,请注意这些假设使用了完整的 m/8 字节字符串集合。如果您只使用字母数字字符,则需要更多字节才能获得可能的碰撞。
我怀疑在任何有用的长度范围内,都可能存在冲突。这些算法并不是真正用于此目的。它旨在尝试为数据中的轻微更改(如损坏的文件)提供唯一性,而不是针对所有可能的数据集提供唯一性。
256 / log2(62)
),这意味着所有43个字符的字母数字字符串的排列都将散列到所有可能的SHA-256哈希值,包括每个长度更长的字符串的哈希值。 - Nicole