Hash算法又称hash函数、摘要算法、哈希算法、散列算法,是将一段消息按照一定规则处理后生成一段定长字符串的算法。不同于对称算法和非对称算法,hash算法没有密钥,而且算法是公开的,大家都可以通过hash算法计算一个消息的hash值
一、Hash算法特征
为了保证Hash算法的安全性,Hash算法需要满足一个要求
1、单向性:通过hash函数只能由消息获取hash值,反之则不行;
2、弱抗攻击性:对于任意给定的消息M1,寻求消息M2≠M1,使得M2的hash值与M1的hash值相同是不可行的
3、强抗攻击性:任意的消息M1、M2,使得两者的hash值相同的计算是不可行的
二、常用Hash算法
1、MD4家族
密码学中常使用的HASH算法MD4、MD5、SHA0、SHA1、SHA2(包括SHA-224、SHA-256、SHA-384、SHA-512等)都属于MD4家族,国密hash算法SM3也属于MD4家族(注1)。
MD4算法家族的一般需要预置两组数据:与最终hash值长度相等的初始hash值,和若干个常量值,然后在这个基础上进行hash值的计算。
在hash计算的过程中,需要进行两次分组:一次是对消息整体分组,将消息分为多个长度为算法分组长度的字符串;一次是对分组数据按照计算字节长度分组。其中MD5、SHA1、SHA-224、SHA-256的分组长度为512bits,计算字节长度为32bits;SHA-384、SHA-512分组长度为1024bits,计算字节长度为64bits。
令消息总长度为sL,分组长度为zL,计算字节长度为cL,填充长度为pL,MD4家族hash算法的计算过程为:
a、填充消息,先使用一个1和若干0,填充至(zL–cL*2)=(sL+pL)mod zL,然后将消息长度转换为cL*2长的二进制字符串,添加到消息尾部,获得一个长度为zL倍数的数据;
b、将填充完毕的字符串按照分组长度zL分割为n个分组;
c、将第一组数据按照计算字节长度cL分组,,与初始Hash值配合进行多轮置换后,并于初始Hash值H0结合后,输出指定长度的中间值
d、后续分组的数据同样按照cL分组并进行轮转换,然后与上一组的中间值进行结合
e、所有分组运算完后,获得最终的hash值
2、SHA-3算法
SHA2的出现是在MD5算法和SHA1算法已经不安全的情况下,通过增加输出长度提升算法安全性,当前SHA2算法还是安全的。只是当前对SHA家族的攻击过于严重,所以NIST(美国国家标准与技术研究院)在全球征集了不同于SHA家族运算方式的hash算法,SHA3应运而出。
SHA3算法采用海绵函数(如图),经过填充、分组、置换(吸水、挤压)的过程最终获取hash值。在分组时,sha3要求置换数据长度为b=5×5×(2^t),t取值为0至6,12+2t为置换轮数,2^t为使用的置换数据宽度(注2)。
SHA3算法从2015年被NIST批准,已经开始使用,而且在openssl中已经实现。具体实现不在此详述,有兴趣可自行了解。
图一海绵函数
3、其他Hash算法
还有一种Hash算法是基于分组密码的。这种算法需要设定一个初始Hash值H0,映射函数g和一个分组密码算法e。将消息x分割为定长分组xi,通过H0,g,e经过一系列计算,生成Hi,重复以上操作,最后获得hash值。
三、Hash算法的攻击
讨论Hash算法的攻击,不可避免的要说到生日悖论。
一个群体中至少有多少个人才能使出现两个人的生日在同一天的概率大于50%,答案可能出乎很多人的意料,只要23人就能使概率大于50%,而到了40人,概率就到了90%,这个就是生日悖论(注3)。从这个悖论衍生出了生日攻击。
生日攻击的一个结论是找到一个冲突所需哈希的消息数目约为2^(n/2)(n为hash输出bit数,此处证明略),如果要保证难以产生冲突,要求输出长度最少为128bits。
图二不同输出长度hash算法冲突概率与所需hash个数
而对于MD5算法和SHA1算法,有比生日攻击更加有效的方法-模差分比特分析法。
2004年,王小云院士提出该攻击方案(注4,注5),并完成对MD5算法的碰撞攻击,次年又完成了对SHA1算法的攻击,使得这两个算法不再安全。后续多位密码学领域的专家、学者完善了该攻击方案,当前已经能够以较少的算法运算次数获取两个Hash值相同的的数据。因此在实际使用中,建议使用SHA2或SHA3.
四、Hash算法使用场景
Hash算法的使用场景主要有三个:文件完整性验证、长消息签名以及密码扩展
1、文件完整性验证
从官网上下载JDK时,会发现除了下载链接外,还有一个SHA256的值(图三),而在下载某些游戏时,其官网上也会带有一个MD5值(图四),当我们完成下载后,可以使用hash工具计算响应的hash值,与官方提供的值进行比对,确认文件可用。
图四某游戏下载页面
2、长消息签名
在非对称算法中,由于私钥的计算过程较慢,如果消息过长,将会严重拖慢签名速度,而且这样计算出的签名长度要长于消息长度,在传输中存在诸多不便(消耗带宽、数据丢包等),因此引入了hash算法,借用hash算法的特性为每个消息生成一个定长的字符串,对这个字符串进行签名,可以很好的提升非对称算法的签名效率和安全性。
3、密码保存
在通过互联网注册账号时,各类网站会将密码数据使用hash算法进行保护后存储,如此,即便服务提供商也无法知晓密码的明文,即便发生拖库攻击时,也能保证我们的密码安全,减少因为多个网站使用相同账号和密码而遭受损失。当然实际使用中,不能直接使用hash算法对密码进行计算,还需要进行加盐等操作,提高安全性
注
1一般也把MD4、MD5称为MD算法族,SHA1、SHA2称为SHA家族
2参考NIST.FIPS.202
3有关生日悖论的说明网上资料很多,可自行参考
4 Collisions for Hash Functions MD4,MD5,HAVAL-128 and RIPEMD
5 MD5快速碰撞算法之研究