安全Hash函数(SHA)是使用最广泛的Hash函数。由于其他曾被广泛使用的Hash函数都被发现存在安全隐患,从2005年至今,SHA或许是仅存的Hash算法标准。

SHA发展史

  SHA由美国标准与技术研究所(NIST)设计并于1993年发表,该版本称为SHA-0,由于很快被发现存在安全隐患,1995年发布了SHA-1。

  2002年,NIST分别发布了SHA-256、SHA-384、SHA-512,这些算法统称SHA-2。2008年又新增了SHA-224。

  由于SHA-1已经不太安全,目前SHA-2各版本已成为主流。

SHA-512

  步骤1:填充附加位

  填充消息使其长度≡896(mod 1024)。填充由一个1 和后续的0组成。

  步骤2:附加长度

  在填充后的消息后附加128位的块,将其视为无符号整数,它包含前消息的长度。

  前两步的结果是产生了一个长度为1024整数倍的消息,以便分组。

  步骤3:初始化Hash缓冲区

  Hash函数中间结果和最终结果保存在512位的缓冲区,缓冲区由8个64位的寄存器(a、b、c、d、e、f、g、h)表示,并将这些寄存器初始化为下列64位的整数(十六进制)

    

  每个寄存器内容获取的方式是:取前8个素数(2、3、5、7、11、13、17、19)取平方根,取小数部分的前64位。

  步骤4:以1024位分组(128个字节)为单位处理消息并输出结果

  

  总结SHA-512的运算如下:

    H0 = IV

    Hi = Hi-1+F(Hi-1,Mi)

    MD = HN

  IV是第三步中定义的abcdefgh缓冲区的初始值

  Hi是第i个消息分组处理的最后一轮的输出

  N为消息(包括填充和长度域)中的分组数

  MD表示最后的消息摘要值

  F表示轮函数

  +为模264位加

  轮函数的核心是具有80轮运算的模块,在图11.8中,该模块标记为F。下图是它的逻辑原理。

    

  Kt是轮常数,每一轮的轮常数均不相同,用来使每轮的计算不同。这些常数获得方法如下:对前80个素数开立方根,取小数部分前64位。这些常数提供了64位随机串集合,可以初步消除输入数据中的统计规律。

  对分组Mi进行消息扩展生成Wt,每个Wt64位,前16个Wt直接取自当前分组。余下的值按如下方式导出

    Wt = δ1512(Wt-2) + Wt-7 + δ0512(Wt-15) + Wt-16

      δ1512(x) = ROTR1(x)⊕ROTR8(x)⊕SHR7(x)

      δ0512(x) = ROTR19(x)⊕ROTR61(x)⊕SHR6(x)

        ROTRn(x)为对64位的变量x循环右移n位

        SHRn(x)为对64位变量x向左移n位,右边填充0

        +为模264位加

  

  轮函数每一轮操作如下图

    

  从上图可以看出,轮函数有两个特点:

    1、轮函数输出的8个字中的6个是通过简单的轮置换实现的。如上图的阴影部分。

    2、输出中只有2个字通过替代操作产生。

      字e是将输入变量(d,e,f,g,h)以及轮常数Kt和轮消息Wt作为输入的函数。

      字a是将除d之外的输入变量以及轮常数Kt和轮消息Wt作为输入的函数。

        T1 = h + Ch(e,f,g) + (∑1512e) + Wt + Kt

        T2 = (∑0512a) + Maj(a,b,c)

        e = d + T1

        a = T1 + T2

      其中:

        t为步骤数,0≤t≤79

        Ch(e,f,g) = (e AND f)⊕(NOT e AND g)        条件函数(位运算):如果e,则f,否则g

        Maj(a,b,c) = (a AND b)⊕(a AND c)⊕(b AND c)    当且仅当变量的多数(2个或者3个)为真时函数为真

        (∑0512a) = ROTR28(a)⊕ROTR34(a)⊕ROTR39(a)

        (∑1512e) = ROTR14(e)⊕ROTR18(e)⊕ROTR41(e)

SHA-512算法具有如下特性:Hash码的每一个位都是全部输入位的函数。基本函数F多次复杂重复运算使得结果充分混淆,从而使得随机选择两个消息,甚至于这两个消息有相似的特征,都不太可能产生相同的Hash码。除非SH-512中存在目前未公开的隐藏缺陷,找到两个具有相同摘要的消息的复杂度需要2256次操作,给定摘要寻找消息的复杂度需要2512次操作。

    

    

SHA算法的更多相关文章

  1. SHA算法摘要处理

    byte[] input="sha".getBytes();//待做消息摘要算法的原始信息,可以是任意字符串 MessageDigest sha=MessageDigest.get ...

  2. 密码学系列之:NIST和SHA算法

    目录 简介 SHA1 SHA2 SHA3 简介 SHA算法大家应该都很熟悉了,它是一个用来计算hash的算法,目前的SHA算法有SHA1,SHA2和SHA3种.这三种算法都是由美国NIST制定的. N ...

  3. SHA算法(及示例)演变历史

    安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法.能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的 ...

  4. SHA算法:签名串SHA算法Java语言参考(SHAHelper.java)

    SHAHelper.java package com.util; /** * @author wangxiangyu * @date:2017年10月16日 上午9:00:47 * 类说明:SHA签名 ...

  5. SHA安全散列算法简析

    1 SHA算法简介 1.1 概述 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散 ...

  6. 散列算法-SHA

    一种生成信息摘要的算法.主要用于数据一致性和完整性的校验 SHA算法分很多版本,最大的分类是SHA-1和SHA-2.SHA-2包括很多子版本,SHA-224,SHA-256,SHA-384,SHA-5 ...

  7. 【转】java MessageDigest类的作用 :提供信息摘要 算法( MD5 或 SHA 等)的功能

    一.结构和概述: java.lang.Object java.security.MessageDigestSpi java.security.MessageDigest 声明:public abstr ...

  8. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  9. 使用BCrypt算法加密存储登录密码用法及好处

    //导入import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** *使用BCrypt算法加密存储登录密码 ...

随机推荐

  1. Linux学习之CentOS(六)---mount挂载设备(u盘,光盘,iso等 )

    对于新手学习,mount 命令,一定会有很多疑问.其实我想疑问来源更多的是对linux系统本身特殊性了解问题. linux是基于文件系统,所有的设备都会对应于:/dev/下面的设备.如: [cheng ...

  2. BI之SSIS入门最新版Visual Studio调试技巧

    简介 最近公司业务需要用到BI SSIS,SSIS是什么?"SSIS是Microsoft SQL Server Integration Services的简称,是生成高性能数据集成解决方案( ...

  3. electron-vue 初体验

    注意事项 首先确保node和npm是最新版本 避免使用镜像(我淘宝镜像安装有报错现象) 避免window的一些坑 若上一项检查完成,我们可以继续设置所需的构建工具.使用 windows-build-t ...

  4. 【阿里聚安全·安全周刊】Google“手枪”替换 | 伊朗中央银行禁止加密货币

    本周七个关键词:Google"手枪"替换丨IOS 漏洞影响工业交换机丨伊朗中央银行禁止加密货币丨黑客针对医疗保健丨付费DDoS攻击丨数据获利的8种方式丨MySQL 8.0 正式版 ...

  5. Cookie&Seesion会话 共享数据 工作流程 持久化 Servlet三个作用域 会话机制

    Day37 Cookie&Seesion会话 1.1.1 什么是cookie 当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中.这样,当该浏览器 ...

  6. Oracle中备份用户对象的两种方法

    方法1: 执行步骤: exp userid=用户名/密码@数据库名 file=c:\emp.dmp 使用当前用户导出 exp userid=sys/sys@数据库名 file=c:\emp.dmp o ...

  7. python的模块与包的导入

    类似于C语言的包含头文件去引用其他文件的函数,python也有类似的机制,常用的引入方法有以下 import 模块名 #模块名就是py文件名 #使用这种方法以后调用函数的时候要使用模块名.函数名()这 ...

  8. 匿名函数lambda

    匿名函数的定义 在python中,匿名函数的定义如下: func =lambda x:x+1 #定义匿名函数,x为传参,x+1为返回值,func为函数名 res = func(10) #执行匿名函数 ...

  9. css 中calc无效属性值问题

    width:calc(50%-20px); 这样书写是无效的因为calc中计算的两个因子同运算符号之间必须存在空格:

  10. 关于bedtools merge 功能中sort 命令的解释

    Bedtools 是一个很好的用来处理区间的工具,很多时候用这个底层语言编写的小工具比自己写的脚本运行快很多,但是这个工具中的某些功能对输入文件有一定的要求,比如说里面的一个merge函数,这是里面的 ...