如果你听说过很多种形式的“SHA”,但不完全确定它的含义,或者为什么它很重要,那么请继续读下去。我们首先要解释什么是散列,然后是SSL证书如何使用散列来形成数字签名,这是了解SHA-1和SHA-2的重要背景。
散列算法是一种将数据压缩为固定大小的数学函数。举个例子,如果我们通过一个叫CRC32的特定的散列算法把这个句子“快速的棕色狐狸跳过了懒惰的狗”运算以下,我们就会得到“07606bb6”——这个结果被称为“散列”。
对于计算机可能想要识别、比较或以其他方式对文件和数据串进行计算的情况来说,散列是很方便的。对于计算机来说,首先计算一个散列然后再对它们进行比较,比起对原始文件进行比较要容易得多。
散列算法的一个关键特性是确定性。世界上任何一台了解你所选择的散列算法的计算机,都可以在本地计算我们的例句的散列,并得到相同的答案。
今天,我们关心的是SHA算法。SHA代表安全散列算法——它的名字给出了它的目的——它是用于密码安全的算法。
加密散列算法的最重要的因素是,它们产生不可逆转且唯一的散列结果。散列结果不可逆转使得当你只有散列结果的时候,你无法用它来找出原始数据,因此使得原始数据保持了安全性和未知性。散列结果唯一使得两个不同的数据不能产生相同的散列结果——下一节将解释为什么这如此重要。
注意:为了便于阅读和理解本文,我们使用的示例数据字符串和散列算法比实际使用的要短得多。到目前为止,你所见的散列并不是任何类型的SHA散列。
现在你已结有了合适的知识背景,我们可以继续来看这个话题的核心内容了。
正如我之前所说的,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的弱点,这促使人们重新评价这一算法。从2016年开始,SHA-2成为新的标准。如果你今天收到证书,那么它必须至少使用了这种签名。
你偶尔会看到使用SHA-2 384位的证书。而你很少会看到24位的版本,它未得到批准用于公开的可信证书,你也很少会看到512位的版本,软件对它的支持范围比较狭窄。
如果一个散列算法能够为每一个可能的输入产生唯一的散列值,那么会有多少个可能的散列结果呢?
一个比特位有两个可能的值:0和1。唯一散列值的可能数量可以表示为,可能的值的数量与位数的乘方。对于SHA-256算法,有2256种可能的组合。
所以,2256种组合。这是多少呢?这是一个巨大的数字。请认真对待。它使得像万亿和亿亿亿(一亿的三次方)这样的数字相形见绌。它远远超过了世界上沙粒的数量。
可能的散列值的数量越大,两个散列值产生相同散列结果的可能性就越小。
从技术上讲,有无数个可能的输入,但是输出的数量是有限的。因此,最终每一个散列算法,包括安全的算法,都会产生冲突。但我们最关心的是这样的情况发生的可能性有多大。SHA-1算法被认为是不安全的,由于它的体量和结构的原因,产生冲突的结果是可以实现的。
注意,位数很多并不意味着一个散列算法会产生安全的散列结果。该算法的结构也非常重要——这就是为什么SSL行业使用专门为加密安全设计的散列算法的原因。
SSL行业经历了“向SHA-2算法的过度”。这需要对现有的数以千计的证书进行重新发布,以便新的文件可以通过SHA-2算法创建并进行签名。这还涉及到公开可信的证书颁发机构所运行的证书颁发软件(这样的软件有好几十个)的重大更新。
如果你遇到SHA-1证书,那么你等于看到了一个安全等级降低的标志。在谷歌Chrome浏览器中,2016年到期的所有SHA-1证书都不会显示意味着安全连接的绿色挂锁标志,而是显示与不安全的HTTP连接相同的图标。你可以点击这个图标来获得更多信息,来了解为什么会这样显示,因为还有其他与签名无关的原因。
如果你今天在你的浏览器中看到一个SHA-1证书,它应该就是下面这个样子(在谷歌Chrome浏览器中)。要看看这个页面在你的浏览器中会怎样显示,请访问站点:https://sha1-2016.badssl.com
浏览器在处理SHA-1签名的2017年失效的证书时,会产生一个更强烈的警告。这是因为签名的安全性是与它的有效期直接相关的。