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

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…)

猜你喜欢

转载自blog.csdn.net/KXue0703/article/details/129280020