HMAC是一种利用哈希函数构造消息认证码的方法
HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思。
HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC
,如果将来设计出的新的单向散列函数,也同样可以使用。
使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-384、HMAC-SHA-512
过程:(计算text内容的HMAC值)
H( K XOR opad, H(K XOR ipad, text))
我们假设H是一个将数据块用一个基本的迭代压缩函数来加密的散列函数。 我们用B来表示数据块的字长(即分组长度)。(以上说提到的散列函数的分割数据块字长B=64), 用L来表示散列函数的输出数据字长(MD5中L=16(128位),SHA—1中L=20(160位))。 K是一个密钥,H是HMAC的加密用的散列函数,XOR异或运算,
我们将定义两个固定且不同的字符串ipad,opad: (‘i‘,‘o‘标志内部与外部) ipad = the byte 0x36 repeated B times opad = the byte 0x5C repeated B times.
考虑到密钥K的长度可能小于B,所以:
当K长度小于B(即分组长度)时,则在K之后补0(即0x00),直到其长度达到单向散列函数的分组长度B为止。 (例如,如果K的字长是20字节,B=64字节,则K后会加入44个零字节0x00) 当密钥K的长度大于分组长度B时,首先使用散列函数H处理K,然后H输出的L长度的字符串作为K,即K=H(K)。
计算‘text‘的HMAC: H( K XOR opad, H(K XOR ipad, text))
(1) 密钥填充:(当K长小于分组长度B时)在密钥K后面添加0来创建一个子长为B的字符串。 (例如,如果K的字长是20字节,B=64字节,则K后会加入44个零字节0x00) 若K长大于分组长度B,则K=H(K),先用散列函数H处理K。
(2)填充后的密钥与ipad的XOR: 将上一步生成的B字长的字符串与ipad做异或运算xor。
(3)与消息组合: 将数据流text填充至第二步的结果字符串中。
(4) 计算散列值:用H作用于第三步生成的数据流。
(5) 填充后的密钥与opad的XOR:将第一步生成的B字长字符串与opad做异或运算。
(6) 与散列值组合:再将第四步的结果填充进第五步的结果中。
(7) 计算散列值:用H作用于第六步生成的数据流,输出最终结果。
HMAC的典型应用 HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下: (1) 先由客户端向服务器发出一个验证请求。 (2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。 (3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。 (4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户 。
记住公式:H( K XOR opad, H(K XOR ipad, text))就ok了