SHA 是一系列的加密算法,有 SHA-1、SHA-2、SHA-3 三大类,而 SHA-1 已经被破解,SHA-3 应用较少,目前应用广泛相对安全的是 SHA-2 算法,这也是本篇文章重点要讲述的算法。

一、算法核心思想和特点

该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段密文,也可以简单的理解为取一串输入码,并把它们转化为长度较短、位数固定的输出序列即散列值的过程。

1. 单向性

单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。如果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确的散列值,从而保证了其安全性。SHA 将输入流按照每块 512 位进行分块,并产生 160 位的被称为信息认证代码或信息摘要的输出。

2. 数字签名

通过散列算法可实现数字签名,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要,报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。

二、hash碰撞

哈希算法的一个重要功能是产生独特的散列,当两个不同的值或文件可以产生相同的散列,则称碰撞。保证数字签名的安全性,就是在不发生碰撞时才行。碰撞对于哈希算法来说是极其危险的,因为碰撞允许两个文件产生相同的签名。当计算机检查签名时,即使该文件未真正签署,也会被计算机识别为有效的。

一个哈希位有 0 和 1 两个可能值,则每一个独立的哈希值通过位的可能值的数量对于 SHA-256,有 2 的 256 次方种组合,这是一个庞大的数值。哈希值越大,碰撞的机率就越小。每个散列算法,包括安全算法,都会发生碰撞,而 SHA-1 的大小结构发生碰撞的机率比较大,所以 SHA-1 被认为是不安全的。

三、Go语言使用SHA256算法

//方法一
func digest1(data []byte)([]byte,error){h := sha256.Sum256(data)return h[:],nil
}//方法二
func digest2(data []byte) ([]byte, error) {h := sha256.New()h.Write(data)return h.Sum(nil),nil
}

四、SHA 256 算法原理解析

SHA-256 算法输入报文的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,产生的输出是一个256-bit 的报文摘要。

SHA256算法主流程分三大模块:常量的初始化、信息预处理、使用到的逻辑运算。

1. 常量的初始化

这些常量的作用是和数据源进行计算,增加数据的加密性,那么大家可以想一下,如果常量是一些如 1、2、3 之类的整数,是不是就没什么加密可言了,所以需要这些常量很复杂,生成的规则是:对自然数中前 8 个(或 64 个)质数(2、3、5、7、11、13、17、19)的平方根的小数部分取前 32 bit(在后面的映射的过程中会用到这些常量)。

例如,2 的平方根的小数部分约为 0.414213562373095048,然后 0.414213562373095048 ≈ 6 ∗ 16−1 + a ∗ 16−2 + 0 ∗ 16−3+…

所以 2 的平方根的小数部分取前 32 bit 就得到:0 x 6a09e667。

2. SHA256 中用到两种常量

(1)8 个哈希初值=>自然数中前 8 个质数(2、3、5、7、11、13、17、19)的平方根的小数部分取前 32bit:

            h0 := 0x6a09e667h1 := 0xbb67ae85h2 := 0x3c6ef372h3 := 0xa54ff53ah4 := 0x510e527fh5 := 0x9b05688ch6 := 0x1f83d9abh7 := 0x5be0cd19

(2)64 个哈希常量=>自然数中前 64 个质数(2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89、97…)的立方根的小数部分取前 32 bit:

            428a2f98 71374491 b5c0fbcf e9b5dba53956c25b 59f111f1 923f82a4 ab1c5ed5d807aa98 12835b01 243185be 550c7dc372be5d74 80deb1fe 9bdc06a7 c19bf174e49b69c1 efbe4786 0fc19dc6 240ca1cc2de92c6f 4a7484aa 5cb0a9dc 76f988da983e5152 a831c66d b00327c8 bf597fc7c6e00bf3 d5a79147 06ca6351 1429296727b70a85 2e1b2138 4d2c6dfc 53380d13650a7354 766a0abb 81c2c92e 92722c85a2bfe8a1 a81a664b c24b8b70 c76c51a3d192e819 d6990624 f40e3585 106aa07019a4c116 1e376c08 2748774c 34b0bcb5391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3748f82ee 78a5636f 84c87814 8cc7020890befffa a4506ceb bef9a3f7 c67178f2

3. 信息预处理

预处理分两部分,第一部分是附加填充比特,第二部分是附加长度。目的是让整个消息满足指定的结构,从而处理起来可以统一化、格式化,这个也是计算机的基本思维方式,就是把复杂的数据转化为特定的格式,化繁为简、“去伪存真”。

4.附加填充比特

在报文末尾进行填充,使报文长度在对 512 取模以后的余数是 448。具体是:先补第一个比特为 1,然后都补 0,直到长度满足对 512 取模后余数是 448。需要注意即使长度已经满足对 512 取模后余数是 448,补位也必须要进行,这时要填充 512 个比特。所以,填充是至少补一位,最多补 512 位。例如:“abc”补位的过程。

  • a、b、c 对应的 ASCII 码分别是 97、98、99。
  • 对应的二进制编码为:01100001 01100010 01100011;
  • 首先补一个“1”:0110000101100010 01100011 1;
  • 然后补 423 个“0”:01100001 01100010 01100011 10000000 00000000 … 00000000;
  • 补位完成后的数据如下:
            61626380 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000

5. 附加长度值

是将原始数据的长度信息补到已经进行了填充操作的消息后面(就是第一步预处理后的信息),SHA256 用一个 64 位的数据来表示原始消息的长度。所以 SHA256 加密的原始信息长度最大是 264。

用上面的消息“abc”来操作,3 个字符,占用 24 个 bit,在进行了补长度的操作以后,整个消息就变成:

        61626380 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 00000018

6. 逻辑运算

  • ∧ → 按位“与”
  • ¬ → 按位“补”
  • ⊕ → 按位“异或”
  • Sn → 右移 n 个 bit
  • Rn → 循环右移 n 个 bit

7. 核心算法

准备工作做好了,下面开始进入算法阶段。

**数据分解:**将原始数据分解成 512-bit 大小的块,例如,消息 M 可以被分解为 n 个块,于是整个算法需要做的就是完成 n 次迭代,n 次迭代的结果就是最终的哈希值,即 256bit 的数字摘要。

每次迭代进行的映射用 Map(Hi−1)=Hi 表示,摘要的初始值 H0,经过第一个映射后,得到 H1,即完成了第一次迭代,H1 经过第二次映射得到 H2,……,依次处理,最后得到 Hn,Hn 即为最终的 256-bit 消息摘要。

在 SHA256 算法中的最小运算单元称为“字”(Word),一个字是 32 位(byte),就是 4 个字节(bit),256 个字节(bit)就是 64 个字(word)。

映射 Map(Hi−1)=Hi 包含了 64 次加密循环,即进行 64 次加密循环即可完成一次迭代,通过维基百科上的流程图来看更直观一些:

说明:

  • 深蓝色方块是事先定义好的非线性函数,里面是逻辑运算。
  • ABCDEFGH 一开始分别是八个初始值,就是预处理中第一部分的 8 个常量。
  • Kt 是第 t 个密钥,密钥从预处理中第二部分 64 个常量里取。
  • Wt 是本区块产生第 t 个 word。

原消息被切成固定长度的区块,对每一个区块,产生 n 个 word,透过重复运作循环 n 次对 ABCDEFGH 这八个工作区块循环加密。最后一次循环所产生的八段字符串合起来即是此区块对应到的散列字符串。若原消息包含数个区块,则最后还要将这些区块产生的散列字符串加以混合才能产生最后的散列字符串。

深入理解 SHA 系列加密算法及Go语言运用相关推荐

  1. 深入理解SHA系列加密算法

    介绍 SHA是一系列的加密算法,有SHA-1.SHA-2.SHA-3三大类,而SHA-1已经被破解,SHA-3应用较少,目前应用广泛相对安全的是SHA-2算法,这也是本篇文章重点讲述的算法. 算法核心 ...

  2. tea系列加密算法学习笔记

    tea系列加密算法 概述 tea算法 xtea算法 xxtea算法 总结 概述   最近在做ctf逆向的题目中多次遇到了该算法,因此打算重写一篇完整的博客来详细学习下该算法.   TEA(Tiny E ...

  3. 极速理解设计模式系列【目录索引】

    这是一个老生常谈的设计模式系列文章,本系列力图从最简洁的语言和最易理解的实例来让大家认识设计模式的思想和思路,从而在实际项目中能够用到一二.现在将本系列文章详列如下: 极速理解设计模式系列:1.建造者 ...

  4. 从需求的角度去理解Linux系列:总线、设备和驱动

    <从需求的角度去理解Linux系列:总线.设备和驱动>是一篇有关如何学习嵌入式Linux系统的方法论文章,也是从需求的角度去理解Linux系统软件的开篇.这是作者精心撰写的经验总结,希望嵌 ...

  5. 深入理解JavaScript系列(5):强大的原型和原型链

    前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大.实 ...

  6. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点

    才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会 ...

  7. 深入理解JavaScript系列:闭包(Closures)

    介绍 本章我们将介绍在JavaScript里大家经常来讨论的话题 -- 闭包(closure).闭包其实大家都已经谈烂了.尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭 ...

  8. 深入理解JavaScript系列:根本没有“JSON对象”这回事!

    前言 写这篇文章的目的是经常看到开发人员说:把字符串转化为JSON对象,把JSON对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下,供大家讨论,如有错误,请大家指出,多谢. ...

  9. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点(转)

    才华横溢的Stoyan Stefanov,在他写的由O'Reilly初版的新书<JavaScript Patterns>(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会 ...

最新文章

  1. 027_jdbc-mysql几个常用的日期类型
  2. 乐视秒杀架构解读:从零开始搭建百万每秒订单系统
  3. ABAP 新建session会话的函数
  4. 2011年12月份学习总结,在PE的前端标准思考和萌芽
  5. linux开启防火墙特定端口号
  6. HAProxy杂记(1)
  7. 会议交流 | 人工智能与机器学习创新峰会 - 知识图谱与图神经网络分会
  8. json web token没有哪个成分_SpringBoot 2.1.4集成JWT实现token验证
  9. 从零开始写触摸屏驱动(Linux4.3.2 JZ2440V3 480*272)
  10. win7与internet时间同步出错_如何解决Win7时间同步出错的问题
  11. LWR 局部加权线性回归算法
  12. php后门检测工具,phpStudy后门如何检测和修复
  13. 学生成绩表的常用查询
  14. 一次基于u2-net的人物肖像画的实践
  15. mxnet Record IO详解
  16. Java程序员,你会选择25k的996还是18k的965?
  17. 台达DVP-EH3系列PLC如何实现远程编程调试和程序上下载
  18. 七鑫易维新出VR眼球追踪技术,打破传统虚拟现实玩法
  19. (读书笔记)《玩着玩着就能成为PPT高手》——说的漂亮
  20. LCD 调屏几种现象及原因

热门文章

  1. 饰品之王 从不足百元到亿万富翁
  2. C语言商品打折算法编程,折扣日 | 算法竞赛入门必备的 《 C++ 程序设计》
  3. 已解决:导入keras(tf)训练好的模型报错解决OSError: Unable to open file (unable to open file: name = ‘model_3.h5’)
  4. 虫儿飞计算机版音乐怎么弹,虫儿飞尤克里里弹唱教学简谱怎么弹(2)
  5. 2017第三十届中国北京国际美容化妆品博览会(春季)会刊(参展商名录)
  6. 2022 找工作!我建了一个AI算法岗求职群
  7. IIS 部署 Net5 应用
  8. 5G+小程序有着怎样的代理加盟创业前景
  9. MySQL查询操作(1)
  10. php会员模版,会员中心模板