2011-08-23 64 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的任何说法)。