2

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"改行を処理する方法によるものです...

4

2 に答える 2

4

あなたが提供したコードは、必要以上に時間がかかります、そして...まあ、ここに改善されたバージョンがあります:

<cfscript>
    msg       = "AgostinoSqueglinPiccolinMonachin";
    key       = "cicciolin";
    algorithm = "HmacSHA256";
    encoding  = "iso-8859-1";

    secret = createObject('java',"javax.crypto.spec.SecretKeySpec").init( charsetDecode(key,encoding) , algorithm );
    mac    = createObject('java',"javax.crypto.Mac").getInstance(algorithm);
    mac.init(secret);
    digest = mac.doFinal( charsetDecode(msg,encoding) );

    writeDump( msg );
    writeDump( toString(digest,encoding) );
</cfscript>

これは、ここでの回答とコメントに基づいています。Javaを使用してColdFusionでHMAC-SHA256ダイジェストを計算する

明らかに、通常の使用では、適切な機能にラップする必要があります。

于 2013-01-27T16:33:27.427 に答える
1

処理ディレクティブがiso-8859-1に設定されているときに、UTF-8文字列を出力しようとしているようです。変更してみてください:

<cfprocessingdirective pageencoding = "UTF-8">
于 2013-01-27T12:58:06.537 に答える