SHA256安全散列算法

2024-04-03 07:08
文章标签 算法 安全 散列 sha256

本文主要是介绍SHA256安全散列算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SHA256是安全散列算法SHA(Secure Hash Algorithm)系列算法之一,其摘要长度为256bits,即32个字节,故称SHA256。SHA系列算法是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等变体。主要适用于数字签名标准(DigitalSignature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。下面介绍该算法计算消息摘要的原理。

对于任意长度(按bit计算)的消息,SHA256都会产生一个32个字节长度数据,称作消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据是否发生改变,即验证其完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
  SHA算法有如下特性:1.不可以从消息摘要中复原信息;2.两个不同的消息不会产生同样的消息摘要。
  一、术语和概念
  (一)位(Bit),字节(Byte)和字(Word)
  SHA始终把消息当成一个位(bit)字符串来处理。本文中,一个“字”(Word)是32位,而一个“字节”(Byte)是8位。比如,字符串“abc”可以被转换成一个位字符串:01100001 01100010 01100011。它也可以被表示成16进制字符串:0x616263.
   二、SHA256算法描述
  (一)补位
  信息必须进行补位,以使其长度在对512取模以后的余数是448。也就是说,(补位后的消息长度)Q2 = 448。即使长度已经满足对512取模后余数是448,补位也必须要进行。
  补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448。总而言之,补位是至少补一位,最多补512位。以信息“abc”为例显示补位的过程。
  原始信息:01100001 01100010 01100011
  补位第一步:0110000101100010 01100011 1
  首先补一个“1”
  补位第二步:0110000101100010 01100011 10…..0
  然后补423个“0”
  我们可以把最后补位完成后的数据用16进制写成下面的样子
  61626380 0000000000000000 00000000
  00000000 0000000000000000 00000000
  00000000 0000000000000000 00000000
  00000000 00000000
  现在,数据的长度是448了,我们可以进行下一步操作。
  (二)补长度
  所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。通常用一个64位的数据来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0。在进行了补长度的操作以后,整个消息就变成下面这样了(16进制格式)
  61626380 0000000000000000 00000000
  00000000 0000000000000000 00000000
  00000000 0000000000000000 00000000
  00000000 0000000000000000 00000018
  如果原始的消息长度超过了512,我们需要将它补成512的倍数。然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要。
  (三)使用的常量
  在SHA256算法中,用到64个常量,这些常量是对自然数中前64个质数的立方根的小数部分取前32bit而来。这64个常量如下:
    428a2f98 71374491 b5c0fbcf e9b5dba5 
        3956c25b 59f111f1 923f82a4 ab1c5ed5 
        d807aa98 12835b01 243185be 550c7dc3 
        72be5d74 80deb1fe 9bdc06a7 c19bf174 
        e49b69c1 efbe4786 0fc19dc6 240ca1cc 
        2de92c6f 4a7484aa 5cb0a9dc 76f988da 
        983e5152 a831c66d b00327c8 bf597fc7 
        c6e00bf3 d5a79147 06ca6351 14292967 
        27b70a85 2e1b2138 4d2c6dfc 53380d13 
        650a7354 766a0abb 81c2c92e 92722c85 
        a2bfe8a1 a81a664b c24b8b70 c76c51a3 
        d192e819 d6990624 f40e3585 106aa070 
        19a4c116 1e376c08 2748774c 34b0bcb5  
        391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3 
        748f82ee 78a5636f 84c87814 8cc70208 
        90befffa a4506ceb bef9a3f7 c67178f2
 
  (四)需要使用的函数
   CH(x, y, z) = (x AND y) XOR ( (NOT x) AND z)  
        MAJ( x, y, z) = (x AND y) XOR (x AND z) XOR (y AND z)  
        BSIG0(x) = ROTR^2(x) XOR ROTR^13(x) XOR ROTR^22(x)  
        BSIG1(x) = ROTR^6(x) XOR ROTR^11(x) XOR ROTR^25(x)  
        SSIG0(x) = ROTR^7(x) XOR ROTR^18(x) XOR SHR^3(x)  
        SSIG1(x) = ROTR^17(x) XOR ROTR^19(x) XOR SHR^10(x) 
        其中x、y、z皆为32bit的字。
        ROTR^2(x)是对x进行循环右移2位。
 
  (五)计算消息摘要
        基本思想:就是将消息分成N个512bit的数据块,哈希初值H(0)经过第一个数据块得到H(1),H(1)经过第二个数据块得到H(2),......,依次处理,最后得到H(N),然后将H(N)的8个32bit连接成256bit消息摘要
        I、哈希初值H(0)
        SHA256算法中用到的哈希初值H(0)如下
        H(0)0 = 6a09e667 
        H(0)1 = bb67ae85  
        H(0)2 = 3c6ef372 
        H(0)3 = a54ff53a 
        H(0)4 = 510e527f 
        H(0)5 = 9b05688c 
        H(0)6 = 1f83d9ab 
        H(0)7 = 5be0cd19
注:这些初值是对自然数中前8个质数3、5、7、11等的平方根的小数部分取前32bit而来。
       
        II、 计算过程中用到的三种中间值
        1、64个32bit字的message schedule标记为w0、w1、…、w63。
        2、8个32bit字的工作变量标记为a、b、c、d、e、f、g。
        3、包括8个32bit字的哈希值标记为H(i)0、…、H(i)7。
       
        III、 工作流程
        原始消息分为N个512bit的消息块。每个消息块分成16个32bit的字标记为M(i)0、M(i)1、M(i)2、…、M(i)15然后对这N个消息块依次进行如下处理
        For i=1 to N
     1)   For t = 0 to 15 
                     Wt = M(i)t 
                 For t = 16 to 63 
                     Wt = SSIG1(W(t-2)) + W(t-7) + SSIG0(t-15) + W(t-16) 
         2)  a = H(i-1)0 
                b = H(i-1)1 
                c = H(i-1)2 
                d = H(i-1)3 
                e = H(i-1)4 
                f = H(i-1)5 
                g = H(i-1)6 
                h = H(i-1)7
         3)For t = 0 to 63 
                    T1 = h + BSIG1(e) + CH(e,f,g) + Kt + Wt 
                    T2 = BSIG0(a) + MAJ(a,b,c) 
                    h = g
                    g = f 
                    f = e 
                    e = d + T1 
                    d = c 
                    c = b 
                    b = a 
                    a = T1 + T2
 
           4)H(i)0 = a + H(i-1)0 
                 H(i)1 = b + H(i-1)1 
                 H(i)2 = c + H(i-1)2 
                 H(i)3 = d + H(i-1)3 
                 H(i)4 = e + H(i-1)4 
                 H(i)5 = f + H(i-1)5  
                 H(i)6 = g + H(i-1)6 
                 H(i)7 = h + H(i-1)7
对N个消息块依次进行以上四步操作后将最后得到的H(N)0、H(N)1、H(N)2、…、H(N)7串联起来即可得到最后的256bit消息摘要。
 
    三、SHA算法安全吗?
        2013年9月10日美国约翰霍普金斯大学的计算机科学教授,知名的加密算法专家,Matthew Green被NSA要求删除他的一份关于破解加密算法的与NSA有关的博客。 同时约翰霍普金斯大学服务器上的该博客镜像也被要求删除。但当记者向该大学求证时,该校称从未收到来自NSA的要求要删除博客或镜像的资料,但记者却无法在原网址再找到该博客。幸运的是,从谷歌的缓存可以找到该博客。该博客提到NSA每年花费2.5亿美元来为自己在解密信息方面获取优势,并列举了NSA的一系列见不得人的做法。在BitcoinTalk上,已经掀起了一轮争论:到底SHA256是否安全?
         部分认为不安全的观点包括:
NSA制造了sha256, 我们不相信NSA,他们不可能不留后门。
棱镜事件已经明白的告诉我们,政府会用一切可能的手段来监视与解密。
虽然有很多人会研究SHA-2,且目前没有公开的证据表明有漏洞。但没有公开这并不能代表就没有,因为发现漏洞的人一定更倾向于保留这个秘密来自己利用,而不是公布。
部分认为安全的观点包括:
SHA-2是应用广泛的算法,应该已经经历了实践的检验。
美国的对头中国和俄国都有很多杰出的数学家,如果有问题的话,他们肯定已经发现了。

如果真的不安全,世界上安全的东西就太少了,我不能生活在提心吊胆里,所以我选择相信安全。

http://blog.sina.com.cn/s/blog_d66494300102wz0z.html

这篇关于SHA256安全散列算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/872226

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第