SHA算法, 即安全散列算法 (Secure Hash Algorithm) 是一种与 MD5 同源的数据加密算法, 该算法经过加密专家多年来的发展和改进已日益完善, 现在已成为公认的最安全的散列算法之一, 并被广泛使用.
概述
SHA 算法能计算出一个数位信息所对应到的,长度固定的字符串,又称信息摘要。而且如果输入信息有任何的不同,输出的对应摘要不同的机率非常高。因此 SHA 算法也是 FIPS 所认证的五种安全杂凑算法之一。原因有两点:
- 一是由信息摘要反推原输入信息,从计算理论上来说是极为困难的;
- 二是,想要找到两组不同的输入信息发生信息摘要碰撞的几率,从计算理论上来说是非常小的。任何对输入信息的变动,都有很高的几率导致的信息摘要大相径庭。
SHA 实际上是一系列算法的统称,分别包括:SHA-1、SHA-224、SHA-256、SHA-384以及SHA-512。后面4中统称为SHA-2,事实上 SHA-224 是 SHA-256 的缩减版,SHA-384 是 SHA-512 的缩减版。各种 SHA 算法的数据比较如下表,其中的长度单位均为位:
类别 | SHA-1 | SHA-224 | SHA-256 | SHA-384 | SHA-512 |
消息摘要长度 | 160 | 224 | 256 | 384 | 512 |
消息长度 | 小于264位 | 小于264位 | 小于264位 | 小于2128位 | 小于2128位 |
分组长度 | 512 | 512 | 512 | 1024 | 1024 |
计算字长度 | 32 | 32 | 32 | 64 | 64 |
计算步骤数 | 80 | 64 | 64 | 80 | 80 |
SHA-1 在许多安全协定中广为使用,包括 TLS 和 SSL、PGP、SSH、S/MIME 和 IPsec,曾被视为是 MD5 的后继者。SHA1 主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于 264 位的消息,SHA1 会产生一个 160 位的消息摘要。
算法原理
SHA-1 是一种数据加密算法, 该算法的思想是接收一段明文, 然后以一种不可逆的方式将它转换成一段 (通常更小) 密文, 也可以简单的理解为取一串输入码 (称为预映射或信息), 并把它们转换为长度较短、位数固定的输出序列即散列值 (也称为信息摘要或信息认证代码) 的过程.
单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性.
如果在输入序列中嵌入密码, 那么任何人在不知道密码的情况下都不能产生正确的散列值, 从而保证了其安全性.
SHA将输入流按照每块 512 位 (64个字节) 进行分块, 并产生 20 个直接的被称为信息认证代码或信息摘要的输出.
该算法输入报文的长度不限, 产生的输出是一个 160 位的报文摘要. 输入是按 512 位的分组进行处理的. SHA-1 是不可逆的、防冲突, 并具有良好的雪崩效应.
通过散列算法可实现数字签名, 数字签名的原理是将要传送的明文通过一种函数运算 (Hash) 转换成报文摘要 (不同明文对应不同的报文摘要), 报文摘要加密后与明文一起传送给接收方, 接收方将接收的明文产生新的报文摘要与发送方发来的摘要解密比较, 比较结果一致表示明文未被改动, 如果不一致表示明文已被篡改.
一般来说 SHA-1 算法包括有如下的处理过程:
(1)、对输入信息进行处理
既然 SHA-1 算法是对给定的信息进行处理得到相应的摘要,那么首先需要按算法的要求对信息进行处理。那么如何处理呢?对输入的信息按 512 位进行分组并进行填充。如何填充信息报文呢?其实即使填充报文后使其按 512 进行分组后,最后正好余448位。那填充什么内容呢?就是先在报文后面加一个1,再加很多个0,直到长度满足对512取模结果为448。到这里可能有人会奇怪,为什么非得是448呢?这是因为在最后会附加上一个64位的报文长度信息,而448+64正好是512。
2)、填充长度信息
前面已经说过了,最后会补充信息报文使其按512位分组后余448位,剩下的64位就是用来填写报文的长度信息的。至次可能大家也明白了前面说过的报文长度不能超过264位了。填充长度值时要注意必须是低位字节优先。
(3)信息分组处理
经过添加位数处理的明文,其长度正好为512位的整数倍,然后按512位的长度进行分组,可以得到一定数量的明文分组,我们用Y0,Y1,……YN-1表示这些明文分组。对于每一个明文分组,都要重复反复的处理,这些与MD5都是相同的。
而对于每个512位的明文分组,SHA1将其再分成16份更小的明文分组,称为子明文分组,每个子明文分组为32位,我们且使用M[t](t= 0, 1,……15)来表示这16个子明文分组。然后需要将这16个子明文分组扩充到80个子明文分组,我们将其记为W[t](t= 0, 1,……79),扩充的具体方法是:当0≤t≤15时,Wt = Mt;当16≤t≤79时,Wt = ( Wt-3 ⊕ Wt-8⊕ Wt-14⊕ Wt-16) <<< 1,从而得到80个子明文分组。
(4)初始化缓存
所谓初始化缓存就是为链接变量赋初值。前面我们实现MD5算法时,说过由于摘要是128位,以32位为计算单位,所以需要4个链接变量。同样SHA-1采用160位的信息摘要,也以32位为计算长度,就需要5个链接变量。我们记为A、B、C、D、E。其初始赋值分别为:A = 0x67452301、B = 0xEFCDAB89、C = 0x98BADCFE、D = 0x10325476、E = 0xC3D2E1F0。
如果我们对比前面说过的MD5算法就会发现,前4个链接变量的初始值是一样的,因为它们本来就是同源的。
(5)计算信息摘要
经过前面的准备,接下来就是计算信息摘要了。SHA1有4轮运算,每一轮包括20个步骤,一共80步,最终产生160位的信息摘要,这160位的摘要存放在5个32位的链接变量中。
在SHA1的4论运算中,虽然进行的就具体操作函数不同,但逻辑过程却是一致的。首先,定义5个变量,假设为H0、H1、H2、H3、H4,对其分别进行如下操作:
- (A)、将A左移5为与 函数的结果求和,再与对应的子明文分组、E以及计算常数求和后的结果赋予H0。
- (B)、将A的值赋予H1。
- (C)、将B左移30位,并赋予H2。
- (D)、将C的值赋予H3。
- (E)、将D的值赋予H4。
- (F)、最后将H0、H1、H2、H3、H4的值分别赋予A、B、C、D
这一过程表示如下:
而在4轮80步的计算中使用到的函数和固定常熟如下表所示:
计算轮次 | 计算的步数 | 计算函数 | 计算常数 |
第一轮 | 0≤t≤19步 | ft(B,C,D)=(B&C)|(~B&D) | Kt=0x5A827999 |
第二轮 | 20≤t≤39步 | ft(B,C,D)=B⊕C⊕D | Kt=0x6ED9EBA1 |
第三轮 | 40≤t≤59步 | ft(B,C,D)=(B&C)|(B&D)|(C&D) | Kt=0x8F188CDC |
第四轮 | 60≤t≤79步 | ft(B,C,D)=B⊕C⊕D | Kt=0xCA62C1D6 |
经过4论80步计算后得到的结果,再与各链接变量的初始值求和,就得到了我们最终的信息摘要。而对于有多个铭文分组的,则将前面所得到的结果作为初始值进行下一明文分组的计算,最终计算全部的明文分组就得到了最终的结果。
与 MD5 算法的比较
SHA1 基于 MD5,加密后的数据长度更长,
它对长度小于 264 的输入,产生长度为 160bit 的散列值。比 MD5 多 32 位。
因此,比 MD5 更加安全,但 SHA1 的运算速度就比 MD5 要慢了。
SHA1
SHA1 基于 MD5, 加密后的数据长度更长, 对于长度小于 264 的输入, 产生长度为 160bit 的散列值, 比 MD5 多 32 位.
因此, 比 MD5 更加安全, 但 SHA1 的运算速度比 MD5 要慢.
JS 实现
Python 实现
>>> import hashlib >>> str = '中国' >>> a = hashlib.sha1(str.encode('utf-8')).hexdigest() >>> a '101806f57c322fb403a9788c4c24b79650d02e77'
reference
https://www.cnblogs.com/foxclever/p/8282366.html#:~:text=%20SHA-1%E6%98%AF%E4%B8%80%E7%A7%8D%E6%95%B0%E6%8D%AE%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95%EF%BC%8C%E8%AF%A5%E7%AE%97%E6%B3%95%E7%9A%84%E6%80%9D%E6%83%B3%E6%98%AF%E6%8E%A5%E6%94%B6%E4%B8%80%E6%AE%B5%E6%98%8E%E6%96%87%EF%BC%8C%E7%84%B6%E5%90%8E%E4%BB%A5%E4%B8%80%E7%A7%8D%E4%B8%8D%E5%8F%AF%E9%80%86%E7%9A%84%E6%96%B9%E5%BC%8F%E5%B0%86%E5%AE%83%E8%BD%AC%E6%8D%A2%E6%88%90%E4%B8%80%E6%AE%B5%E5%AF%86%E6%96%87%EF%BC%8C%E4%B9%9F%E5%8F%AF%E4%BB%A5%E7%AE%80%E5%8D%95%E7%9A%84%E7%90%86%E8%A7%A3%E4%B8%BA%E8%BE%93%E5%85%A5%E4%B8%80%E4%B8%B2%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%A0%81%EF%BC%8C%E5%B9%B6%E6%8A%8A%E5%AE%83%E4%BB%AC%E8%BD%AC%E5%8C%96%E4%B8%BA%E9%95%BF%E5%BA%A6%E8%BE%83%E7%9F%AD%E3%80%81%E4%BD%8D%E6%95%B0%E5%9B%BA%E5%AE%9A%E7%9A%84%E8%BE%93%E5%87%BA%E5%BA%8F%E5%88%97%E5%8D%B3%E6%95%A3%E5%88%97%E5%80%BC%EF%BC%8C%E4%B9%9F%E7%A7%B0%E4%B8%BA%E4%BF%A1%E6%81%AF%E6%91%98%E8%A6%81%E6%88%96%E4%BF%A1%E6%81%AF%E8%AE%A4%E8%AF%81%E4%BB%A3%E7%A0%81%E7%9A%84%E8%BF%87%E7%A8%8B%E3%80%82,SHA-1%E7%AE%97%E6%B3%95%E8%BE%93%E5%85%A5%E6%8A%A5%E6%96%87%E7%9A%84%E6%9C%80%E5%A4%A7%E9%95%BF%E5%BA%A6%E4%B8%8D%E8%B6%85%E8%BF%872%2064%20%E4%BD%8D%EF%BC%8C%E4%BA%A7%E7%94%9F%E7%9A%84%E8%BE%93%E5%87%BA%E6%98%AF%E4%B8%80%E4%B8%AA160%E4%BD%8D%E7%9A%84%E6%8A%A5%E6%96%87%E6%91%98%E8%A6%81%E3%80%82