2010-03-17 21 views
5

Sto eseguendo alcuni test confrontando l'algoritmo sha1 implementato in javascript - ottenuto da http://pajhome.org.uk/crypt/ - con la sua implementazione in C#.Algoritmo base64 SHA1 in javascript e C#

con C# per ottenere l'hash per { 'metodo': 'people.get'} sto usando questa dichiarazione:

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

che mi dà Qy95a0ShZqhbNdt6IF8qNf72jX0=

in JavaScript ottengo quasi stessa: Qy95a0ShZqhbNdt6IF8qNf72jX0 utilizzando l'istruzione:

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

Nel caso javascript, l'hash non termina con un segno di uguale (=).

Questa differenza può causare problemi durante l'autenticazione con un server?

Nel mio caso, come molti di voi potrebbero sapere, la frase che sto calcolando l'hash entra nel corpo http e il server la controllerà.

Grazie

risposta

5

dipenderebbe dal ricevitore, ma provare a decodificare il risultato dalla JavaScript con C# e si otterrà un'eccezione. Il segno = è lì per incollare il risultato alla lunghezza corretta.

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

+0

Ok, in base a tali informazioni ho visto ora che il segno =, come hai sottolineato, viene utilizzato per riempire il messaggio. Grazie – Andres

+3

@Andres: puoi aggiornare la riga 15 del file 'sha1.js' da pajhome.org.uk per usare' = 'come carattere di riempimento. – LukeH

+0

Sì, mentre stavo scrivendo la mia risposta stavi scrivendo questa osservazione. Grazie :) – Andres

4

Il sha1.js dal lib che ho citato nella mia interrogazione, ha una variabile globale chiamata b64pad, utilizzato ai fini di imbottitura. Di default il suo valore è "". Passare a "=" fornisce l'hash esatto calcolato dall'API C#