Friday, August 18, 2017

为什么Google急着杀死加密算法SHA-1

哈希算法的希尔伯特曲线图(由Ian Boyd提供)

Google官方博客宣布,将在Chrome浏览器中逐渐降低SHA-1证书的安全指示。但有意思的是Google.com目前使用的也是SHA-1签名的证书,但证书将在3个月内过期,Google将从2015年起使用SHA-2签名的证书。SHA-1算法目前尚未发现严重的弱点,但伪造证书所需费用正越来越低。

概述

大部分安全的网站正在使用一个不安全的算法,Google刚刚宣称这将是一个长周期的紧急情况。

大约90%采用SSL加密的网站使用SHA-1算法来防止自己的身份被冒充。当你去访问网址时,保证了你正在访问的确实是正品Facebook,而不是把自己的密码发送给攻击者。然而不幸的是,SHA-1算法是非常脆弱的,长期以来都是如此。该算法的安全性逐年降低,却仍然被广泛的应用在互联网上。它的替代者SHA-2足够坚固,理应被广泛支持。

最近谷歌声明如果你在使用Chrome浏览器,你将会注意到浏览器对大量安全的网站的警告会不断发生变化。

证书有效期至2017年的站点在Chrome中发生的变化

首批警告会在圣诞节之前出现,并且在接下来6个月内变得越来越严格。最终,甚至SHA-1证书有效期至2016的站点也会被给予黄色警告。

通过推出一系列警告,谷歌这正在宣布一个长周期的紧急情况,并督促人们在情况恶化之前更新他们的网站。这是件好事情,因为SHA-1是时候该退出历史舞台了,而且人们没有足够重视SHA-1的潜在风险。

如果你拥有一个使用SSL的网站,你可以使用我创建的SHA-1测试小工具来测试你的网站,它会告诉你应该怎么做。即使你没有网站,我仍然推荐你去读一读。在接下来的博文,我会介绍网站上SSL和SHA-1是如何一起工作的,为什么如谷歌说的那么紧急,和浏览器正在采取的措施。

同样重要的是,安全社区需要让证书更换过程少些痛苦和麻烦,因为网站的安全升级不必那么紧急和匆忙。

FreeBuf科普:安全散列算法与SHA-1

安全散列算法(英语:Secure Hash Algorithm)是一种能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高;而SHA是FIPS所认证的五种安全散列算法。这些算法之所以称作“安全”是基于以下两点(根据官方标准的描述):

1、由消息摘要反推原输入消息,从计算理论上来说是很困难的。
2、想要找到两组不同的消息对应到相同的消息摘要,从计算理论上来说也是很困难的。任何对输入消息的变动,都有很高的机率导致其产生的消息摘要迥异。

SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数。

SHA-1简介 

要理解替换SHA-1为什么这么重要,首先把自己站在一个浏览器的角度上。

当你访问一个使用的网站,该网站向浏览器出示一个文件(类似于我们的身份证)即一个SSL证书。这个证书用来做两件事:加密访问网站的连接,并验证网站真实身份。

任何证书都可以用来加密连接。但是为了验证你访问的是真实的Facebook(不是山寨的),你的浏览器必须通过某种方式决证书是否可信的,然后再向你显示一个绿色的小锁。

为了完成验证工作,你的浏览器查明网站的证书是否由权威机构(证书签发机构,简称“CA”)颁发的。CA向网站颁发证书文件通常是收费的。你的浏览器信任来自超过56个CA(根CA)创建和担保的证书,如Verisign、GoDaddy、美国国防部等,还有经由56个根CA的授权的成千上万的中间CA。如你所料,这是一个有很大缺陷的系统,但确实是实际情况。

在Chrome中点击网址前面的绿色小锁时所显示的内容

此网站的CA在当时是Comodo,通过Namecheap购买的。当网站的SSL证书宣称是自己由某个CA颁发给该网站时,你的浏览器需要进行另一项关键的测试:此证书本身能够证明这个事实吗?

普遍情况下,互联网通过数学来证明事实。当一个证书被颁发时,CA通过使用一个私钥签名该证书提供了身份证明。从某种程度上说,只有真正的CA能够完成这个签名(除非私钥丢了,哈哈,我经常丢钥匙),而浏览器能够验证该签名。

但是CA实际上不签名原始的证书:它首先运行“单向散列”算法(如MD5、SHA-1、SHA-256)把证书压缩成一个唯一的字段。

Chrome浏览器中的证书片段

单向哈希算法能够压缩信息:例如,把《战争与和平》3.2MB版本通过SHA-1运算,你将得到:

baeb2c3a70c85d44947c1b92b448655273ce22bb

MD5file.com(一个有趣的在线哈希计算器)的运算结果

类似SHA-1,单向哈希算法被用来产生唯一的不可逆的数据块(原文为slug,弹头的意思)。你不能够再从aeb2c3a70c85d44947c1b92b448655273ce22bb反推出《战争与和平》的内容(即哈希运算不可逆)。同样重要的是,没有其他文件能够产生相同的数据块(即指纹具有唯一性)。甚至内容修改一小部分也会导致SHA-1运算的结果发生很大的变化,难以寻找前后的关联性。

如果两个文件经过同一个哈希运算生成相同的值,这种现象被称作是一个“碰撞”。碰撞具有理论上的可能性,但概率过低而被认为是在现实中是不可能存在的。

当浏览器遇到一个证书时,它会计算证书信息的SHA-1值,然后与被证书用作身份证明的原始SHA-1值作比较。因为SHA-1结果的唯一性,如果两个值是相同的,浏览器就确信提供的证书和CA签发的证书是同一个,没有经过篡改。

如果你设计了一个证书,能够与目标站点的证书发生碰撞,然后再诱骗CA给你颁发此证书。最终,你就可以使用此证书来冒充目标站点,即使浏览器也无法区分真伪。

具体详情:如果你想要了解签名算法和SSL证书的具体细节,乔舒亚·戴维斯有一个极其详尽的解释,具体链接如下:
http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art012

SHA-1攻击

在2005年,密码学家证明SHA-1的破解速度比预期提高了2000倍。但是破解仍然是极其困难和昂贵的。但是随着计算机变得越来越快和越来越廉价,在互联网上停止使用SHA-1算法只是时间的问题。

后来,互联网继续使用SHA-1。在2012年,Jesse Walker写了一份评估报告,关于伪造一个SHA-1证书所花费的成本。该评估参照亚马逊Web服务的价格和摩尔定律。

当时沃克预计一个SHA-1的碰撞在2012年需花费2,000,000美元,在2015年需花费700,000美元,在2018年需花费173,000美元,在2021年需花费43,000美元。基于这些数字,施奈尔暗示到2018年就会有犯罪集团能够伪造证书,到2021年就会有科研院校具备这种能力。

在有关更替SHA-1的规划和争论中,沃克的评估和施奈尔的推断被广泛的引用。一个由主流CA组成的组织:CA安全理事会(CA Security Council),近来使用沃克和施奈尔的结论来抱怨谷歌的时间表。CA把评估结果当作反驳的利器,认为 “等到2018年这种攻击才会实际出现”。

我发现CA安全理事会所采取的立场简直像卡通片一样幼稚。他们只像在掩饰问题,因为他们深知加快的更换过程给他们带来很大的不便(直白点就是时间和金钱)。

沃克和施奈尔的评估是在斯诺登事件之前,在人们弄明白原来政府也是敌人之前。基于他们的评估,在2014年伪造一个证书的成本要少于2000.000美元,许多一线的明星大腕都能支付得起这个数目。

我们怎么确信他们会这样做呢?因为他们已经做了。(反正给我这么多钱,我不是干这种傻事的)

卡巴斯基实验室监控到已感染火焰病毒的计算机

在2012年研究人员发现了大名鼎鼎的火焰病毒。华盛顿邮报报道这是美国和以色列的合作,用于从伊朗搜集情报,阻挠伊朗核武器计划。一份泄露的NSA文件似乎证实了这一观点。火焰病毒依赖于一个伪造的SSL证书,实现了一个MD5(SHA-1的前任)的碰撞。令人不安的是,它使用了一个在当时鲜为人知的方法,尽管人们对MD5已经做了多年的研究。此事件给我们的提示是,我们应该假设最危险的漏洞是未知的。

关于MD5,有一个有趣的故事。因为像SHA-1一样,很早之前人们就发现MD5存在脆弱性, 而且和SHA-1一样,从互联网上移除MD5所花费的时间令人吃惊。

在1995年,MD5首次被披露存在理论上的脆弱性,并随着时间推移变得越来越脆弱,但直到2008年,MD5仍被一些CA所使用。

在Chrome中通过chrome://settings/certificates查看

虽然这是一个很危急的情况,可是一直到2011年Chrome仍然不能取消对MD5的支持-距离首次证明MD5不可信的时间已过去16年了。

在互联网上更换签名算法存在一个特有的挑战:只要浏览器支持SHA-1,任何人的证书都可能被伪造你可以使用一个SHA-1签名的伪造证书来冒充一个SHA-2签名的证书,因为浏览器只会查看SHA-1签名的伪造证书,并不知道存在一个“真正的”证书或证书应该使用SHA-2签名。(简言之,为了冒充目标站点的证书,伪造证书的信息和目标站点的证书一模一样,只是签名算法改为SHA-1)换句话说,防止利用SHA-1伪造证书的唯一方式就是浏览器取消对SHA-1的支持。

各浏览器的响应

微软是第一个宣布了SHA-1弃用计划,在2016年之后Windows和IE将不再信任SHA-1证书。Mozilla也做了同样的决定。虽然微软和Mozilla向用户昭示了问题的存在性,但都没表明将要改变用户接口。

另一方面,最近谷歌丢出一个爆炸性新闻,宣布因为SHA-1太脆弱了,Chrome浏览器会向用户显示警告:

“我们计划通过Chrome中Https安全指示器来强调SHA-1不能满足当初的设计要求的这一事实。我们正在采取一种可量化的方法,逐渐下调安全指标器并逐渐推进时间表。”

在两周前,谷歌的Ryan Sleevi首先公布了Chrome的预期策略。建议大家阅读一下完整的讨论过程,具体链接如下:

https://groups.google.com/a/chromium.org/d/msg/security-dev/2-R4XziFc7A/NDI8cOwMGRQJ

你会发现许多CA和大规模网站的运维人员露面,并试图和Ryan Sleevi进行辩论,因为Ryan Sleevi告诉他们现在就应该停止颁发脆弱的证书,而不是推迟到明年。

这是谷歌发起的一个大胆的举动,同时也伴随着巨大的风险。浏览器移除签名算法为什么如此艰难,其主要原因是:当浏览器告诉用户一个重要的站点存在风险时,用户却认为浏览器出问题了,然后去更换浏览器。谷歌似乎在打赌用户对Chrome的安全性足够信任和对Chrome足够的喜欢,以致能够接受该计划带来的不便。(毕竟是第一个吃螃蟹,向谷歌致敬!)

Opera 表示支持谷歌的计划。Safari团队正在观望(俗称“围观群众”)并未表态。

指导建议

为了帮助迁移,我搭建了一个小型站点www.shaaaaaaaaaaaaa.com,用于检查你的站点是否使用了SHA-1,以及是否需要更新。

字母A的数目是一个不可预测的大素数(作者为啥选择个数字让我费解,也许你能告诉我答案!嘿嘿)

你需要提交一个新证书请求,让你的CA颁发一个使用SHA-2的新证书。使用你现有的私钥:

openssl req -new -sha256 -key your-private.key -out your-domain.csr

其中-sha256标志会使用SHA-2签名CSR,但CA才能决定是否向你颁发一个使用SHA-2签名的证书。我一直在关注有关从不同的CA获得SHA-2证书的问题和解决方案。如果你遇到的问题在网站上没有提到,请在这里反馈,我会及时更新网站。

你可能更新所有的SHA-1中间证书,因为它们也需通过数字签名来验证。这也就意味着你要追踪你的CA是否颁发了SHA-2中间证书,并发向哪里了。我也一直在追踪不同的CA颁发的SHA-2中间证书的位置。如果你发现了网站上未提到的,或者你的CA没有中间证书的话,也请在这里反馈。

如果你有一个站点,但其他公司控制着证书,你可以向他们的客服发送邮件告知。发送谷歌声明的连接,并询问他们的时间表。当然我也需要一些帮助,你如果愿意的话,查看网站上的开放问题,助我一臂之力。

SHA-1根证书:你不必担心浏览器自带的SHA-1根证书,因为它们的完整性不是通过数字签名验证的。

结论

这种推动SHA-1退役的计划早就应该启动了。随着压力不断被放大而引发的所有麻烦应该被导向到CA,而不是让谷歌作替罪羊,因为长久以来CA都不能采取有效的措施。

对于个人而言,获得证书应该像购买域名一样容易,安装它应该向打开一个网站那样简单,并更换它能够实现自动化。这些思路提供了一些非常明确的商业机会和开源工具的需求。

对于组织,在他们的基础设施的设计和更新过程中,频繁的证书轮换是需要优先考虑的。出色完成这项工作的组织应该广开言路,共享他们的工作成果。

与此同时,网站经营者应该更新证书和利用暂无像Heartbleed级别的紧急情况为契机,重新审视自己的SSL配置,并开启“正向加密”(forward secrecy)之类的配置。

[参考信息来源 Why Google is Hurrying the Web to Kill SHA-1 ,内容有所删减,尽量保留了原文本意。译自Rabbit_Run,喜欢文章请点赞鼓励。转载请注明来自FreeBuf.COM]

声明:本文系引用自互联网,本人转载此文仅为传递更多信息之目的,并不意味着赞同其观点或证实其描述。

Leave a Reply

Your email address will not be published. Required fields are marked *