CFMLでhash_hmac同様の関数を出力するスクリプトがあります。
<cfprocessingdirective pageencoding = "iso-8859-1">
<cfset msg = "AgostinoSqueglinPiccolinMonachin">
<cfset jMsg = JavaCast("string",msg).getBytes() />
<cfset jKey = JavaCast("string","cicciolin").getBytes() />
<cfset key = createObject("java","javax.crypto.spec.SecretKeySpec") />
<cfset mac = createObject("java","javax.crypto.Mac") />
<!--- this line had to be changed to the 256 version --->
<cfset key = key.init(jKey,"hmacSHA256") />
<cfset mac = mac.getInstance(key.getAlgorithm()) />
<cfset mac.init(key) />
<cfset mac.update(jMsg) />
<cfset cc = mac.doFinal()>
<cfset strBase64Value = ToString( cc,"Utf-8" ) />
<cfscript>
writeDump(msg);
writeDump(strBase64Value);
</cfscript>
これは、このphpと同じ結果を出力するはずです。
<?php
$uu = hash_hmac('sha256', "AgostinoSqueglinPiccolinMonachin", "cicciolin", true);
echo $uu;
?>
しかし、おそらくフォーマットエラーが原因で、この異なる結果が得られました。
ColdFusion:�GK�襍}Ÿ�}��B�}9w�(���u�m�</ p>
PHP:ÐGKÒè¥}Ÿ»}©ì¬B§} 9w´(«æüu§mÃ
一部の文字が正しい方法で出力されないようです。
どうすればこれを解決できますか?
アップデート:
解決策は完全に機能しますが、改行をエンコードしようとすると他の問題があります。
例えば
PHP:
$sign = "GET\n" . "agostinsqueglin" . "". "piccolin";
$uu = base64_encode(hash_hmac('sha256', $sign, "cicciolin", true));
私が試してみると:
sign = "GET#chr(13)##chr(10)#" & "agostinsqueglin" & "" & "piccolin";
2つの異なる結果が得られました。
これは、coldfusionが"\n"改行を処理する方法によるものです...