2010-03-17 13 views
5

Używam kilku testów porównujących algorytm sha1 zaimplementowany w javascript - dostałem od http://pajhome.org.uk/crypt/ - z jego implementacją w C#.Algorytm SHA1 base64 w javascript i C#

Korzystanie z C#, aby uzyskać hash dla { 'metody': 'people.get'} Używam tego komunikatu:

Convert.ToBase64String(new System.Security.Cryptography.SHA1CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes("{'method':'people.get'}"))); 

który daje mi Qy95a0ShZqhbNdt6IF8qNf72jX0=

w JavaScript mam prawie sama: Qy95a0ShZqhbNdt6IF8qNf72jX0 za pomocą instrukcji:

b64_sha1("{'method':'people.get'}"); 

w javascript przypadku mieszania nie kończy się z równości (=) znakiem.

Czy ta różnica może powodować problemy z uwierzytelnianiem się na serwerze?

W moim przypadku, jak wielu z was może wiedzieć, zdanie, w którym liczę hash, przechodzi do treści http, a serwer to sprawdzi.

Dzięki

Odpowiedz

5

zależałaby od odbiornika, ale starają dekodowania swój wynik z javascript z C# i dostaniesz wyjątek. Znak = służy do wstawiania wyniku na właściwą długość.

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

+0

Ok, na podstawie tych informacji widziałem teraz, że znak =, jak wskazano, służy do dopełniania wiadomości. Dzięki – Andres

+3

@Andres: Możesz zaktualizować wiersz 15 pliku 'sha1.js' z pajhome.org.uk, aby użyć' = 'jako dopełnienia. – LukeH

+0

Tak, podczas gdy pisałem własną odpowiedź, pisałeś tę uwagę. Dzięki :) – Andres

4

sha1.js z lib wspomniałem w moim pytaniu, ma globalną zmienną o nazwie b64pad, używany do celów wypełnienia. Domyślnie jego wartość to "". Zmiana na "=" daje dokładny skrót obliczony przez C# API