将Flash转换为c#时出错

本文关键字:出错 Flash 转换 | 更新日期: 2023-09-27 18:06:21

我在Flash中有以下方法,它写入两个ByteArrays,然后base64对它们进行编码

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;
}

将Flash转换为c#时出错

看起来差不多;也就是说,我建议使用Convert.ToBase64String而不是您的ByteToString方法,其中的字符串连接通常被认为是非常糟糕的做法。

我也不能100%确定Base 64编码是否在逻辑上与将每个字节的byte.ToString("X2")附加到字符串相同(尽管它很可能是)。

除此之外,调试和找出两者开始偏离的地方应该不会太难…

ByteToString函数仅返回签名的十六进制版本。您的flash版本base64编码它。将一些东西转换成十六进制字符串和64进制编码之间有很大的区别。

使用Convert.ToBase64String代替ByteToString

Flash可能不会发出BOM(字节顺序标记),而c# (. net)会。

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

根据Flash文档,您正在c#端使用正确的编码;所以这是唯一可能的替代方案(它没有任何关于BOM的说明)。