Ошибка при конвертации Flash в C # - PullRequest
2 голосов
/ 23 августа 2011

У меня есть следующий метод во 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);
}

Но я получаюдругой набор результатов из версии Flash по сравнению с версией C #.Кто-нибудь может обнаружить что-то, что явно не так?

РЕДАКТИРОВАТЬ

Вот метод 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;
}

Ответы [ 3 ]

3 голосов
/ 23 августа 2011

выглядит примерно так же; Тем не менее, я бы предложил использовать Convert.ToBase64String вместо вашего ByteToString метода, конкатенация строк там обычно считается очень плохой практикой.

Я также не уверен на 100%, если кодировка Base 64 логически совпадает с добавлением byte.ToString("X2") для каждого байта в строку (хотя это вполне может быть).

Кроме этого, не должно быть слишком сложно отладить и выяснить, где два начинают отклоняться ...

2 голосов
/ 23 августа 2011

Ваша функция ByteToString просто возвращает шестнадцатеричную версию подписи.Ваша флеш версия base 64 кодирует его.Существует большая разница между преобразованием чего-либо в шестнадцатеричную строку и кодировкой base 64.

Используйте Convert.ToBase64String вместо ByteToString.

0 голосов
/ 23 августа 2011

Flash может не излучать BOM (метку порядка байтов), где C # (.Net) делает.

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

Согласно Документация Flash вы используете правильную кодировкуна конце C #;так что это единственно возможная альтернатива (ей нечего было сказать о спецификации).

...