Создание хэша сообщения в C # - PullRequest
0 голосов
/ 13 января 2019

Я хочу использовать REST API, который требует подписи, которая является хешем сообщения с использованием секретного ключа. У меня есть реализация JavaScript, которая работает, но когда я пытаюсь сделать то же самое в C #, он дает другой результат, который, согласно ответу API, кажется неправильным.

Код JavaScript, который производит желаемую подпись:

let signature = crypto.createHmac('sha256', secret_key).update(message).digest('hex');

Код C #, который не производит ту же самую желаемую подпись:

var hash = new HMACSHA256(key);
byte[] signature = hash.ComputeHash(message);
StringBuilder hexDigest = new StringBuilder();
foreach (byte b in signature)
     hexDigest.Append(String.Format("{0:x2}", b).ToUpper());

Буду признателен, если кто-нибудь скажет мне, что мне нужно изменить в коде C #, чтобы воспроизвести тот же результат.

1 Ответ

0 голосов
/ 13 января 2019

Я не знаю, что изменить в предоставленном вами коде. Но позвольте мне направить вас.

Возможно, у вас разные ключи или сообщения из-за кодировки текста. Например, с Javascript я попробовал следующий код:

const secret_key = 'abcdefg';
const message = 'Hello, World!';
let signature = crypto.createHmac('sha256', secret_key).update(message).digest('hex');

signature - это 37c559140f3c04743337019ef0f693ee8a469c9d41a925b8f3b624796dce0ba0.

В C # я использовал кодировку UTF8 и получил тот же результат.

var key = Encoding.UTF8.GetBytes("abcdefg");
var hash = new HMACSHA256(key);
var message = Encoding.UTF8.GetBytes("Hello, World!");
byte[] signature = hash.ComputeHash(message);
    StringBuilder hexDigest = new StringBuilder();
    foreach (byte b in signature)
         hexDigest.Append(String.Format("{0:x2}", b));

Если бы я использовал Encoding.Unicode, я бы получил другую подпись eb2b452cf518dc647a5014b7dd46da2e7bd2300aae394ea9cbb4eba492c093f5.

...