密钥散列消息认证码-HMAC
2020-10-07 15:21:58 阿炯

HMAC(散列消息身份验证码: Hashed Message Authentication Code,缩写为HMAC)它不是散列函数,而是采用散列函数(MD5或SHA)与共享密钥一起使用的消息身份验证机制。密钥散列消息认证码(Keyed-hash message authentication code),是一种通过特别计算方式之后产生的消息认证码(MAC),使用密码散列函数,同时结合一个加密密钥。它可以用来保证资料的完整性,同时可以用来作为某个消息的身份验证。它由H.Krawezyk、M.Bellare、R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,并于1997年作为RFC 2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。



用来对消息进行认证的主要方式有以下3种:消息认证码、散列函数和消息加密

消息认证码:它是一个需要密钥的算法,可以对可变长度的消息进行认证,把输出的结果作为认证符。

散列函数:它是将任意长度的消息映射成为定长的散列值的函数,以该散列值消息摘要)作为认证符。

消息加密:它将整个消息的密文作为认证符。

近年来倾向于利用散列函数来设计MAC,原因有二:
1)、一般的散列函数的软件执行速度比分组密码的要快。
2)、密码散列函数的库代码来源广泛。

因此HMAC应运而生,HMAC是一种利用密码学中的散列函数来进行消息认证的一种机制,所能提供的消息认证包括两方面内容:
1)、消息完整性认证:能够证明消息内容在传送过程没有被修改。
2)、信源身份认证:因为通信双方共享了认证的密钥,接收方能够认证发送该数据的信源与所宣称的一致,即能够可靠地确认接收的消息与发送的一致。

HMAC是当前许多安全协议所选用的提供认证服务的方式,应用十分广泛,并且经受住了多种形式攻击的考验。

使用场景

1、服务端生成key,传给客户端;
2、客户端使用key将帐号和密码做HMAC,生成一串散列值,传给服务端;
3、服务端使用key和数据库中用户和密码做HMAC计算散列值,比对来自客户端的散列值。

按照散列函数的不同,可以有如下实现:Hmac_MD5,Hmac_sha1,Hmac_sha224,Hmac_sha256,Hmac_sha384,Hmac_sha512。

在HMAC规划之初,就有以下设计目标:
1、不必修改而直接套用已知的散列函数,并且很容易得到软件上执行速度较快的散列函数及其代码。
2、若找到或需要更快或更安全的散列函数,能够容易地代替原来嵌入的散列函数。
3、应保持散列函数的原来性能,不能因为嵌入在HMAC中而过分降低其性能。
4、对密钥的使用和处理比较简单。
5、如果已知嵌入的散列函数强度,则完全可以推断出认证机制抵抗密码分析的强度。

典型应用

HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下:
(1)先由客户端向服务器发出一个验证请求。
(2)服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
(3)客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
(4)与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。

算法描述

在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次。

若以“text”作为要计算HMAC的明文,则作如下操作:
H(K XOR opad,H(K XOR ipad,text))

也就是说,操作步骤如下:
(1)在密钥K后面填充0,使其成为长度为Bbyte的字符串;如:K是20bytes的字符串,B=64,则要填充44个字节的0x00。
(2)用第一步得到的Bbyte的字符串与ipad作XOR(按位异或);
(3)将数据流text附加到第(2)步产生的Bbyte字符串后面;
(4)对第(3)产生的数据流用散列函数H计算消息摘要;
(5)用第一步得到的Bbyte的字符串与opad作XOR(按位异或);
(6)将第(4)生成的消息摘要附加到第(5)步的Bbyte字符串之后;
(7)对第(6)产生的数据流用散列函数H计算消息摘要,作为输出。

HMAC运算利用hash算法,以一个消息M和一个密钥K作为输入,生成一个定长的消息摘要作为输出。HMAC算法利用已有的Hash函数,关键问题是如何使用密钥。HMAC的密钥长度可以是任意大小,如果小于n(hash输出值的大小),那么将会消弱算法安全的强度。建议使用长度大于n的密钥,但是采用长度大的密钥并不意味着增强了函数的安全性。密钥应该是随机选取的,可以采用一种强伪随机发生器,并且密钥需要周期性更新,这样可以减少散列函数弱密钥的危险性以及已经暴露密钥所带来的破坏。

HMAC算法更象是一种加密算法,它引入了密钥,其安全性已经不完全依赖于所使用的Hash算法,安全性主要有以下两点保证:
(1)使用的密钥是双方事先约定的,第三方不可能知道。作为非法截获信息的第三方,能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC 结果,无法根据这两个数据推算出密钥。由于不知道密钥,所以无法仿造出一致的响应。

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

HMAC的安全性依赖于散列函数H的密码学属性:
1)、抗碰撞属性;
2)、当应用于一个单独的消息分组时H的压缩函数的消息认证属性。


这里提供一个在线计算页面。

本文总结自互联网,感谢原作者。