用于PHP md5函数的ColdFusion替代

时间:2015-07-16 07:26:35

标签: php coldfusion md5 coldfusion-8 hmac

我尝试在Coldfusion中实现HMAC MD5。我有相同的PHP代码。我想找出将其转换为ColdFusion的最佳方法。

PHP

  $output = hmac($key, $str);

  function hmac ($key, $data)
  {
    // RFC 2104 HMAC implementation for php.
    // Creates an md5 HMAC.
    // Eliminates the need to install mhash to compute a HMAC

    $b = 64; // byte length for md5
    if (strlen($key) > $b) {
      $key = pack("H*",md5($key));
    }
    $key  = str_pad($key, $b, chr(0x00));
    $ipad = str_pad('', $b, chr(0x36));
    $opad = str_pad('', $b, chr(0x5c));
    $k_ipad = $key ^ $ipad ;
    $k_opad = $key ^ $opad;

    return md5($k_opad  . pack("H*",md5($k_ipad . $data)));
  }

我在ColdFusion的代码中尝试了以下内容。

ColdFusion的

  <cfset outputOld = hmacEncrypt(key, input, 'HmacMD5') />
  <cfset output = binaryEncode(outputOld, 'hex') />

  <cffunction name="hmacEncrypt" returntype="binary" access="public" output="false">
    <cfargument name="signKey" type="string" required="true" />
    <cfargument name="signMessage" type="string" required="true" />
    <cfargument name="algorithm" type="string" default="HmacMD5" />
    <cfargument name="charset" type="string" default="UTF-8" />

    <cfset var msgBytes = charsetDecode(arguments.signMessage, arguments.charset) />
    <cfset var keyBytes = charsetDecode(arguments.signKey, arguments.charset) />
    <cfset var keySpec = createObject("java","javax.crypto.spec.SecretKeySpec")  />
    <cfset var mac = createObject("java","javax.crypto.Mac") />

    <cfset key = keySpec.init(keyBytes, arguments.algorithm) />
    <cfset mac = mac.getInstance(arguments.algorithm) />
    <cfset mac.init(key) />
    <cfset mac.update(msgBytes) />

    <cfreturn mac.doFinal() />
  </cffunction>

但是我得到了PHP和ColdFusion的不同值。我需要和PHP一样。

任何帮助都很有用。

1 个答案:

答案 0 :(得分:1)

我强烈建议您使用Crypto.cfc Bennadel。它提供了使用SHA-1,SHA-256和MD5算法生成Hmac值的方法,并且编写得非常干净。

另外,我更喜欢使用PHP中提供的hash_hmac()函数,因为它的性能和简单性。

string hash_hmac('md5', $input, $secretKey);

据我所知,您将字符串输出与二进制输出进行比较,这是不匹配的。 md5返回字符串输出,但doFinal()中的javax.crypto.Mac返回byte[]表示。你需要相应地进行类型转换。纠正它,结果是一样的。

更新

您可以用以下两种语言检查基本代码:

ColdFusion Code

PHP Code

如您所见,结果是一样的。老兄,这只是你的代码而且只有@Leigh指向的lcase才能正常工作。