HMAC算法安全性浅析

HMAC算法安全性浅析


HMAC,全称为“Hash Message Authentication Code”,中文名“散列消息鉴别码”,主要是利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。一般的,消息鉴别码用于验证传输于两个共  同享有一个密钥的单位之间的消息。HMAC 可以与任何迭代散列函数捆绑使用。MD5 和 SHA-1 就是这种散列函数。 HMAC 还可以使用一个用于计算和确认消息鉴别值的密钥。

HMAC,散列消息鉴别码,是基于密钥的 Hash 算法的认证协议。它的实现原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即 MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。 

这种结构的主要作用是:
  • 不用修改就可以使用适合的散列函数,而且散列函数在软件方面表现的很好, 并且源码是公开和通用的。
  • 可以保持散列函数原有的性能而不致使其退化。
  • 可以使得基于合理的关于底层散列函数假设的消息鉴别机制的加密强度分析 便于理解。
  • 当发现或需要运算速度更快或更安全的散列函数时,可以很容易的实现底层 散列函数的替换。

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

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

  • ipad = the byte 0x36 repeated B times
  • opad = the byte 0x5C repeated B times

计算‘text’的 HMAC:

  • H (K XOR opad, H (K XOR ipad, text))

计算步骤

  • 在密钥 K 后面添加 0 来创建一个子长为 B 的字符串。(例如,如果 K 的字长是 20 字节,B=60 字节,则 K 后会加入 44 个零字节0x00)
  • 将上一步生成的 B 字长的字符串与 ipad 做异或运算
  • 将数据流 text 填充至第二步的结果字符串中
  • 用 H 作用于第三步生成的数据流
  • 将第一步生成的 B 字长字符串与 opad 做异或运算
  • 再将第四步的结果填充进第五步的结果中
  • 用 H 作用于第六步生成的数据流,输出最终结果

密钥

用于 HMAC 的密钥可以是任意长度(比 B 长的密钥将首先被 H 处理)。但当密钥  长度小于 L 时,会降低函数的安全强度。长度大于  L 的密钥也是可以的,但额外的长度并不能显著的提高函数的安全强度。

密钥必须随机选取(或使用强大的基于随机种子的伪随机生成方法),并且要周期 性的更新。目前的攻击没有指出一个有效的更换密钥的频率,因为那些攻击实际上并 不可行。然而,周期性更新密钥是一个对付函数和密钥所存在的潜在缺陷的基本 的安全措施,并可以降低泄漏密钥带来的危害。

        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身份认证锁在气象预报系统中的应用”
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值