2009-06-12 7 views
2

Ich entwickle eine Anwendung, die einige REST-Webdienste nutzt. Es ist technische Dokumentation sagt, dass ich SHA256 Hash einer Zeichenfolge in der Anfrage übergeben sollte.Unterschied in SHA-Hashes zwischen Ruby und C#

In einem Beispiel, Anforderung (in der Dokumentation) a string:

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

Nach Ausführung:

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

ergibt eine hash:

YRYuN2zO + VvxISNp/vKQM5Cl6Dpzoin7mNES0IZJ06U

Dieses Beispiel ist in Ruby, wie die Dokumentation für Ruby-Entwickler ist.

ich meine Anwendung in C# und für die genau gleiche Zeichenfolge zu entwickeln, wenn ich ausführen:

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

und den nachgestellten entfernen "=" Zeichen, die ich erhalten:

Vw8pl/KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw

und somit versagt die Anwendung, was zu einem Signatur-Fehlanpassungsfehler auszuführen.

Ich habe versucht, die Codierung zu ändern, während die Zeichenfolge in eine Byte-Array vor dem Hashing konvertiert und nichts geändert.

Irgendwelche Ideen?

+0

Haben Sie die Zeichenfolge getrimmt? Könnte irgendwo ein Platz sein. – stimms

+0

Können Sie uns die von Ihnen verwendete Zeichenfolge senden? Ich kann nicht Ihre Ergebnisse in Ruby entweder replizieren. –

+0

Rayan, was ist das Ergebnis von Hashing in Ihrem Versuch in Ruby? –

Antwort

8

Basierend auf dem Dokument here fehlt Ihnen ein - (das ist ein Bindestrich) in Ihrer Zeichenfolge. Es scheint, dass Acrobat es hilfreich in einer Kopie Paste entfernt aus dem Dokument ...

Hier einige Code, den ich zusammen splatted, die den gleichen Wert wie das Beispiel bekommt (gut es wäre, wenn Sie die endgültige = getrimmt)

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

Was Sie gesagt haben. Ich hätte das wahrscheinlich in eine Antwort stecken sollen. – Stobor

+0

Danke! :-) Problem gelöst –