每日更新
hmac-md5的PHP实现及原理
2018-3-21 luke


QQ截图20180321151350.pngQQ截图20180321151757.png




中文说明:


HMAC算法的实现过程需要一个加密用的散列函数(表示为H)和一个密钥。

一般我们采用的散列函数为Md5或者SHA-1,这两个散列函数的分割数据块长度都是64字节,即512位,HMAC-MD5算法就是采用密钥加密+Md5信息摘要的方式形成新的密文。

由于数据块长度为64,为了保证密钥+data进行digest的时候的数据完整性(为什么需要保证?)最终加进数据的密钥保证为64个字节长。

密钥的长度可以是小于等于数据块长度的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先使用散列函数H作用于它,然后用H输出的L长度字符串作为MAC中实际使用的密钥。一般情况下,推荐的最小密钥K长度是L长(与H的输出数据长度相等,比如MD5的L就是16字节,SHA-1是20字节)

过程如下:

(1) 在密钥key后面添加0来创建一个长为B(64字节)的字符串(str);

(2) 将上一步生成的字符串(str) 与ipad(0x36)做异或运算,形成结果字符串(istr)

(3) 将数据流data附加到第二步的结果字符串(istr)的末尾

(4) 做md5运算于第三步生成的数据流(istr)

(5) 将第一步生成的字符串(str) 与opad(0x5c)做异或运算,形成结果字符串(ostr)

(6) 再将第四步的结果(istr) 附加到第五步的结果字符串(ostr)的末尾

(7) 做md5运算于第6步生成的数据流(ostr),最终输出结果(out)




注:http://cseweb.ucsd.edu/~mihir/papers/kmd5.pdf