SHA1碰撞演示/示例

这个问题与此类似,但只提到了MD5碰撞演示。 到目前为止,是否已知任何实际的SHA1冲突对任意消息? 我想用这些来测试各种软件产品(我自己的和第三方)如何处理它。 做一些谷歌搜索只发现了如此突出的MD5 / SHA0碰撞和一些创建SHA1碰撞的方法的提示,但我无法得到任何例子。     
已邀请:
第一个已知的碰撞现已发布在https://shattered.it/     
  截至2017年2月23日,此答案已不再准确。      六年多来,支撑互联网安全的SHA1加密哈希函数一直处于死亡之门。现在它正式死了,这要归功于第一个已知的致命漏洞被称为“碰撞”的实例。 SHA-1还没有已知的冲突。马上: 减少版本的SHA-1存在一些冲突,少于标准SHA-1的80轮。 已经描述了一种算法,该算法应该获得SHA-1冲突,其计算工作量大致相当于对小消息的263次SHA-1调用;这比通用算法(平均需要280次调用)好得多,但仍然很大,而且算法尚未运行。 有人试图通过利用拥有一些备用CPU时钟周期捐赠的电力来获得SHA-1冲突,BOINC框​​架可以组织整个事情,但是没有足够的志愿者并且去年放弃了努力。因此还没有实际的SHA-1碰撞。 理论上的攻击依赖于某些假设,这些假设可能被证明是轻微的错误;例如,对MD5的攻击实际上比预期的要快一些(在某些时候,必须满足一个属性,理论概率为2-28,但实际上它更像是2-27.7,即攻击比预测的快20%)。仍然认为理论攻击是正确的,复杂性“相当准确”。     
谷歌的安全博客描述了第一次公开的,有意的SHA-1碰撞: https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html 直接链接到具有相同SHA-1的2个PDF(来自专用于此发现的站点): https://shattered.it/static/shattered-1.pdf https://shattered.it/static/shattered-2.pdf 同样,Marc Stevens与CWI阿姆斯特丹和一些Google员工一起参与,但这次是关于两个构建的PDF的全面SHA-1。 史蒂文斯还指出,由于SHA-1的Merkle-Damgård结构,两个PDF文件都可以扩展(附加)相同的任意数据,以生成更长版本的同一摘要。 从现在起(2017年2月23日),Google显然会在90天后发布附带的源代码,让受影响的系统供应商有时间更新他们的内容。 Git和GitHub等服务提供商之类的软件如何处理这一问题还有待观察,特别是在向后兼容性方面。 Linus Torvalds发表了关于git的声明,并指出他们将以兼容的方式迁移到更新的哈希,但这需要时间。 顺便说一句,“破碎”的碰撞演示不会影响git(没有修改),因为它使用SHA-1,如下所示:
sha1("blob " + <size in octets as text> + "" + <contents>)
即使文件不在git中,你也可以使用
git hash-object <file path>
获取git哈希。 在相关新闻中,Subversion似乎是这个证明的第一个真正的受害者,导致存储库损坏,从而使所提到的文件成为实用的漏洞。 - 以前...... - 马克史蒂文斯发现76轮的碰撞。 BLAKE和SipHash的联合创始人兼密码哈希竞赛(PHC)的发起人密码学家Jean-Philippe Aumasson猜测到2020年将发现全部80轮的SHA-1碰撞。 根据Marc Stevens等人正在进行的研究。 2015年10月出版,   ......我们估计今天(即2015年秋季)之间的SHA-1碰撞成本   在几个月内租用亚马逊EC2云计算75K $和120K $。   相比之下,安全专家布鲁斯施奈尔此前曾预测过   到2018年,SHA-1碰撞成本约为173K $。 他们还描述了SHA-1压缩功能的碰撞攻击。     
从2005年开始,Wang,Yin和Yu在SHA1论文的碰撞搜索攻击中有一个例子,但仅适用于弱轮廓的58轮SHA-1版本。 (完整的官方SHA-1执行80发。)
3 A collision example for 58-step SHA1

         h₁ = compress(h₀,M₀) = compress(h₀,M'₀)
 _____________________________________________________
   h₀:  67452301 efcdab89 98badcfe 10325476 c3d2e1f0
 _____________________________________________________
   M₀:  132b5ab6 a115775f 5bfddd6b 4dc470eb
        0637938a 6cceb733 0c86a386 68080139
        534047a4 a42fc29a 06085121 a3131f73
        ad5da5cf 13375402 40bdc7c2 d5a839e2
 _____________________________________________________
   M'₀: 332b5ab6 c115776d 3bfddd28 6dc470ab
        e63793c8 0cceb731 8c86a387 68080119
        534047a7 e42fc2c8 46085161 43131f21
        0d5da5cf 93375442 60bdc7c3 f5a83982
 _____________________________________________________
   h₁:  9768e739 b662af82 a0137d3e 918747cf c8ceb7d4
 _____________________________________________________

Table 2: A collision of SHA1 reduced to 58 steps. The two
messages that collide are M₀ and M'₀. Note that padding
rules were not applied to the messages. 
    
不完全是SHA1碰撞, 但是存在PBKDF2-HMAC-SHA1消息摘要认证码的冲突。 例如,两个密码
plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd
eBkXQTfuBqp'cTcar&g*
,盐
hunter2
4
迭代的PBKDF2(SHA1,密码,盐,迭代,dkLen)提供相同的值(对于dkLen
20
35d1c8f259129dc800ec8e073bb68f995424619c
)。 实际上,对于长度超过64字节的字符串发现此类冲突是微不足道的。 另一个碰撞示例(Python3):
>>> import hashlib, binascii
>>> def pbkdf2sha1hex(x, salt, iters):
...     h = hashlib.pbkdf2_hmac('sha1', x, salt, iters)
...     return binascii.hexlify(h)
>>> pbkdf2sha1hex(b'http://stackoverflow.com/questions/3475648/sha1-collision-demo-example/31136714', b'NaCl', 1000000)
b'20177527e04e05d5e7b448c1ab2b872f86831d0b'
>>> pbkdf2sha1hex(b'x8cxbf8x94xbcxf4xbex90xT,rxbcx03xd1xedxd9xeaxfbx9f', b'NaCl', 1000000)
b'20177527e04e05d5e7b448c1ab2b872f86831d0b'
请注意,同样的“问题”也适用于PBKDF2-HMAC-SHA256:
>>> h1 = pbkdf2_hmac('sha256', b'http://stackoverflow.com/questions/3475648/sha1-collision-demo-example/31136714', b'NaCl', 1000000)
b"xcfxc5xeex15=rx0bx0ex89rx9bxe1xb7'+xa4'ox98kn++ux12xecxd9xecxeaxebLxb7"
>>> h2 = pbkdf2_hmac('sha256', b'.x83xb0Dx93Dx9fx162xf3xd4xxb6x1ax9f-x1fxdbxdcxa4x8fxb3x95Y5xeax99*x97x00Vx81', b'NaCl', 1000000)
>>> h1 == h2
True
这一切都发生了,因为从PBKDF2定义来看,对于长字符串,它包含:
PBKDF2(hashalgo, s, ...) == PBKDF2(hashalgo, hashalgo(s), ...)
。 更多信息例如这里:https://mathiasbynens.be/notes/pbkdf2-hmac     

要回复问题请先登录注册