hmac-md5的PHP实现及原理
中文说明:
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)
一般我们采用的散列函数为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