- 中文名
- 哈希消息认证码
- 外文名
- Hash-based Message Authentication Code
- 缩 写
- HMAC
- 功 能
- 提供消息认证
- 应 用
- IPSec协议等
- 所属学科
- 密码学
随着Internet的不断发展,网络安全问题日益突出。为了确保接收方所接收到的报文数据的完整性,人们采用消息认证来验证上述性质。用来对消息进行认证的主要方式有以下3种:消息认证码、散列函数和消息加密。
消息认证码:它是一个需要密钥的算法,可以对可变长度的消息进行认证,把输出的结果作为认证符。
散列函数:它是将任意长度的消息映射成为定长的散列值的函数,以该散列值消息摘要)作为认证符。
消息加密:它将整个消息的密文作为认证符。
①一般的散列函数的软件执行速度比分组密码的要快。
①消息完整性认证:能够证明消息内容在传送过程没有被修改。
②信源身份认证:因为通信双方共享了认证的密钥,接收方能够认证发送该数据的信源与所宣称的一致,即能够可靠地确认接收的消息与发送的一致。
HMAC是当前许多安全协议所选用的提供认证服务的方式,应用十分广泛,并且经受住了多种形式攻击的考验。 [1]
在HMAC规划之初,就有以下设计目标:
1·不必修改而直接套用已知的散列函数,并且很容易得到软件上执行速度较快的散列函数及其代码。
2·若找到或需要更快或更安全的散列函数,能够容易地代替原来嵌入的散列函数。
3·应保持散列函数的原来性能,不能因为嵌入在HMAC中而过分降低其性能。
4·对密钥的使用和处理比较简单。
5·如果已知嵌入的散列函数强度,则完全可以推断出认证机制抵抗密码分析的强度 [1]。
在HMAC的定义中用到一个密码散列函数H和一个密钥K。假设H是一个能够对明文进行分组循环压缩的散列函数,B为散列函数的明文分组长度(byte),在上述的散列函数中B=64,L为散列函数的输出长度(byte),MD5中L=16,SHA-1中L=20。认证密钥K可以为任意长度,一般密钥长度应大于明文分组的长度,将密钥的第一次散列值作为HMAC真正使用的密钥,密钥的最小推荐长度为Lbytes。
再定义两个不同的固定字符串ipad和opad如下(“i”和“o”表示内部和外部):
ipad=一个字节(byte)的0x36重复B次;
opad=一个字节(byte)的0x5C重复B次。
H(K XOR opad,H(K XOR ipad,text))
也就是说,操作步骤如下:
(1)在密钥K后面填充0,使其成为长度为Bbyte的字符串;如:K是20bytes的字符串,B=64,则要填充44个字节的0x00。
(3)将数据流text附加到第(2)步产生的Bbyte字符串后面;
(4)对第(3)产生的数据流用散列函数H计算消息摘要;
(5)用第一步得到的Bbyte的字符串与opad作XOR(按位异或);
(6)将第(4)生成的消息摘要附加到第(5)步的Bbyte字符串之后;
(7)对第(6)产生的数据流用散列函数H计算消息摘要,作为输出 [2]。
HMAC运算利用hash算法,以一个消息M和一个密钥K作为输入,生成一个定长的消息摘要作为输出。HMAC算法利用已有的Hash函数,关键问题是如何使用密钥。
HMAC的密钥长度可以是任意大小,如果小于n(hash输出值的大小),那么将会消弱算法安全的强度。建议使用长度大于n的密钥,但是采用长度大的密钥并不意味着增强了函数的安全性。密钥应该是随机选取的,可以采用一种强伪随机发生器,并且密钥需要周期性更新,这样可以减少散列函数弱密钥的危险性以及已经暴露密钥所带来的破坏 [1]。
(1)使用的密钥是双方事先约定的,第三方不可能知道。作为非法截获信息的第三方,能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC 结果,无法根据这两个数据推算出密钥。由于不知道密钥,所以无法仿造出一致的响应。
(2)HMAC与一般的加密重要的区别在于它具有“瞬时"性,即认证只在当时有效,而加密算法被破解后,以前的加密结果就可能被解密。
HMAC的安全性依赖于散列函数H的密码学属性:①抗碰撞属性;②当应用于一个单独的消息分组时H的压缩函数的消息认证属性 [3]。
HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下:
(1)先由客户端向服务器发出一个验证请求。
(3)客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
(4)与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户 [4]。