HMAC算法安全性浅析

        1 引言

        2004年8月17日在美国加州圣巴巴拉召开的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告。报告结束时,与会者长时间起立鼓掌致敬,这在密码学会议上是少见的盛况。

        然而,更让密码学界震惊的是,2005年2月15日,在美国召开的国际信息安全RSA研讨会上,国际著名密码学专家Adi Shamir宣布,他收到了王小云、尹依群、于红波等三人的论文,论文证明SHA-1在理论上也被破解。这是继王小云破译MD5之后,国际密码学领域的又一突破性研究成果,而破译只用了两个多月的时间。

        王小云教授的研究成果作为密码学领域的重大发现宣告了固若金汤的世界通行密码标准MD5和SHA-1的堡垒轰然倒塌,引发了密码学界关于MD5和SHA-1产品是否还能够使用的大辩论。那么,使用MD5和SHA-1的HMAC算法是不是也已经不安全,应该被淘汰了?本文对HMAC算法安全性进行简单分析。

        2 HASH函数

        MD5和SHA-1是一种HASH函数,又称杂凑函数,类似于指纹的应用。在网络安全协议中,杂凑函数用来处理电子签名,将冗长的签名文件压缩为一段独特的数字信息,像指纹鉴别身份一样保证原来数字签名文件的合法性和安全性。经过这些算法的处理,原始信息即使只更动一个字母,对应的压缩信息也会变为截然不同的“指纹”,这就保证了经过处理信息的唯一性。为电子商务等提供了数字认证的可能性。

        安全的杂凑函数在设计时必须满足两个要求:

    寻找两个输入得到相同的输出值在计算上是不可行的,这就是我们通常所说的抗碰撞的;

    找一个输入,能得到给定的输出在计算上是不可行的,即不可从结果推导出它的初始状态。

  王教授的研究成果是在已知输出时,可以较容易地构造出一个输入,使输入经过HASH后,与已知的输出一致。这个成果,从理论上证明了MD5和SHA-1不是安全的HASH函数。

        3 HMAC算法

        3.1 定义[2]

        定义HMAC需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个密钥K。我们用B来表示数据块的字节数。(以上所提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16,SHA-1中L=20)。鉴别密钥的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。一般情况下,推荐的最小密钥K长度是L个字节。

        我们将定义两个固定且不同的字符串ipad,opad:(‘i','o'标志内部与外部)

        ipad = the byte 0x36 重复 B 次

        opad = the byte 0x5C 重复 B 次.

        计算‘text'的HMAC:

        HMAC = H( K XOR opad, H(K XOR ipad, text))

        即为以下步骤:

        (1) 在密钥K后面添加0来创建一个字长为B的字符串。(例如,如果K的字长是20字节,B=64字节,则K后会加入44个零字节0x00)

        (2) 将上一步生成的B字长的字符串与ipad做异或运算。

        (3) 将数据流text填充至第二步的结果字符串中。

        (4) 用H作用于第三步生成的数据流。

        (5) 将第一步生成的B字长字符串与opad做异或运算。

        (6) 再将第四步的结果填充进第五步的结果中。

        (7) 用H作用于第六步生成的数据流,输出最终结果

        3.2 HMAC的典型应用

  HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下[3]:

        (1) 先由客户端向服务器发出一个验证请求。

        (2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。

        (3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。

        (4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户

        3.3 安全性浅析

        由上面的介绍,我们可以看出,HMAC算法更象是一种加密算法,它引入了密钥,其安全性已经不完全依赖于所使用的HASH算法,安全性主要有以下几点保证:

        (1) 使用的密钥是双方事先约定的,第三方不可能知道。由3.2介绍的应用流程可以看出,作为非法截获信息的第三方,能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC结果,无法根据这两个数据推算出密钥。由于不知道密钥,所以无法仿造出一致的响应。

        (2) 王教授的研究成果不适用。王教授的研究成果是在已知输出时,可以较容易地构造出一个输入,使输入经过HASH后,与已知的输出一致。而在HMAC应用中,第三方不可能事先知道输出(如果知道,不用构造输入,直接将输出送给服务器即可)。

        (3) HMAC与一般的加密重要的区别在于它具有“瞬时”性,即认证只在当时有效,而加密算法被破解后,以前的加密结果就可能被解密。

        4 结论

  综上所述,MD5和SHA-1被破解,对实际应用的冲击要远远小于它的理论意义[1]。而且,它的冲击集中在PKI和数字签名体系中,对使用MD5和SHA-1的HMAC算法并不构成威胁。特别是象“挑战/响应”身份认证应用中,由于攻击者无法事先获得HMAC的计算结果,对系统的攻击只能使用穷举或“生日攻击”的方法,但计算量巨大,基本不可行。所以,在目前的计算能力下,可以认为HMAC算法在“挑战/响应”身份认证应用中是安全的。

参考文献

[1] 李丹,龙毅宏,“MD5被破解对实际应用的影响”,《信息安全与通信保密》总136期

[2] RFC2104--HMAC: Keyed-Hashing for Message Authentication

[3] 飞天诚信,“ePass身份认证锁在气象预报系统中的应用”