此问题类似于this,但该问题仅引用了MD5碰撞演示。
到目前为止,是否已知任何实际的SHA1冲突对任意消息?
我想用这些来测试各种软件产品(我自己的和第三方)如何处理它。
进行一些谷歌搜索只发现了如此突出的MD5 / SHA0碰撞和一些创建SHA1碰撞的方法的提示,但我无法抓住任何示例。
答案 0 :(得分:31)
截至2017年2月23日,此答案不再准确。
SHA-1还没有已知的冲突。现在:
有一个努力通过利用来自有一些备用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;破碎了#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,BLAKE和SipHash的共同创建者以及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消息摘要认证码存在冲突。
例如,两个密码plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd
和eBkXQTfuBqp\'cTcar&g*
,盐hunter2
,4
迭代的PBKDF2(SHA1,密码,盐,迭代,dkLen)提供了相同的值(dkLen 35d1c8f259129dc800ec8e073bb68f995424619c
为20
)。
事实上,为长度超过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