
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=thebyte0x36repeatedBtimes
opad=thebyte0x5CrepeatedBtimes
计算‘text’的HMAC:
H(KXORopad,H(KXORipad,text))
计算步骤
在密钥K后面添加0,创建一个子长为B的字符串。(例如,如果K字长为20字节,B=60字节,K后加44个零字节0x00)
将上一步生成的B字长字符串与ipad做异或运算
将数据流text填充到第二步的结果字符串中
H作用于第三步生成的数据流
第一步生成的B字长字符串与opad做异或运算
然后将第四步的结果填充到第五步的结果中
H作用于第六步生成的数据流,输出最终结果
密钥
用于HMAC密钥可以是任何长度(比B长的密钥会先被H处理)。但当密钥长度小于L时,函数的安全强度会降低。长度大于L的密钥也可以,但额外长度不能显著提高函数的安全强度。
密钥必须随机选择(或使用基于随机种子的强大伪随机生成方法),并定期更新。目前的攻击并没有指出更换密钥的有效频率,因为这些攻击实际上是不可行的。然而,定期更新密钥是处理函数和密钥潜在缺陷的基本安全措施,可以减少泄漏密钥的危害。
HMAC算法
定义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=thebyte0x36重复B次
opad=thebyte0x5C重复B次.
计算‘text'的HMAC:
HMAC =H(KXORopad,H(KXORipad,text))
即以下步骤:
(1)在密钥K后面添加0,以创建一个字长为B的字符串。(例如,如果K字长为20字节,B=64字节,K后加4个零字节0x00)
(2)将上一步生成的B字长字符串与ipad做异或操作。
(3)数据流text填充到第二步的结果字符串中。
(4)用H作用于第三步生成的数据流。
(5)将第一步生成的B字长字符串与opad做异或操作。
(6)将第四步的结果填充到第五步的结果中。
(7)用H作用于第六步生成的数据流,输出最终结果
HMAC的典型应用
HMAC一个典型的应用程序用于“挑战/响应”(Challenge/Response)认证过程如下:
(1)首先,客户端向服务器发出验证请求。
(2)服务器生成随机数并通过网络传输给客户端(这是一个挑战)。
(3)客户端提供收到的随机数ePass,由ePass随机数和存储存在使用中ePass进行中密钥HMAC-MD运算并得到一个结果作为认证证据传输给服务器(这是响应)。
(4)同时,服务器还使用随机数和存储在服务器数据库中的客户密钥HMAC-MD5.如果服务器的运算结果与客户端的响应结果相同,则认为客户端是合法用户。