腻害!第一例SHA-1哈希碰撞实例

2017年2月23日,荷兰阿姆斯特丹 Centrum Wiskunde & Informatica (CWI) 研究所和 Google 公司的研究人员 [Marc Stevens (CWI Amsterdam), Elie Bursztein (Google), Pierre Karpman (CWI Amsterdam), Ange Albertini (Google), Yarik Markov (Google), Alex Petit Bianco (Google), Clement Baisse (Google)] 在谷歌安全博客上发布了世界上第一例公开的 SHA-1 哈希碰撞实例!在经过两年的联合研究和花费了巨大的计算机时间之后,研究人员在他们的研究网站SHAttered上给出了两个内容不同,但是具有相同 SHA-1 消息摘要的 PDF 文件,这就意味着在理论研究长期以来警示 SHA-1 算法存在风险之后,SHA-1 算法的实际攻击案例也浮出水面,同时也标志着 SHA-1 算法终于走向了生命的末期。

相关背景

MD-SHA 系列 Hash 函数家族是最为知名的 Hash 函数家族,MD5,SHA-1 和 SHA-2 都被广泛的使用过。1990 年 MD4 算法被提出,但是被很快发现了严重的安全问题,在 1992 年被 MD5 算法取代。MD5 算法在之后的十几年内被软件行业广泛使用,直到 2004 年我国密码学家王小云在国际密码讨论年会(CRYPTO)上展示了 MD5 算法的碰撞并给出了第一个实例(《Collisions for hash functions MD4, MD5, HAVAL-128 and RIPEMD,rump session of CRYPTO 2004,How to Break MD5 and Other Hash Functions,EuroCrypt 2005》)。该攻击复杂度很低,在普通计算机上只需要几秒钟的时间。在 2005 年王小云教授与其同事又提出了对 SHA-1 算法的碰撞算法(《Finding Collisions in the Full SHA-1, CRYPTO 2005》),不过计算复杂度为 2 的 69 次方,在实际情况下难以实现。

在现实世界中,利用 Hash 碰撞的真实案例确确实实发生在我们身边:

2008年的Chaos Communication Congress大会上,研究人员展示了利用MD5碰撞来伪造合法CA证书,从而攻破HTTPS的安全体系。

2012年在中东大范围爆发的火焰(Flame)病毒,包含了一个伪造的数字签名,就是利用MD5碰撞伪造了合法的微软签名来逃避杀毒软件的查杀。

攻击历程

本次攻击的关键先生是荷兰阿姆斯特丹 CWI 研究所的 Marc Stevens,他自 2006 年以来一直在 Hash 算法的研究领域发表了大量令人艳羡的成果,包括一系列关于 MD5 算法的攻击。2009 年他作为一作的论文 《Short chosen-prefix collisions for MD5 and the creation of a rogue CA certificate 》在当年的 CRYPTO 上获得了最佳论文奖,在 2013 年的 Eurocrypt 上,他发表了一篇论文——《New collision attacks on SHA-1 based on optimal joint local-collision analysis》,提出了构造 SHA-1 碰撞的一种新的攻击方法(攻击复杂度为 2 的 61 次方,随后又提出了基于 GPU 的高效实现方法),随后数年不断提出了新的改进方法,在 2016 年他给出了关于 SHA-1 算法的 Freestart collision,也就是找到了 SHA-1 算法内部的核心组件 internal compression function 的一个碰撞实例(64 GPU 集群,10 天计算量),这就已经吹响了攻克 SHA-1 完全实际碰撞攻击的决战号角。终于,在 Google 公司强有力的计算资源支持之下,在 2017 年 2 月 23 日,SHA-1 算法的碰撞实例出现在我们面前!

此次攻击到底使用了多强的计算资源,我们可以看一下谷歌安全博客给出的原始数据:

  • Nine quintillion (9,223,372,036,854,775,808) SHA1 computations in total
  • 6,500 years of CPU computation to complete the attack first phase
  • 110 years of GPU computation to complete the second phase

可以看到,这样如此强劲的计算能力几乎是历史上最大规模的一次计算 Hash 碰撞的实验。谷歌安全博客还专门配了一幅图来比较,如果使用暴力搜索,使用的计算资源即使是 Google 也无法承担,而在人类智慧的研究之下,改进的 Shattered 算法只需要 110 个 GPU 年就可以完成第二阶段的搜索任务。

关于攻击的更多细节,可以参考论文——《The first collision for full SHA-1》。关于这篇论文,还有很多幕后的八卦,LoCCS 实验室理论密码研究组长期从事分组加密算法研究的王磊研究员曾与 Marc Stevens 合家聚餐,亲切交谈,并与本次工作的作者之一 Pierre Karpman 长期合作交流,王磊老师告诉我们,他目睹了这个密码学历史性事件的诸多进展,这个轰动性结果甚至让今年某顶级学术会议的 Deadline 为之延期!!!

安全建议

我们指出,SHA-1 碰撞攻击影响了大量现有的安全应用。

目前许多部署的 SSL/TLS 服务连接中均使用了 SHA-1 算法作为消息验证的基本密码学原语,因此受到该攻击的影响;流行的源代码管理系统 Git 直到目前依然使用 SHA-1 作为文件的消息“指纹”。

另外一个广泛受到影响的场景是 Android 系统中应用、升级包、Bootloader 等模块的签名机制(RSA + SHA-1),虽然 Android 7.0 给出的全新的签名方案 APK Signature Scheme v2 中支持 SHA-2 家族的 SHA-256 和 SHA-512,但经过我们的验证,目前大量设备仍然在使用 sha1withRSA 的签名验证。在碰撞攻击的影响下,攻击者能够构造出内容篡改但是签名一致的文件绕过验证。尽管计算量巨大且对内容的控制存在一定的困难,但是我们认为这类安全机制已经不再可信。

Google 公司和诸多 IT 安全研究人员均在过去几年呼唤开发者尽快更换 SHA-1 算法,早在 2014 年,Chrome 团队就已经宣布了淘汰 SHA-1 算法的时间表,本次碰撞实例的发布,也给所有还在持观望和犹豫态度的人敲响了警钟:赶紧为安全的系统启用新的 Hash 算法!

事实上,SHA-1 算法的后继算法早就已经被研究人员设计和推广,SHA-2 算法家族(包括六种 Hash 函数:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256)在 2001 年就已经公布,而 NIST 在经过多年的 SHA-3 设计竞赛后,在 2015 年正式推荐由著名的密码学研究人员 Guido Bertoni, Joan Daemen, Michal Peeters 和 Gilles Van Assche 共同设计的 Keecak 算法家族作为 SHA-3 的候选算法。更为值得注意的是,中国国家密码管理局同样在 2010 年底发布了我国自主的国密 SM3 消息摘要(密码杂凑)算法。这些算法的安全性在目前经受住了广泛的测试和分析,是值得信赖的。所以,文章的最后,GoSSIP 小组建议大家:任何以 SHA-1 作为消息摘要算法的安全产品应该尽快更换至这些更为安全的 Hash 算法。

原文地址:http://www.linuxprobe.com/event-first-hash.html

时间: 2024-10-13 11:22:04

腻害!第一例SHA-1哈希碰撞实例的相关文章

C语言程序设计百例之第一例

题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 2.程序源代码: #include <stdio.h> int main(void) { int nFirst, nSecond, nThird; int threeNum; int countNum = 0; for(nFirst = 1; nFirst < 5; nFirst++) for(nSe

Hibernate 第一例

简单的hibernate例子,不涉及jsp页面,直接java代码运行 java类:HibernateUtil ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 package dao; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil {         

PythonQt第一例

pythonQt第一例源码如下,主要介绍了简单的使用方式,需要注意的是应用程序的debug版本和release版本必须使用同类型的PythonQt库不可交叉使用. 源码地址:http://files.cnblogs.com/files/zhangzhiming/pythonQt_test.zip 源码中没有PythonQt库,需要的同学请留邮箱或者私信我,谢谢. 原文地址:http://www.cnblogs.com/zhangzhiming/p/5408582.html 技术分享QQ群:527

24-哈希碰撞攻击是什么?

24-哈希碰撞攻击是什么? 最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本原理 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储上下文环境信息(执行上下文的变量及函数均使用哈希表结构存储). 理想情况下哈希表插入和查找操作的

Vs自定义控件设计第一例(直线控件的设计)

目录 一. 杨老师是个热情的人 二. 开始喽 三. 还需要些解释什么吗 四. OK了吗 五.最终代码 一.杨老师是个热情的人 我们的项目开源有一段时间了,我一直以为我有一个很不错的胸怀把自己花了很多精力做出来的项目贡献出来了,我以为同学们会很开心,会像“一个饥饿的人看到面包”一样的扑到了我的项目代码上面快乐的研究起来,但是事实上我们的群里面却异常的冷清.我想应该是大家都还在研究代码来不及说话或者是不爱说话吧,直到今天杨老师给我打电话,说了一些情况,似乎是说大家还不太懂数据库等等,我才知道是我错了

早晨训练赛第一场 B题 哈希

早晨训练赛第一场 B题 B - Trees in a Row Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 402B Description The Queen of England has n trees growing in a row in her garden. At that, the i-th (1 ≤ i 

例27:哈希查找

哈希查找本身听着很是高端,然后呢,听着感觉很难的样子,但是其原理也是非常简单,其实他的意思就是说通过一个函数,直接把值的地址与值本身之间关联起来,成为一个地址 = F(值)的函数,所以这种方式的查找速度为O(1),是一种很快的查找方式. 1.在查找之前首先先建立哈希表,其实就是按照 地址=F(值) 函数给出值所应存储的地址.常用的哈希函数有五种:直接定址法,除数取余法,数字分析法,平方取中法,折叠法.具体方法此处不详细介绍了,读者可以上网搜索一下,很多介绍很详细的. 2.如果此地址已经保存了某个

第一例

题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序: s=0for i in range(1,5):     for j in range(1,5):          for k in range(1,5):                  if i!=j and i!=k and j!=k:                            s=s+1                            print(i*100+j*0+k)p

自动化运维第一例

#!/bin/bash service iptables stop chkconfig iptables off setenforce 0 dhclient &>/dev/null echo "dhclient is ok" rm -rf /etc/ssh/ssh_host_* a=`ip addr | grep eth0 |wc -l` b=`ip addr | grep eth1 |wc -l` if [ $a -ne 0 ] ;then echo -e  "