我尝试在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一样。
任何帮助都很有用。
答案 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[]
表示。你需要相应地进行类型转换。纠正它,结果是一样的。
您可以用以下两种语言检查基本代码:
如您所见,结果是一样的。老兄,这只是你的代码而且只有@Leigh指向的lcase
才能正常工作。