hi,大家好,今天我们开始介绍消息摘要算法中的SHA(Secure Hash Algorithm)安全散列算法。由于其他曾被广泛使用的Hash算法,比如上一篇文章提到的MD5,后来都被发现存在一定的安全隐患,新的摘要算法算法就出现了。SHA 算法是由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)于1993年发布,是美国的政府标准。从2005年至今,SHA或许已经成为仅存的Hash算法的标准了。
SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512。
SHA 算法家族的发展史
SHA-0
最初载明的算法于1993年发布,称做安全杂凑标准(Secure Hash Standard),FIPS PUB 180。这个版本常被称为SHA-0。由于很快被发现存在安全隐患,它在发布之后很快就被NSA撤回,并且由1995年发布的修订版本FIPS PUB 180-1(通常称为SHA-1)取代。
SHA-1
SHA-1算法和 MD5 算法都是由 MD4 算法导出,因此他们俩的特点、缺陷、应用场景基本是相同的。
它俩的区别在于SHA-1算法在长度上是40位十六进制,即160位的二进制;而MD5算法是32位的十六进制,即128位的二进制,所以2的160次是远远超过2的128次这个数量级的,所以 SHA-1 算法相对来说要比 MD5 算法更安全一些。
SHA-2
2002年,NIST分别发布了SHA-256、SHA-384、SHA-512,这些算法统称为SHA-2,2008年又新增了SHA-224。
由于SHA-1已经不太安全,目前SHA-2各版本已成为主流。SHA-2是一系列SHA算法变体的总称,其中包含如下子版本:
-
SHA-256:可以生成长度256bit的信息摘要。
-
SHA-224:SHA-256的“阉割版”,可以生成长度224bit的信息摘要。
-
SHA-512:可以生成长度512bit的信息摘要。
-
SHA-384:SHA-512的“阉割版”,可以生成长度384bit的信息摘要。
SHA-3
2012年10月,经过多年的测试和分析,美国NIST选择了Keccak算法作为SHA - 3的标准算法,Keccak拥有良好的加密性能以及抗解密能力。SHA3算法是以太坊的基础加密算法。
Keccak算法(读作为“ket-chak”)是Guido Bertoni, Joan Daemen, Michael Peters, and Giles Van Assche的工作。 SHA-3的候选人在2008年10月提交。
Keccak采用了创新的的“海绵引擎”散列消息文本。它是快速的,在英特尔酷睿2处理器下的平均速度为12.5周期每字节。它设计简单,方便硬件实现。
SHA 算法基本原理
前面我们简单的介绍了SHA算法家族,接下来我们以SHA-1为例来分析其基本原理。SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段密文,也可以简单的理解为输入一串二进制码,并把它们转化为长度较短、位数固定的输出序列即散列值,也称为信息摘要或信息认证代码的过程。
SHA-1算法输入报文的最大长度不超过264位,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。
一般来说SHA-1算法包括有如下的处理过程:
(1)对输入信息进行处理
既然SHA-1算法是对给定的信息进行处理得到相应的摘要,那么首先需要按算法的要求对信息进行处理。那么如何处理呢?对输入的信息按512位进行分组并进行填充。如何填充信息报文呢?其实即使填充报文后使其按512进行分组后,最后正好余448位。那填充什么内容呢?就是先在报文后面加一个1,再加很多个0,直到长度满足对512取模结果为448。到这里可能有人会奇怪,为什么非得是448呢?这是因为在最后会附加上一个64位的报文长度信息,而448+64正好是512。
(2)填充长度信息
前面已经说过了,最后会补充信息报文使其按512位分组后余448位,剩下的64位就是用来填写报文的长度信息的。至次可能大家也明白了前面说过的报文长度不能超过264位了。填充长度值时要注意必须是低位字节优先。