1. 前言
SHA系列算法是一种密码散列函数,由美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。现在已经被破解。
我们本文主要研究SHA256算法。
2. 什么是SHA ?
SHA算法的名称是安全散列算法,英文名称是Secure Hash Algorithm。
SHA算法分为很多版本。可以分为SHA-1和SHA-2两大类。其中SHA-2的子版本包括SHA-224,SHA-256,SHA-384,SHA-512,其输出结果分别为224、256、384、512位。与之对应的MD5算法的输出只有128位。
3. SHA256算法的特点
SHA算法具有以下特点:
- 压缩性:任意长度的数据,算出的SHA256值长度都是固定的。
- 容易计算:从原数据计算出SHA256值很容易。
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的SHA256值都有很大区别。
- 强抗碰撞:已知原数据和其SHA256值,想找到一个具有相同SHA256值的数据(即伪造数据)是非常困难的。
可以看到,这些特性和前面学习的MD5算法区块链中的密码学系列之MD5算法(二)十分的相似。除此之外SHA256相比于MD5算法还具有优势。我们来看:
- 2的128次方为340282366920938463463374607431768211456,也就是10的39次方级别
- 2的160次方为1.4615016373309029182036848327163e+48,也就是10的48次方级别
- 2的256次方为1.1579208923731619542357098500869 × 10的77次方,也就是10的77次方
宇宙中原子数大约在10的60次方到80次方之间,所以2的256次方有足够的空间容纳所有的可能,算法好的情况下冲突碰撞的概率很低。
此外,我们还可以将SHA256和MD5进行混合使用,我们可以取MD5摘要的一部分和SHA256摘要的一部分,拼成一个合成摘要。这样别人不知道规则,自然无从破解。
4. SHA256算法的底层原理
4.1 MD5的原理和SHA原理的对比
MD5把128bit的信息摘要分成A,B,C,D四段(Words),每段32bit,在循环过程中交替运算A,B,C,D,最终组成128bit的摘要结果。如下图所示:
SHA-1算法,核心过程大同小异,主要的不同点是把160bit的信息摘要分成了A,B,C,D,E五段。
SHA-2系列算法,核心过程更复杂一些,把信息摘要分成了A,B,C,D,E,F,G,H八段。
MD5算法大概可以分为以下四步:原文处理,设置初始值,循环加工,拼接结果。下面我们进行详细的分析。
4.2设置初始值
SHA256