当哈希碰撞成为现实
如果你在过去的十二年里不是生活在原始森林的话,那么你一定知道密码学哈希函数SHA-1是存在问题的,简而言之,SHA-1没有我们想象中的那么安全。SHA-1会生成160位的摘要,这意味着我们需要进行大约2^80次操作才能出现一次哈希碰撞(多亏了Birthday攻击)。但是在2005年密码学专家通过研究发现,发生一次哈希碰撞其实并不需要这么多次的操作,大概只需要2^65次操作就可以实现了。
这就非常糟糕了,如果现实生活中可以实现哈希碰撞的话,那么这就会让很多使用SHA-1的应用程序变得更加的不安全。而这个操作次数,即2^65次,是一个比较接近实际情况的数字。如果你想用自己的笔记本电脑来进行计算的话,可能需要好几年的时间,但是对于那些手头上有资金有技术的大型组织而言,计算出一次哈希碰撞可能只需要一两周的时间。
Google就是具备上述条件的一个组织,Google根据CWI的安全研究人员Marc Stevens和Pierre Karpman的最新研究成果,并使用了大量的计算资源(CPU集群和GPU集群)实现了最优分布式碰撞搜索。碰撞信息如下图所示:
既然现在已经是2017年了,所以哈希碰撞也有自己的“昵称”和logo了:http://shattered.io/。Marc Stevens和其他密码学研究人员的多年努力以及Google工程产品的高性能让哈希碰撞成为了现实,而这其实也并不会让我们感到惊讶,因为我们知道这是迟早会发生的事情
但是,这次哈希碰撞的实现让很多安全威胁变得离我们更加近了,很多目前正在使用SHA-1的服务也正在寻找替代方案。如果要代替SHA-1的话,我推荐BLAKE2,这是一个哈希算法,它是由安全研究专家Samuel Neves、Zooko和CodesInChaos共同设计开发的。接下来我会告诉大家,我为何要推荐用BLAKE2来代替SHA-1。
当然了,没人会愿意使用存在安全问题的哈希算法。不过这也得看情况,这一次破解的只是SHA-1的抗碰撞性,而某些网络应用其实对抗碰撞性并没有太高的要求。比如说,类似HMAC-SHA-1(使用HMAC伪随机函数和SHA-1共同作为哈希函数)或PBKDF2-HMAC-SHA1(使用HMAC-SHA-1作为伪随机函数的PBKDF2密码哈希)这样的哈希函数仍然是安全的,但是我们仍然建议大家放弃使用SHA-1。
我们给BLAKE2的定位是目前安全系数最高的哈希函数,从2012年BLAKE2的发布之日至今,我们还没有发现针对BLAKE2的攻击。实际上,BLAKE2是基于BLAKE实现的,BLAKE是2008年被提交至SHA-3竞赛的一种哈希函数,而且全世界最优秀的密码学分析专家对这个哈希函数进行了长达四年的审查,然而并没有发现任何的不安全因素。
除此之外,BLAKE2的内部基于的是ChaCha,而ChaCha是高度可信任的,它不太可能被破解。(注:ChaCha是一种由Daniel J.Bernstein设计的流密码,它是TLS1.3所使用的三大密码之一,并且符合新的TLS标准。)
由于在设计之初就考虑到了安全和性能方面的优化,BLAKE2在速度方面是要优于SHA-1的。下图显示的是各种不同的哈希函数在一块英特尔CPU(Skylake架构)上的吞吐量测试信息:
你会发现,我们可以方便地用各种不同的编程语言来实现BLAKE2,例如C、Go、Java、JavaScript、Python或Rust。比如说,BLAKE2默认就是Go语言“/x/crypto”包中的一部分。除此之外,目前很多流行的加密代码库都包含有BLAKE2,例如OpenSSL和Sodium等等。如果你想使用其他语言来实现BLAKE2的话,可参考Sodium给出的资料【点击文末的阅读原文查看】。
BLAKE2不仅仅只是一个简单的哈希函数而已!首先,BLAKE2有两大主要版本:BLAKE2b和BLAKE2s。BLAKE2b是BLAKE的64位版本,它可以生成最高512位的任意长度哈希。BLAKE2s是BLAKE的32位版本,它可以生成最高256位的任意长度哈希。
为了进一步提升哈希计算的速度,BLAKE的并行版本BLAKE2bp和BLAKE2sp可以在多个计算核心上并行运行,而此时的运行效率将是串行运行的八倍。如果你想在BLAKE2的哈希计算中使用密钥的话,例如伪随机函数(PRF)或消息认证码(MAC),你不需要像使用HMAC一样还要专门去实现这些计算,因为BLAKE2可以接受一个密钥作为可选输入参数,计算完成之后你就可以得到一个跟HMAC一样安全的哈希了。
如果你需要长度高于512位的哈希值,例如实现一个密钥导出函数(KDF)或确定性随机比特生成器(DRBG),我们创建了BLAKE2x,BLAKE2x是对BLAKE2的简单扩展,它可以生成任意长度的哈希值(长度不受限制)。
SHA-2其实是一个哈希函数家族,其中包括SHA-256、SHA-384和SHA-512,而且还提供了SHA-224和SHA-384这两个变种版本。SHA-2哈希函数可以看作是安全系数更高的SHA-1,而SHA-2目前还没有被破解。但是跟BLAKE2相比,SHA-2哈希函数在性能和速度方面明显要处于劣势。除此之外,它不支持额外的功能,而且也无法抵御哈希长度扩展攻击。
SHA-3同样是一个哈希函数家族,2015年发布的美国联邦标准FIPS 202还对其进行了标准化规范。SHA-3是基于Keccak(SHA-3竞赛中的胜者)实现的,SHA-3哈希函数跟BLAKE2一样的安全,但是同样在速度方面处于下风。很多人选择使用SHA-3而不选择BLAKE2的理由可能是BLAKE2并不是一种规范标准(虽然BLAKE也有自己的标准化文档RFC),而且BLAKE2也没有得到FIPS的许可认证。
当我尝试通过审查源代码来发现加密算法中的漏洞时,我通常会使用类似grep–Hnri md5或rg–i md5这样的命令来查看代码中MD5的使用信息,这样就可以迅速地找出算法中的潜在漏洞。我建议各位安全从业人员也采用这样的方法来检查系统中MD5和SHA-1应用的安全性,如果有需要的话,最好将哈希算法替换成更加安全的BLAKE2。
如果你使用的是X.509证书,那么请确保使用SHA-256作为你的签名算法,而不要再使用SHA-1了。除此之外,类似Chrome这样的Web浏览器会将那些使用SHA-1的域名证书标记为“Inscure”(不安全)。
实际上,安全研究人员早在2005年就已经对外宣称MD5和SHA-1从理论上来说是可以被破解的,但是很多开发者仍然没有将SHA-1升级为SHA-2,并且还在继续使用这种不安全的哈希算法,因为他们不愿意牺牲网络服务的速度和效率来换取更高的安全性。但是现在他们就没有任何理由继续使用SHA-1了,因为BLAKE2的速度比SHA-1更快。当然了,你也可以选择SHA-3,但无论如何你都应该将SHA-1从你的系统中永久移除。