Я запускаю некоторые тесты, сравнивающие sha1 алгоритм, реализованный в JavaScript - полученный из http://pajhome.org.uk/crypt/ - с его реализацией в C#.
Используя C# для получения хеша для {'метод':'people.get'} я использую этот оператор:
Convert.ToBase64String(new System.Security.Cryptography.SHA1CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes("{'method':'people.get'}")));
который дает мне Qy95a0ShZqhbNdt6IF8qNf72jX0=
В JavaScript я получаю почти то же: Qy95a0ShZqhbNdt6IF8qNf72jX0
использование оператора:
b64_sha1("{'method':'people.get'}");
В случае JavaScript хеш не заканчивается равным (=) знак.
Это различие может вызвать меня проблемы в аутентификации против сервера?
В моем случае, как многие из Вас могут знать, предложение, которое я считаю, хеш входит в тело HTTP, и сервер проверит его.
Спасибо
Это зависит от приемника, но попробуйте декодировать результат из javascript с помощью C#, и вы получите исключение. Знак = используется для того, чтобы привести результат к нужной длине.
В sha1.js
из либы, о которой я упоминал в своем вопросе, есть глобальная переменная b64pad
, используемая для создания прокладок. По умолчанию ее значение равно ""
. Изменение на "=""
дает точный хэш, считанный API C#