簡體   English   中英

C# 到 Coldfusion 的 Base64String 轉換

[英]C# to Coldfusion for Base64String translation

嘗試將 C# 代碼轉換為 CF 並且我堅持翻譯以下行

StorageKey = 'abcd';
Convert.FromBase64String(StorageKey)

上面的行產生了一個 105,183,29 的字節數組

該行取自 Azure 的創建授權標頭;

System.Security.Cryptography.HMACSHA256 SHA256 = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String(StorageKey));

我在 msdn 庫上查找了 FromBase64String 方法,但它超出了我的頭腦。 我希望有人能指出我正確的 Coldfusion 方向。

我試過 BinaryDecode(StorageKey,"BASE64"),對我來說這似乎是最合乎邏輯的翻譯,但我返回 105-7329,這不是我的預期結果。

請參閱下面關於 CF10+ 的 Leigh 回答,如果您使用 CF7-9 解決方案,這是我的嘗試

var javaMsg = javacast("string", arguments.sigMsg).getBytes("UTF-8");
var javaKey    = JavaCast("string", arguments.sigKey);
var myKey     = createObject('java', 'javax.crypto.spec.SecretKeySpec' );
var mac     = createObject('java', "javax.crypto.Mac");
var myKeyB64  = CreateObject("java", "org.apache.commons.codec.binary.Base64").decodeBase64(javaKey.getBytes());
var secret  = myKey.Init(myKeyB64, 'HmacSHA256');
mac         = mac.getInstance("HmacSHA256");
mac.init(secret);
</cfscript>
<cfdump var="#mac.doFinal(javaMsg)#">

C# 將結果視為無符號字節,而 ColdFusion 將它們視為有符號字節。

128 以下的值在 C# 和 ColdFusion 中是相同的,而 C# 中超過 128 的值在 ColdFusion 中是負數(二進制補碼)。

因此,要轉換回來,請將 256 添加到任何負值。

編輯

對於從 BinaryDecode 返回的實際字節,這可能不是問題。 在調試期間,ColdFusion 如何決定將這些字節打印到屏幕上可能只是一個問題。

比較從 C# 和 ColdFusion 獲得的實際二進制值(例如,通過將值保存到二進制文件而不是打印到屏幕)。

該行取自 Azure 的創建授權標頭;

mbeckish 關於 C# 和 CF/java 之間的符號差異是正確的。 但是,我認為內部表示不會對您的最終結果產生任何影響,這通常是您關心的全部。 通常您不需要匹配低級整數值,只需匹配 base64 或十六進制字節的字符串表示 只要您以通用格式(如 base64)比較最終的 HMAC 值,它們就應該完全相同。

例如,如果您在此處獲取示例簽名字符串,則 CF10 和 C# 都返回相同的值。 因此,您的問題似乎是其他問題。

<cfscript>
    savecontent variable="signatureString" {
        WriteOutput("GET#chr(10)##chr(10)##chr(10)##chr(10)#x-ms-date:Mon, 01 Dec 2008 05:17:57 GMT#chr(10)#/accountname/queuename/messages");
    };
    key = binaryDecode("abcd", "base64");
    resultInHex = hmac(signatureString, key,"HMACSHA256");
    // result: wxR7Bt6sWEKVJ9vEjCiuqA8OKCZOKYfbxaXj85whOkM=
    WriteDump(binaryEncode(binaryDecode(resultInHex, "hex"), "base64"));
</cfscript>



編輯:我知道有很多 CF10 之前的 hmac 函數。 但是他們中的許多人忘記了編碼。 這是接受算法(“hmacsha256”、“hmacsha1”、..)和編碼(“utf-8”)的通用改編。 應該適用於 CF7-9。

<cfset result = hmacX( signatureString, "abcd", "HmacSHA256") />
<cfdump var="#result#" />

<cffunction name="hmacX" returntype="string" hint="">
    <cfargument name="message" type="string" required="true" />
    <cfargument name="keyInBase64" type="any" required="true" />
    <cfargument name="algorithm" type="string" default="HmacSHA256" />
    <cfargument name="encoding" type="string" default="UTF-8" />

    <cfset var dataBytes  = charsetDecode( arguments.message, arguments.encoding ) />
    <cfset var keyBytes  = binaryDecode( arguments.keyInBase64, "base64" ) />
    <cfset var keySpec = createObject("java", "javax.crypto.spec.SecretKeySpec") />
    <cfset var secret = keySpec.init( keyBytes, arguments.algorithm ) />
    <cfset var mac  = createObject("java", "javax.crypto.Mac").getInstance( arguments.algorithm ) />

    <cfset mac.init( secret ) />

    <cfreturn binaryEncode( mac.doFinal(dataBytes), "base64") />
</cffunction>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM