PHP代码


  1. function HmacMd5($data,$key)   
  2. {   
  3.     // RFC 2104 HMAC implementation for php.   
  4.     // Creates an md5 HMAC.   
  5.     // Eliminates the need to install mhash to compute a HMAC   
  6.     // Hacked by Lance Rushing(NOTE: Hacked means written)   
  7.   
  8.     //需要配置环境支持iconv,否则中文参数不能正常处理   
  9.     $key = iconv("GB2312","UTF-8",$key);   
  10.     $data = iconv("GB2312","UTF-8",$data);   
  11.   
  12.     $b = 64; // byte length for md5   
  13.     if (strlen($key) > $b) {   
  14.         $key = pack("H*",md5($key));   
  15.     }   
  16.     $key = str_pad($key, $b, chr(0x00));   
  17.     $ipad = str_pad('', $b, chr(0x36));   
  18.     $opad = str_pad('', $b, chr(0x5c));   
  19.     $k_ipad = $key ^ $ipad ;   
  20.     $k_opad = $key ^ $opad;   
  21.   
  22.     return md5($k_opad . pack("H*",md5($k_ipad . $data)));   
  23. }  



HMAC需要一个加密用散列函数(表示为H)和一个密钥K。


假设H是一个将数据块用一个基本的迭代压缩函数来加密的散列函数。


用B来表示数据块的长。(以上说提到的散列函数的分割数据块长B=64),用L来表示散列函数的输出数据长(MD5中L=16,SHA—1中L=20)。




 


密钥的长度可以是小于等于数据块长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列 

函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。


一般情况下,推荐的最小密钥K长度是L长。(与H的输出数据长度相等)。

​​