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-22422432*8=256将SHA-256的结果截掉32比特SHA-25625632*8=256SHA-512/22422464*8=512将SHA-512的结果截掉288比特SHA-512/25625664*8=512将SHA-512的结果截掉256比特SHA-38438464*8=512将SHA-512的结果截掉128比特SHA-51251264*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)是否安全SM36432安全MD46416不安全MD56416不安全SHA16420不安全SHA2246428安全SHA2566432安全SHA38412848安全SHA51212864安全

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

参考阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。