2011-08-23 67 views
2

時候我已經在Flash下面的方法,其輸出兩種ByteArrays,然後的base64編碼它們錯誤轉換的Flash C#

private function generateSignature(data:String, secretKey:String):String {    
    var secretKeyByteArray:ByteArray = new ByteArray(); 
    secretKeyByteArray.writeUTFBytes(secretKey); 
    secretKeyByteArray.position = 0; 

    var dataByteArray:ByteArray = new ByteArray(); 
    dataByteArray.writeUTFBytes(data); 
    dataByteArray.position = 0; 

    var hmac:HMAC = new HMAC(new SHA1());    
    var signatureByteArray:ByteArray = hmac.compute(secretKeyByteArray, dataByteArray); 
    return Base64.encodeByteArray(signatureByteArray); 
} 

在我的C#,我有:

string GenerateSignature(string secretKey, string base64Policy) 
{ 
    byte[] secretBytes = Encoding.UTF8.GetBytes(secretKey); 
    byte[] dataBytes = Encoding.UTF8.GetBytes(base64Policy); 
    HMACSHA1 hmac = new HMACSHA1(secretBytes); 
    byte[] signature = hmac.ComputeHash(dataBytes); 
    return ByteToString(signature); 
} 

但是,我得到與C#版本相比,Flash版本的結果集不同。任何人都可以發現明顯錯誤的東西嗎?

編輯

這裏是ByteToString方法:

static string ByteToString(byte[] buffer) 
{ 
    string binary = string.Empty; 
    for (int i = 0; i < buffer.Length; i++) 
    { 
     binary += buffer[i].ToString("X2"); // Hex Format 
    } 
    return binary; 
} 
+0

當你說你得到不同的結果給我們一個例子。 –

回答

3

它看起來幾乎相同;說,我會建議使用Convert.ToBase64String而不是你的ByteToString方法,那裏的字符串連接通常被認爲是非常糟糕的做法。

我也不是100%確定,如果Base 64編碼在邏輯上與每個字節附加byte.ToString("X2")相同(雖然很可能)。

除此之外,它應該不會太難以調試,並找出其中兩個開始偏離...

+0

謝謝。它一直在困擾着我。我認爲我是沿線的雙重編碼。 –

2

你ByteToString功能僅僅是返回簽名的十六進制版本。您的Flash版本base 64將其編碼。將某些東西轉換爲十六進制字符串和基本64編碼有很大區別。使用Convert.ToBase64String而不是ByteToString。

0

Flash可能不會發送BOM(字節順序標記),其中C#(.Net)會執行此操作。

public static readonly Encoding Utf8NoBom = new UTF8Encoding(false); 

根據the Flash Documentation您正在C#端使用正確的編碼;所以這是唯一可能的選擇(它沒有關於BOM的任何說法)。