hmac для Python и hmac для C#

У нас есть веб-сервис python. Ему нужен хэш в качестве параметра. Хэш в питоне генерируется таким образом.

    hashed_data = hmac.new("ant", "bat", hashlib.sha1)
    print hashed_data.hexdigest()

Вот как я генерирую хэш из C#.

    ASCIIEncoding encoder = new ASCIIEncoding();
    Byte[] code = encoder.GetBytes("ant");
    HMACSHA1 hmSha1 = new HMACSHA1(code);
    Byte[] hashMe = encoder.GetBytes("bat");
    Byte[] hmBytes = hmSha1.ComputeHash(hashMe);
    Console.WriteLine(Convert.ToBase64String(hmBytes));

Однако я выхожу с другим результатом.

Должен ли я изменить порядок хеширования?

Спасибо,

Джон


person Jon    schedule 03.08.2012    source источник


Ответы (1)


Чтобы распечатать результат:

  • В Python вы используете: .hexdigest()
  • В С# вы используете: Convert.ToBase64String

Эти две функции делают совсем не то же самое. Hexdigest Python просто преобразует массив байтов в шестнадцатеричную строку, тогда как метод C# использует кодировку Base64 для преобразования массива байтов. Итак, чтобы получить тот же результат, просто определите функцию:

public static string ToHexString(byte[] array)
{
    StringBuilder hex = new StringBuilder(array.Length * 2);
    foreach (byte b in array)
    {
        hex.AppendFormat("{0:x2}", b);
    }
    return hex.ToString();
}

а потом:

ASCIIEncoding encoder = new ASCIIEncoding();
Byte[] code = encoder.GetBytes("ant");
HMACSHA1 hmSha1 = new HMACSHA1(code);
Byte[] hashMe = encoder.GetBytes("bat");
Byte[] hmBytes = hmSha1.ComputeHash(hashMe);
Console.WriteLine(ToHexString(hmBytes));

Теперь вы получите тот же вывод, что и в Python:

739ebc1e3600d5be6e9fa875bd0a572d6aee9266
person Darin Dimitrov    schedule 03.08.2012