2009-06-12 7 views
2

Je développe une application qui utilise certains services web REST. Sa documentation technique dit que je devrais passer SHA256 hachage de la chaîne dans la demande.Différence dans les hachages SHA entre ruby ​​et C#

Dans un exemple de requête (dans la documentation) une chaîne:

hn-Rw2ZHYwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires = 1893013926label [0] = any/somestatistics = 1d, 2d, 7d, 28d, 30d, 31d, lifetimestatus = UPL , livetitle = a

Après l'exécution:

digest = Digest::SHA256.digest(string_to_sign) 
signature = Base64::encode64(digest).chomp.gsub(/=+$/, '') 

résultats dans un hachage:

YRYuN2zO + VvxISNp/vKQM5Cl6Dpzoin7mNES0IZJ06U

Cet exemple est en rubis, que la documentation est destinée aux développeurs de Ruby.

Je développe ma demande en C# et pour exactement le même chaîne, quand j'Execute:

byte[] rawHash = sha256.ComputeHash(rawRequest, 0, rawRequest.Length); 
string friendlyHash = Convert.ToBase64String(rawHash); 

et enlever la fuite "=" signes, je reçois:

Vw8pl/KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw

et, par conséquent, l'application ne parvient pas à exécuter entraîne une erreur de décalage de signature.

J'ai essayé de changer le codage tout en convertissant la chaîne en un tableau d'octets précédant le hachage et rien n'a changé.

Des idées?

+0

Avez-vous coupé la chaîne? Peut-être un espace là-bas quelque part. – stimms

+0

Pouvez-vous nous envoyer la chaîne que vous utilisez. Je ne peux pas reproduire vos résultats dans ruby ​​non plus .. –

+0

Rayan, quel est le résultat du hachage dans votre essai à ruby? –

Répondre

8

Basé sur le document here, il vous manque un - (c'est-à-dire un tiret) dans votre chaîne. Il semble que Acrobat supprime obligeamment dans une pâte de copie du document ...

Voici un code que je splatted ensemble qui obtient la même valeur que l'exemple (bien qu'il serait si vous parés la finale =)

string s = "hn-Rw2ZH-YwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires=1893013926label[0]=any/somestatistics=1d,2d,7d,28d,30d,31d,lifetimestatus=upl,livetitle=a"; 

    SHA256Managed sh = new SHA256Managed(); 
    byte[] request = System.Text.UTF8Encoding.UTF8.GetBytes(s); 
    sh.Initialize(); 
    byte[] b4bbuff = sh.ComputeHash(request, 0, request.Length); 

    string b64 = Convert.ToBase64String(b4bbuff); 
+0

Ce que vous avez dit. J'aurais probablement dû mettre cela dans une réponse. – Stobor

+0

Merci! :-) Problème résolu –

Questions connexes