SHA1碰撞演示/示例

时间:2010-08-13 09:41:38

标签: hash sha1

此问题类似于this,但该问题仅引用了MD5碰撞演示。

到目前为止,是否已知任何实际的SHA1冲突对任意消息?

我想用这些来测试各种软件产品(我自己的和第三方)如何处理它。

进行一些谷歌搜索只发现了如此突出的MD5 / SHA0碰撞和一些创建SHA1碰撞的方法的提示,但我无法抓住任何示例。

5 个答案:

答案 0 :(得分:31)

  

截至2017年2月23日,此答案不再准确。

     

For more than six years, the SHA1 cryptographic hash function underpinning Internet security has been at death's door. Now it's officially dead, thanks to the submission of the first known instance of a fatal exploit known as a "collision."

SHA-1还没有已知的冲突。现在:

  • 在SHA-1的简化版本上存在一些冲突,少于标准SHA-1的80轮。
  • 已经描述了一种算法,其中应该获得SHA-1冲突,其计算工作大致相当于对小消息的SHA-1的2 63 调用;这比通用算法(平均需要2次 80 调用)要好得多,但这仍然很大,而且算法还没有运行。

有一个努力通过利用来自有一些备用CPU时钟周期捐赠的人来获得SHA-1冲突,用BOINC框架组织整个事情,但没有足够的志愿者和努力在去年被放弃了。因此还没有真正的SHA-1碰撞。

理论上的攻击依赖于一些可能被证明有点虚假的假设;例如,对MD5的攻击实际上比预期的要快一些(在某些时候,必须满足一个属性,理论概率为2 -28 ,但在实践中它更像是2 -27.7 ,即攻击比预测的快20%)。仍然认为理论攻击是正确的,复杂性“相当准确”。

答案 1 :(得分:9)

Google的安全博客描述了第一次公开的,有意的SHA-1碰撞: https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html

直接链接到2张具有相同SHA-1的PDF(来自site dedicated to this finding):

同样,Marc Stevens与CWI阿姆斯特丹和一些谷歌员工一起参与,但这次是关于两个构建的PDF的全面SHA-1。

Stevens also notes由于SHA-1 Merkle-Damgård construction,两个PDF都可以使用相同的任意数据进行扩展(追加),以生成更长版本的同一摘要哈希值。

谷歌显然会在90天后(2017年2月23日)发布附带的源代码,让受影响的系统供应商有时间更新他们的内容。

像GitHub这样的git和服务提供商等软件将如何处理这一点仍有待观察,特别是在向后兼容性方面。

Linus Torvalds已issued a statement regarding git,并指出他们会以兼容的方式迁移到更新的哈希,但这需要时间。

顺便说一下,"破碎了#34;碰撞演示不会影响git(没有修改),因为它使用像这样的SHA-1:

sha1("blob " + <size in octets as text> + "\0" + <contents>)

你可以使用git hash-object <file path>获取git哈希值,即使该文件不在git中。

在此版本的related news, Subversion seems to be the first real victim中,导致存储库损坏,从而使上述文件成为实用漏洞。

- 以前...... -

76-round collision找到Marc Stevens

密码学家Jean-Philippe Aumasson,BLAKESipHash的共同创建者以及Password Hashing Competition (PHC)的发起人,在完整的80轮will have been found by 2020中猜测了SHA-1碰撞

根据ongoing research by Marc Stevens et al. published in October 2015

  

...我们估计SHA-1碰撞成本今天(即2015年秋季)之间    75K $和120K $ 在几个月内租用Amazon EC2云计算。   相比之下,安全专家布鲁斯施奈尔此前曾预测过   到2018年,SHA-1碰撞成本约为173K $。

他们还描述了SHA-1压缩功能的碰撞攻击。

答案 2 :(得分:7)

第一次已知的碰撞现已发布在https://shattered.it/

答案 3 :(得分:3)

2005年,Wang,Yin和Yu在Collision Search Attacks on SHA1论文中有一个例子,但仅仅是针对SHA-1弱化的58轮版本。 (完整的官方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. 

答案 4 :(得分:2)

不完全是SHA1碰撞, 但是PBKDF2-HMAC-SHA1消息摘要认证码存在冲突。

例如,两个密码plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmdeBkXQTfuBqp\'cTcar&g*,盐hunter24迭代的PBKDF2(SHA1,密码,盐,迭代,dkLen)提供了相同的值(dkLen 35d1c8f259129dc800ec8e073bb68f995424619c20)。

事实上,为长度超过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'\x8c\xbf8\x94\xbc\xf4\xbe\x90xT,r\xbc\x03\xd1\xed\xd9\xea\xfb\x9f', 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"\xcf\xc5\xee\x15=\r\x0b\x0e\x89r\x9b\xe1\xb7'+\xa4'o\x98kn++u\x12\xec\xd9\xec\xea\xebL\xb7"
>>> h2 = pbkdf2_hmac('sha256', b'.\x83\xb0D\x93D\x9f\x162\xf3\xd4x\xb6\x1a\x9f-\x1f\xdb\xdc\xa4\x8f\xb3\x95Y5\xea\x99*\x97\x00V\x81', b'NaCl', 1000000)
>>> h1 == h2
True

这一切都发生了,因为从PBKDF2定义来看,对于长字符串,它包含:
PBKDF2(hashalgo, s, ...) == PBKDF2(hashalgo, hashalgo(s), ...)

更多信息,例如在这里:https://mathiasbynens.be/notes/pbkdf2-hmac