[英]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.