前言
在安全散列算法(Secure Hash Algorithm)第3版中,修复了当前标准的SHA-2中的缺陷。本文主要讲解一旦SHA-2被发现存在严重问题时,我们如何迁移到SHA-3。
在过去的两年中,研究者不断尝试进行散列攻击,数字世界已经被迫从有缺陷的SHA-1(第1版)逐步转移到SHA-2(第二版)。在转移过程中,为了尽可能不影响正常业务运营,需要提前进行数百小时的研究和工作。因此,我们应该防患于未然,提前做好准备预防再一次的迁移。
当前,我们知道SHA-2存在与SHA-1相同的数学缺陷,但SHA-3并不存在。那么,我们为什么目前暂时还没有迁移至SHA-3呢?在什么样的场景下我们会再进行迁移?
SHA哈希和越来越复杂的攻击
SHA-1由美国国家安全局(NSA)设计,并于1995年由美国国家标准与技术研究院(NIST)作为联邦标准(FIPS Pub 180-1)发布。该算法产生一个160位的消息摘要,如果加密过程完全安全,那么攻击者平均需要尝试2^159次暴力破解才有可能破解其哈希。即使在如今运行速度非常快的云计算机上,2^159次尝试也不是轻易可以完成的,因此就无法进行有效的攻击。基于当前数学和物理学的普遍共识,如果某种攻击是无法轻易完成的,我们就可以认为这种算法是相对安全的。
从2005年开始,发生过几起针对SHA-1的理论攻击。到了2012年,研究者已经从理论上将SHA-1的保护位数(最大平均值)从159位降至57.5-61位。然而,上述都只是一个理论上的攻击。随着时间的推移,理论总会变成现实,而这也正是我们为什么要升级算法并进行迁移的原因。
随着时间的推移,旧版本的算法被攻破只是一个时间问题。因此,NIST与NSA定期举办面向公众的竞赛,任何人都可以提交新创建的哈希算法以便评委审核与选择。这些比赛通常进行数年,全球领先的密码学家将会参加。最终,会选择一个新的哈希标准,并宣布为美国政府官方版本的哈希算法。这就是包括高级加密标准(AES)和SHA-3在内的算法的由来。
在2011年1月(NIST文件SP800-131A),SHA-2成为最新推荐的哈希标准。SHA-2通常被称为SHA-2哈希簇,因为它包含许多不同长度的哈希值,包括224位、256位、384位和512位摘要(具体内容在NIST的联邦信息处理标准文件中)。我们无法仅仅根据名称来确定某个正在使用的SHA-2位长度,但最常用的是256位。
关于SHA-1攻击请参考:http://en.wikipedia.org/wiki/SHA-1#Attacks 。
关于SHA-2算法请参考:http://en.wikipedia.org/wiki/SHA-2 。
从SHA-1逐步迁移到SHA-2
尽管自2011年成功对SHA-1进行攻击以来,SHA-2已经成为NIST要求的散列标准。但直至2016年,世界上大部分国家和地区仍没有迁移到SHA-2。最快反映的人往往需要进行最多的工作。在当时,针对SHA-1的公开攻击只存在于理论上。
2015年,全球最大的加密供应商决定强制他们的客户在2018年1月1日前从SHA-1迁移到SHA-2。其原因在为,理论上的突破很快就会变为真正意义的攻击。因此,在最近,许多公司都被迫对所有依赖该算法的程序或设备进行升级。
截止到2017年初,大部分客户已经迁移到SHA-2,迁移工作只是一个时间问题。针对这一方面,我写过一些文章,可供参考:https://gallery.technet.microsoft.com/Migrating-SHA-1-to-SHA-2-82ee3a4e 。2017年2月23日,Google宣布一次成功的真实SHA-1碰撞攻击( https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html ),并演示了两个使用相同SHA-1哈希值的不同PDF文件。这一次攻击,完全破坏了SHA-1的安全性。
针对这样的攻击,没有任何缓解方式存在。但在SHA-1被证明不安全之前,全球的加密厂商大部分已经将SHA-1迁移到了SHA-2。我们说过,最先吃螃蟹的人总要进行大量的工作,而后来者就可以借助前人的经验轻松完成迁移。由于已经有成千上万的公司成功进行迁移,所以网上已经有大量的迁移方法说明,并且许多供应商都可以随时提供协助,大多数软件和设备供应商也已经做好了准备。SHA-1到SHA-2的迁移计划取得了圆满成功。
但现在还有一个问题,为什么我们不迁移到更为安全的SHA-3呢?
为什么要迁移到SHA-3?
实际上,SHA-1和SHA-2并不是通过公开的竞赛创建并获得的,而是由NSA编写算法,并作为公开专利发布。尽管SHA-1和SHA-2并不完全相同,但二者使用了相同的基础数学,其中就包含着相同的加密缺陷。之所以SHA-2成为更安全的散列,主要是通过增加散列长度来实现的。
SHA-2存在的问题
尽管有较多的不同,但SHA-1与SHA-2还是共享相同的基本算法(SHA),并且其中的一些哈希长度容易受到相同类型的攻击。在某些情况下,之所以大部分SHA-2的安全性比SHA-1更好,是因为SHA-2使用了更长的输入和输出。
自2008年以来,研究者就不断在尝试对SHA-2的公开攻击。正如SHA-1此前经历的一样,针对SHA-2的攻击会随着时间的推移变得越来越容易。目前,随着不断尝试( https://online.tugraz.at/tug_online/voe_main2.getvolltext?pCurrPk=69018 ),SHA-2的有效保护已经减少到了2^37。并且,2016年发布的一些最新攻击进展( https://eprint.iacr.org/2016/374.pdf )中认为,对SHA-2的攻击已经可以实际进行。这听上去是不是很熟悉?没错,这就是两三年前我们对于SHA-1的认知。
诚然,现有的SHA算法会随着时间的推移而变得更不安全。而NIST之所以选择了一个公开竞赛中提交的SHA-3作为最新的标准( https://en.wikipedia.org/wiki/SHA-3 ),是因为它不是从SHA系列中派生而来的,有着完全不同的数学算法。该比赛在2006年开始,Keccak Hash被选为2010年的唯一入选者,NIST在2015年发布了草案标准,并于2015年8月5日将其命名为SHA-3,作为官方推荐的标准。
在SHA-1迁移到SHA-2的过程中,大部分工作都是集中在2016年和2017年后期完成的。但在那时,SHA-3已经发布,为什么我们没有让全世界迁移到SHA-3呢?
为什么不迁移到SHA-3?
之所以全世界没有迁移到SHA-3,首要原因是世界上目前几乎没有任何软件或硬件支持该算法。即使我们想转移到SHA-3,那也需要自己拥有或使用的每个设备都能支持该算法,除非我们亲自为每个设备编写并更新其代码和固件,否则迁移就是不可能的。
最重要的时,当SHA-2迁移计划发布时,SHA-3还尚未成型。甚至在决定弃用SHA-1的会议上,SHA-3当时还没有成为官方标准。更重要的是,尽管SHA-2部分算法来源于SHA-1,但并不像SHA-1一样可被利用。大家认为,使用任何版本的SHA-2都足以提供充分的保护。另外,许多人普遍认为SHA-3的效率远低于SHA-2,因此会更倾向于速度较快的方案。
大多数SHA-2供应商不得不更新他们的SHA-2程序来修复缺陷。对于供应商而言,使用SHA-3算法编写程序就像实现SHA-2一样简单。如果从SHA-1直接迁移到SHA-3,他们也会很快完成迁移工作。
关于SHA-3的效率问题
SHA-3只在软件中的运行速度较慢。但在硬件中,其速度优于SHA-1和SHA-2。目前,越来越多的加密程序是由硬件组件负责处理,并且预计未来会更为广泛。
在软件上看,SHA-1的速度是SHA-3的三倍。在英特尔CPU上,SHA-512的速度是SHA-3的两倍。尽管这听起来并不理想,但大多数软件和设备中的散列验证组件非常少见,因此在大多数实际使用场景中,生成或验证散列所需的时间翻倍或翻三倍并不会产生显著的影响。此外,我们的CPU运行速度也在不断提升,所以这一时间的增长就会变得越来越不明显。此外,SHA-3算法的作者已经向NSA和NIST提供了能让其在软件中更快运行的一些方案。
如何准备SHA-3迁移
毫无疑问,在几年内,我们会进行向SHA-3的迁移。为了防患于未然,我们应该如何提前准备呢?
首先,请随时关注可能进行的SHA-3迁移。目前,没有人知道会在什么时候需要进行迁移,这完全取决于针对SHA-2的真实攻击的研究进展。如果有一天,Google或其他研究团队宣布SHA-2已不安全,那么我们就需要立刻开展迁移,请不要惊讶。
其次,请保留向SHA-2迁移的计划和相关文档。到SHA-3的迁移工作与到SHA-2的迁移工作非常相似。因此,我们需要从SHA-1到SHA-2的迁移过程中总结一些经验教训,并将其用于以后的迁移工作之中。并且,请记录目前使用的软件和硬件产品,以方便以后的迁移工作。
最后,希望大家了解,如果大家在IT界工作,那么散列迁移是一个常规的、持续的循环。因此,你、你的同事、相关供应商都应该保持最敏捷的反应速度。在这篇文章中,我介绍了关于加密敏捷的概念:https://www.csoonline.com/article/3245071/encryption/are-you-crypto-agile.html 。