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[]
表示。您需要相应地进行类型转换。更正一下,结果一样。
更新
您可以查看两种语言的基本代码:
如你所见,结果是一样的。伙计,这只是您的代码,并且仅添加 @Leigh.
所指出的 lcase
就可以正常工作
我已经尝试在 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[]
表示。您需要相应地进行类型转换。更正一下,结果一样。
更新
您可以查看两种语言的基本代码:
如你所见,结果是一样的。伙计,这只是您的代码,并且仅添加 @Leigh.
所指出的lcase
就可以正常工作