PHP md5 函数的 ColdFusion 替代方案

ColdFusion alternative for PHP md5 function

我已经尝试在 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.

相同的结果

非常感谢任何帮助。

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

此外,我更愿意使用 PHP 中可用的 hash_hmac() 函数,因为它的性能和简单性。

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

据我所知,您是在将字符串输出与二进制输出进行比较,两者不匹配。 md5 returns 一个字符串输出但是 doFinal()javax.crypto.Mac returns 一个 byte[] 表示。您需要相应地进行类型转换。更正一下,结果一样。

更新

您可以查看两种语言的基本代码:

ColdFusion Code

PHP Code

如你所见,结果是一样的。伙计,这只是您的代码,并且仅添加 @Leigh.

所指出的 lcase 就可以正常工作