2010-03-17 4 views
5

Я выполняю некоторые тесты, сравнивающие алгоритм sha1, реализованный в javascript - получен от http://pajhome.org.uk/crypt/ - с его реализацией на C#.SHA1 base64 алгоритм в javascript и 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'}"); 

в яваскрипте случае хэш не заканчивается равенство (=) знаком.

Может ли это различие вызвать у меня проблемы при аутентификации на сервере?

В моем случае, как многие из вас могут знать, предложение, которое я считаю хэшем, входит в тело http, и сервер проверяет его.

Благодаря

ответ

5

будет зависеть от приемника, но попытаться декодировать ваш результат из JavaScript с C# и вы получите исключение. Знак = должен помещать результат на правильную длину.

http://en.wikipedia.org/wiki/Base64

+0

Хорошо, на основании этой информации я увидел теперь, что знак =, как вы указали, используется для заполнения сообщения. Спасибо – Andres

+3

@Andres: Вы можете обновить строку 15 файла 'sha1.js' с pajhome.org.uk, чтобы использовать' = 'в качестве символа заполнения. – LukeH

+0

Да, когда я писал свой собственный ответ, вы писали это замечание. Спасибо :) – Andres

4

sha1.js из Lib я упомянул в моем вопросе, имеет глобальную переменную b64pad, используемый для целей заполнения. По умолчанию его значение равно "". Изменение на "=" дает точный хэш, отсчитываемый от C# API