как воссоздать хэш членства .net hmacsha1 в javascript

Я пытаюсь воспроизвести тот же хэш hmacsha1 и кодировку base64 от поставщика членства .net в функции javascript. Я пробовал использовать crypto-js и получаю разные результаты. Код .net будет хешировать "test" в "W477AMlLwwJQeAGlPZKiEILr8TA=".

Вот код .net

string password = "test";
HMACSHA1 hash = new HMACSHA1();
hash.Key = Encoding.Unicode.GetBytes(password);
string encodedPassword = Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(password)));

И вот метод javascript, который я пробовал с использованием crypto-js, который не дает такого же результата

var hash = CryptoJS.HmacSHA1("test", "");
var encodedPassword = CryptoJS.enc.Base64.stringify(hash);

Как я могу заставить свой хэш javascript соответствовать хешу, сгенерированному из .net.


person MonkeyBonkey    schedule 10.01.2013    source источник


Ответы (1)


Вы не указываете ключ в .NET:

var secretKey = "";
var password = "test";

var enc = Encoding.ASCII;
System.Security.Cryptography.HMACSHA1 hmac = new System.Security.Cryptography.HMACSHA1(enc.GetBytes(secretKey));
hmac.Initialize();

byte[] buffer = enc.GetBytes(password);
var encodedPassword = Convert.ToBase64String(hmac.ComputeHash(buffer));

Изменить: как уже упоминал @Andreas, ваша проблема заключается в кодировке. Так что вам просто нужно заменить UTF на ANSI в вашем собственном коде:

string password = "test";
System.Security.Cryptography.HMACSHA1 hash = new System.Security.Cryptography.HMACSHA1();
hash.Key = Encoding.ASCII.GetBytes("");
string encodedPassword = Convert.ToBase64String(hash.ComputeHash(Encoding.ASCII.GetBytes(password)));   
person Grimace of Despair    schedule 10.01.2013
comment
Он использует password в качестве ключа и сообщения. И ваше решение дает правильный результат только из-за другой кодировки (ASCII вместо Unicode) - вот в чем настоящая проблема. - person Andreas; 11.01.2013
comment
Ты прав. Я как-то совсем пропустил, как он устанавливает ключ (ошибочно). - person Grimace of Despair; 11.01.2013
comment
Метод .net — это существующая функция в Umbraco, которую я не могу изменить, поэтому, к сожалению, я не могу ее изменить. Я могу только попытаться повторить это в javascript. - person MonkeyBonkey; 11.01.2013
comment
так что похоже разница в том, что хэши crypto-js с кодировкой utf-8, а библиотека .net использует utf-16 - person MonkeyBonkey; 11.01.2013
comment
Разве вы не любите такие странности, в которых нет вашей вины, но которые могут легко отбросить вас на день назад? :) Является ли ваш ответ решением? - person Grimace of Despair; 11.01.2013
comment
да, преобразование pwd в utf16le перед вводом хеш-функции работает. Совет по кодированию был верным ключом к решению. - person MonkeyBonkey; 11.01.2013
comment
Не забудьте принять свой собственный ответ, просто чтобы упростить ссылку. - person Grimace of Despair; 16.01.2013