1. 综述

  Hash算法,又称单向散列函数(one-way hash function)。
  单向散列函数有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash value)。单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来计算消息的完整性。

  单向散列函数也称为消息摘要函数(message digest function)、哈希函数或者杂凑函数。
  输入单向散列函数的消息也称为原像(pre-image)。
  单向散列函数输出的散列值 也称为消息摘要(message digest)指纹(fingerprint),相当于该消息的身份证。
  单向散列函数有多种实现方式,常见的有MD5、SHA-1、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)、SHA-3等。

2. 特性

  • 散列值长度固定
    无论消息的长度有多少,使用同一算法计算出的散列值长度总是固定的,比如MD5算法,无论输入多少,产生的散列值长度总是128比特(16字节)。

  • 消息不同其散列值也不同
    使用相同的消息,产生的散列值一定相同;使用不同的消息,产生的散列值也不相同,哪怕只有一个比特的差别,得到的散列值也会有很大的区别。这一特性也叫抗碰撞性,对于抗碰撞弱的算法,我们不应该使用。

  • 具备单向性
    单向散列函数必须具有单向性(one-way)。单向性是指无法通过散列值推算出消息的性质,通过消息计算散列值是非常容易的,但是反过来是行不通的。

3. SM3

  SM3密码杂凑算法是中国国家密码管理局2010年公布的中国商用密码杂凑算法标准。该算法于2012年发布为密码行业标准(GM/T 0004-2012),2016年发布为国家密码杂凑算法标准(GB/T 32905-2016)。
   SM3适用于商用密码应用中的数字签名和验证,是在SHA-256基础上改进实现的一种算法,其安全性和SHA-256相当。SM3和MD5的迭代过程类似,也采用Merkle-Damgard结构。消息分组长度为512位,摘要值长度为256位
   整个算法的执行过程可以概括成四个步骤:消息填充、消息扩展、迭代压缩、输出结果。

4. MD5

  MD4是由Rivest于1990年设计的单向散列函数,能够产生 128比特 的散列值(RFC1186,修订版RFC1320)。
  MD5是由Rivest于1991年设计的单向散列散列函数,能够产生 128比特 的散列值(RFC1321)。
  MD4和MD5中的MD是消息摘要(Message Digest)的缩写。目前这两个单向散列函数均已经不安全了。

5. SHAx

  SHA-1是由NIST(National Institute of Standards and Technology,美国国家标准技术研究所)设计的一种能够产生 160比特 散列值的单向散列函数。目前SHA-1已经被列入“可谨慎运用的密码清单”,即除了用于保持兼容性的目的外,其他情况下都不推荐使用。
  SHA-224、SHA-256、SHA-384和SHA-512都是由NIST设计的单向散列函数,他们的散列值长度分别为 224比特、256比特、384比特、512比特 。这些单向散列函数合起来统称SHA-2。
  SHA-2共包含下列6种版本,这6种SHA-2版本实质上都是由SHA-256和SHA-512两个版本衍生出来的。

名称 输出长度 内部状态长度 备注
SHA-224 224 32*8=256 将SHA-256的结果截掉32比特
SHA-256 256 32*8=256
SHA-512/224 224 64*8=512 将SHA-512的结果截掉288比特
SHA-512/256 256 64*8=512 将SHA-512的结果截掉256比特
SHA-384 384 64*8=512 将SHA-512的结果截掉128比特
SHA-512 512 64*8=512

6. 典型应用场景

  单向散列函数并不能确保信息的机密性,它是一种保证信息完整性的密码技术。其主要的应用场景如下:

6.1 用户密码保护

  用户在设置密码时,不记录密码本身,只记录密码的散列值,只有用户自己知道密码的明文。校验密码时,只要输入的密码正确,得到的散列值一定是一样的,表示校验正确。

6.2 接口验签

  为了保证接口的安全,可以采用签名的方式发送。发送者与接收者要有一个共享秘钥。当发送者向接收者发送请求时,参数中附加上签名(签名由共享秘钥 + 业务参数,进行单向散列函数加密生成)。接收者收到后,使用相同的方式生成签名,再与收到的签名进行比对,如果一致,验签成功。这样即可以验证业务参数是否被篡改,又能验明发送者的身份。

6.3 文件完整性校验

  文件被挂载到网站时,同时也附上其散列值和算法,比如 Tomcat 官网。用户下载后,计算其散列值,对比结果是否相同,从而校验文件的完整性。

6.4 云盘秒传

  当我们将自己喜欢的视频放到网盘上时,发现只用了几秒的时间就上传成功了,而这个文件有几个G大小,是怎么做到的呢?其实这个“秒传”功能可以利用单向散列函数来实现。
  当我们上传一个文件时,云盘客户端会先为该文件生成一个散列值。拿着这个散列值去数据库中匹配,如果匹配到,说明该文件已经在云服务器存在。只需将该散列值与用户进行关联,便可完成本次“上传”。这样,一个文件在云服务器上只会存一份,大大节约了云服务器的空间。

7. 总结

  MD5与SHA-1算法已被攻破,不应该再用于新的用途;SHA-2与SHA-3还是安全的,可以使用。
  SHA-2包括:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
  SHA-3包括:SHA3-224、SHA3-256、SHA3-384、SHA3-512。

算法 分组长度(bytes) 输出长度(hash value)(bytes) 是否安全
SM3 64 32 安全
MD4 64 16 不安全
MD5 64 16 不安全
SHA1 64 20 不安全
SHA224 64 28 安全
SHA256 64 32 安全
SHA384 128 48 安全
SHA512 128 64 安全

各种算法的链接地址如下:
【密码算法 之零】对称算法(DES,、3DES、 AES、DM5、HMAC、CMAC、SHAxx、SM3、SM4),非对称算法(RSA、ECC、ECDSA、ECDH、SM2、SM9…)

【密码算法 之八】Hash类算法(单向散列函数) MD5 \ SHA1 \ SHA224 \ SHA256 \ SHA384 \ SHA512等浅析相关推荐

  1. MessageDigest实现单向加密(MD5、SHA1、SHA-256、SHA-512)

    单向加密与双向加密 双向加密是加密算法中最常用的,它将可以直接理解的明文数据加密为不可直接理解的密文数据,然后,在需要的时候,可以使用一定的算法将这些加密以后的密文解密为原来可以理解的明文.双向加密适 ...

  2. linux密码sha512,如何在Linux上检查SHA1,SHA256和SHA512哈希 | MOS86

    你如何知道你刚才下载的4 GB文件是否已经被传输没有错误?一种方法是使用产生一个的哈希算法像人类指纹一样,生成的字符串意味着是唯一的,只有该文件可以产生该指纹.像Fedora这样的Linux发行版,提 ...

  3. 哈希算法SHA1,SHA256,SHA384,SHA512

    HASH算法,sha系列的基本写完 sha1 ,见我之前的一篇博客 http://andydhu.blog.51cto.com/3337368/824735 sha256 #include<st ...

  4. C++计算md5/sha1/sha256/sha384/sha512算法

    最近需要分析文件的特征唯一值需求,这几个哈希算法就非常有用了.特别记录一下! 算法需要openssl库的支持,如果你勤快也能把库里面依赖的代码抠出来.我就懒得的弄了.直接编译openssl库 下载op ...

  5. 单向散列函数 (Hash)

    单向散列函数 1. 单向散列函数 1.1 什么是单向散列函数 1.2 术语 1.3 单向散列函数的特性 1.4 单向散列函数的实际应用 1.4.1 检测软件是否被篡改 1.4.2 消息认证码 1.4. ...

  6. 哈希算法(hash)加密解密

    一.哈希算法(hash)加密解密介绍 哈希,英文叫做 hash. 哈希函数(hash function)可以把 任意长度的数据(字节串)计算出一个为固定长度的结果数据. 我们习惯把 要计算 的数据称之 ...

  7. 【算法大杂烩】常见算法的归类和总结——消息摘要算法

    在上一篇文章  [算法大杂烩]常见算法的归类和总结--非对称加密算法  中我们简要介绍了常见的非对称加密算法的相关知识.这次我们乘胜追击,介绍[信息摘要算法], 通过本文的阅读,你可以了解到以下知识: ...

  8. 路径规划之RRT类算法简述

    关注同名微信公众号"混沌无形",有趣好文! 原文链接:机器人空间采样算法研究现状简述(包含原文PDF百度云下载链接) 空间采样算法按照采样空间不同,可分为:状态空间采样和运动空间采 ...

  9. C语言实现hash/adler32算法(附完整源码)

    hash/adler32算法 实现hash/adler32算法的完整源码(定义,实现,main函数测试) 实现hash/adler32算法的完整源码(定义,实现,main函数测试) #include ...

最新文章

  1. 从Nginx源码谈大小写字符转化的最高效代码以及ASCII码表的科学
  2. 7、Spring -Cloud-路由网管Spring Cloud Zuul
  3. [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
  4. Android基于mAppWidget实现手绘地图(五)--如何创建地图资源
  5. SSH的各个配置文件:
  6. java forEach使用
  7. ASP.NET Core MVC I\/O编程模型
  8. JavaScript封装方法,兼容参数类型为Number和String
  9. linux操作系统中查看网络信息的命令,Linux查看系统信息命令盘点
  10. 【转】Tomcat中部署java web应用程序
  11. SAP License:SAP 更改背景图片
  12. WPF e.Systemkey的一个坑
  13. 扫地机自动回充揭秘 之开启篇
  14. 利用Lua脚本语言制作魔兽WOW插件
  15. Spring Aop源码解读
  16. talentcentral测评结果_人才测评
  17. java打印日历至Excel_如何利用Excel打印漂亮的工作日历
  18. Spark大数据技术与应用期末总结大题
  19. 项目中如何进行有效的沟通管理(一)
  20. float与double的MAX-MIN

热门文章

  1. 凡是占用内存大,cpu高的软件都是祸害,全部删掉:
  2. 基于web得数字媒体资源库系统
  3. IC卡电表及用电信息管理系统
  4. 向串口助手发送数据c语言程序,利用DSP2812编写直流电机PID调速程序(C语言)
  5. tab栏自动切换功能 鼠标移动上去取消自动切换 离开启动自动切换
  6. parallel desktop 17 安装win7 科来抓包 无网络适配器可用
  7. python有限元传热求解_有限元在传热学中的应用讲解
  8. js转换php时间戳,js对时间戳转换的方法
  9. 戴尔服务器修改分辨率,戴尔Windows Vista 中设置显示分辨率的方法
  10. 基于NXP iMX6ULL 扩展音频解码器 MAX98357A