SHA-1、SHA-2和SHA-256算法的差别

0
9706

SHA-1、SHA-2、SHA-256和SHA -384,这些都意味着什么?

如果你曾经听说过多种形式的“SHA”,但又不完全确定它是什么的首字母缩写,以及它的重要性何在,那么我们今天就来讲一讲,为大家解疑答惑。

然而,在我们讲述SHA之前,我们需要阐述一下算法,然后我们将讲述SSL证书是如何使用数字算法来形成数字签名的。这些都是很重要的概念,只有理解了它们,你才能知道什么是SHA-1和SHA-2。

什么是算法?

散列算法是一种将数据压缩到一定大小的数学函数。因此,举例来说,如果现在有下面一个句子:

“The Quick Brown Fox Jumps Over The Lazy Dog”

然后我们对它运行特定的CRC32散列算法,那么我们就会得到:

“07606bb6”

这个结果就是所谓的散列或散列值。有时,散列也指代单向加密。

有时,计算机可能想要识别、对比或者对文件和字符串运行不同的计算,在这些情形下,散列是很方便的。与对比原始文件相比,计算机首次计算散列然后再对比数值是很更容易的。

散列算法的主要特性之一是确定性。无论你如何选择,只要一台计算机能够理解散列算法,那么它就能在本地对我们所列举的这个句子进行散列计算,然后得出相同的答案。

散列算法的用途有多种——例如,它们可以用来在计算机中存储密码。

目前,散列算法有上百种,每种都有特定的用途——有些进行了优化,以用于特定类型的数据,其他则主要为速度和安全性考虑。

为了今天的讨论,我们只关心SHA算法。SHA代表的是安全散列算法——它的名称就表明了它的用途——主要用于加密安全。

阅读完本文后,如果你只需要了解一件事,那么它应当是:加密散列算法能够产生不可逆的、独特的散列。不可逆意味着,如果你只拥有这个散列,那么你就无法使用它来弄明白原始数据段是什么,因此原始数据便能保持安全和未知状态。独特意味着两条不同的数据段永远不会产品相同散列——下一节我们将讲述为什么这是非常重要的。

注意:为了使阅读和理解本文变得更简单,我所使用的数据串例子和散列算法与实际情况相比是极其短的。你在上面看到的散列并不是任何一种类型的SHA散列。

数字签名

既然我们已经知道了什么是散列,我们就可以阐释它们在SSL证书中是如何使用的。

SSL/TLS协议用于在不同设备间对数据进行安全的网络传输。为了简洁起见,SSL似乎经常被解释为“加密”。但不要忘了SSL还提供身份认证。SSL证书文件能够提供身份验证所需的必要信息。或者换句话说,SSL证书能够将特定的公有密钥与一个身份绑定起来。

记住,通过使用非对称加密,SSL/TLS协议能够促进连接。这意味着有两个加密密钥,每个密钥负责处理一半的流程:公钥用于加密,私钥用于解密。每个SSL证书都包含一个公钥,客户可以使用它来对数据进行加密,同时上述SSL证书的所有者则会在其服务器上存储一个私钥,这个私钥可以用来解密这个数据并使之可读。

最终,这一非对称加密的主要目的是安全地交换密钥。由于非对称密钥所需的计算能力,实际中更常使用较小的对称密钥来用于实际的连接的通讯部分(也更安全)。因此,客户会生成一个会话密钥,然后对它的一个副本进行加密,然后再把加密后的副本发送给服务器,最后在连接进行期间,该副本便可以在服务器上进行解密,从而用于通讯。

这就是身份认证对确保SSL/TLS实际上能够提供有意义的安全性极其重要的原因。想象一下,如果你的计算机无法可靠地知道你之前使用的加密密钥是谁拥有的?使用公有密钥加密会话密钥不会有用,因为你不知道谁拥有对应的解密它的私钥。毕竟,如果你把它直接发送给连接另一端的中间人攻击者或者一个第三方,加密数据是没有用的。

数字签名是SSL证书如何提供身份认证的一个重要组成部分。签发证书的过程,实际上是你选择将其作为你的证书提供商(比如Sectigo,DigiCert等)的证书机构(CA)对它进行数字签名的过程。该签名能够提供一种加密证明,证明CA签发了SSL证书,并且该证书并没有遭到篡改或再生。更重要的是,它是一个真实的签名,是一种加密证明,能够证明可信的第三方验证已经对证书中所包含的信息进行了验证。

现在让我们来谈谈数字签名是如何制作、应用和贴上的——随便你选择什么术语。我们将再次使用到前面提到的非对称密钥,但目的是签名而不是加密。从数学上来讲,签名涉及到改变数据和密钥组合的不同方式。为了使计算机快速而又安全地创建和检查这些签名变得更容易,CA首先会对证书文件进行散列计算,并对得到的散列进行签名。这比签名整个证书更有效。

然后,该数字签名就会提供所需的证明,证明你获得的证书确实是可信的CA颁发给相关网站的证书。不存在弄虚作假和欺骗的行为,也没有中间人在控制着这些SSL/TLS证书文件。

数字签名是非常敏感的——对文件的任何更改都会导致签名的更改。如果我们将上一节中所采用的句子变成一个完全小写的句子(“the quick brown fox jumps over the lazy dog”),那么得到的散列将是完全不同的。这意味着该散列生成的签名也会有所不同。即使改变数千兆字节文档中的一个位,也会导致完全不同的散列。

这使得攻击者将无法修改合法的证书或创建看起来合法的欺诈性证书。一个不同的散列意味着签名将不再有效,你的计算机在验证SSL证书时将知道这一点。如果你的计算机遇到无效的签名,它就将触发一个错误并完全阻止安全的连接。

SHA-1和SHA-2

既然我们已经奠定了基础,就可以正式开始了。

正如我之前所说,SHA代表的是安全散列算法。SHA-1和SHA-2是该算法的两个不同版本。它们在构造(如何从原始数据创建得到的散列)和签名的位长度方面都有所不同。你应该将SHA-2看作是SHA-1的继承者,因为它在整体上都有所改善。

首先,人们把位长看作是一个重要的区别。SHA-1是一个160位散列。SHA-2实际上是散列的一个“家族”,有很多种长度,最流行的是256位。

由于网站和作者表达方式不同,SHA-2散列的多样性可能会令人感到一些困惑。如果你看到“SHA-2”、“SHA-256”或“SHA-256位”,这些名字指的是同一个东西。如果你看到“SHA-224”、“SHA-384”或“SHA-512”,它们指的是SHA-2的另一个位长度。你可能还会看到一些网站更明确,把算法和位长度都写了出来,比如“SHA-2 384”。但这很令人讨厌,就像当你介绍自己的名字时,让别人把你的中间名字加上一样。

SSL行业已经选择SHA作为其数字签名的散列算法

从2011年到2015年,SHA-1是主要的算法。越来越多的研究表明,SHA-1的弱点已经促使人们重新对其进行估值。实际上,为了证明这一点,谷歌甚至还创建了一个SHA-1冲突(当两段不同的数据创建了相同的散列值时)。因此,从2016年开始,SHA-2就成为了新的标准。如果你现在正在接收SSL/TLS证书,那么它肯定至少使用的是该位长度的签名。

偶尔你会看到SHA-2 384位的证书。你很少会看到224位的变体(不允许与公开可信的证书一起使用),或者512位的变体(不太受到软件的支持)。

SHA-2可能会继续使用至少五年。但是,可能会发现一些对该算法的意外攻击,而这将促使更早的过渡。

下面就是我们网站SSL证书的SHA-1和SHA-2散列:

图像和算法计算来源:MD5File.com

因此,是的。这就是令人感到吃惊的地方。这两个散列可能并不太像,但是数字签名对于确保SSL/TLS的安全性是非常重要的。

较大位数的散列可以提供更高的安全性,因为有更多可能的组合。记住,密码散列算法的一个重要功能是产生唯一的散列。同样,如果两个不同的值或文件可以产生相同的散列,那么你就是在创建我们称之为的冲突。

只有在不发生碰撞的情况下,才能保证数字签名的安全性。碰撞是极其危险的,因为它们允许两个文件产生相同的签名,因此,当计算机检查签名时,它可能看起来是有效的,即使该文件从未真正签名过。

有多少散列?

如果一个散列算法应该为每个可能的输入生成唯一的散列,那么有多少可能的散列呢?

一个位有两种可能的值:0和1。有多少种可能的独特的散列,便有多少个可能的值,而这一个值也是由位决定的。对于SHA-256来说,有2256种可能的组合。

因此,有2256种组合。这是多少?嗯,这是一个很大的数字。不过还是让我们严肃一点,它让万亿这样的数字自惭形秽,它远远超过了世界上所有沙粒的数量。

可能的散列数越多,两个值创建相同散列的可能性就越小。

从技术上来说,可以输入无限多个[1],但输出总是有限的,只有一个。因此,最终,包括安全算法在内的每一个散列算法都会产生冲突。但我们最关心的是这样做有多容易。SHA-1被认为是不安全的,因为由于它的大小和构造,产生碰撞是可行的。

注意,位的长度更大并不意味着散列算法产生的散列更安全。算法的构造也非常重要——这就是SSL行业使用专门为加密安全性设计的散列算法的原因。

向SHA-2的转变

2015年,SSL行业经历了一次“SHA-2转型”。它涉及到重新签发数千个现有证书,以便创建新的文件并用SHA-2签名。它还涉及到对公开可信的CA所操作的发布软件进行重大更新(有几十个)。不出所料,过程中出现了一些小问题。

2015年12月31日是使用SHA-1散列签发新SSL证书的最后期限。在很大程度上,整个行业都坚持到了这个最后期限。从那时起,我们犯了一些错误,并批准了一些特殊情况。

但在过去三年里,SHA-1证书几乎完全消失了。今天,如果你遇到SHA-1证书,你就将看到一个清楚无误的警告。紧急程度已经得到了提升。在谷歌Chrome中,所有在2016年到期的SHA-1证书在安全连接中都不会显示绿色挂锁,而是显示与不安全的HTTP连接相同的图标。你可以单击图标以获取关于为什么会显示这一警告的更具体的信息,以防与签名无关的其他原因。

各个浏览器对2017年到期的、使用SHA-1签发的证书发出了更强烈的警告。这是因为签名的安全性与它的有效时间直接相关。

现在,在2018年,谷歌只是简单地处决了网站所有者,并留下他的尸体作为警告,以防其他人胆敢犯同样的罪。

保护签名安全

随着时间的推移,对加密的攻击能力将得到提高,计算机的处理能力将变得更便宜。这将使有效的SHA-2签名在2020年的安全性低于2016年。由于这个原因,算法的选择将比立即需要的影响更大,因此短期内的改进不会对安全性造成任何影响。对于一种特定的散列算法来说,在10年内保持安全并不是不现实的。

全世界的行业专家和安全研究人员都在不断地分析SHA-2和其他加密散列算法,所以请放心,当前的SSL证书在一段时间内都将拥有可靠和安全的数字签名。

这并不意味着密码学家就会坐以待毙,等待问题的出现。SHA-2的继承者SHA-3已经最终确定。当需要转换到另一个时,SSL行业可能会使用SHA-3作为其下一个选择,或者它可能会使用一个完全不同的算法。

正确地研究和审查新的密码标准需要多年的时间,然后再开发支持它们的软件。该行业总是至少领先一步,希望知道这点能让人感到安心。

LEAVE A REPLY

Please enter your comment!
Please enter your name here