Unterschied in SHA-Hashes zwischen Ruby und C #
Frage
Ich entwickle eine Anwendung, die Verwendung einiger REST Web Services macht. Es ist technische Dokumentation sagt, dass ich SHA256 Hash einiger Zeichenfolge in der Anfrage übergeben soll.
In einem Beispiel Anfrage (in der Dokumentation) eine Zeichenfolge:
hn-Rw2ZHYwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires 1893013926label = [0] = any / somestatistics = 1d, 2d, 7d, 28d, 30d, 31d, lifetimestatus = UPL, livetitle = a
Nach dem Ausführen:
digest = Digest::SHA256.digest(string_to_sign)
signature = Base64::encode64(digest).chomp.gsub(/=+$/, '')
Ergebnisse in einem Hash:
YRYuN2zO + VvxISNp / vKQM5Cl6Dpzoin7mNES0IZJ06U
Dieses Beispiel ist in Ruby, wie die Dokumentation für Ruby-Entwickler ist.
Ich entwickle meine Anwendung in C # und für die genau gleiche Zeichenfolge, wenn ich ausführen:
byte[] rawHash = sha256.ComputeHash(rawRequest, 0, rawRequest.Length);
string friendlyHash = Convert.ToBase64String(rawHash);
und entfernen Sie die hintere "=" Zeichen, die ich erhalten:
Vw8pl / KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw
und deshalb schlägt die Anwendung fehl, was zu einer Signatur Mismatch Fehler auszuführen.
Ich habe versucht, die Codierung zu ändern, während die Zeichenfolge in einem Byte-Array konvertiert vor dem Hashing und nichts geändert.
Irgendwelche Ideen?
Lösung
Basierend auf dem Dokument hier , die Sie vermissen eine - (das ist ein Bindestrich) in der Zeichenfolge. Es scheint, dass Acrobat es hilfreich in einer Kopie Paste entfernt aus dem Dokument ...
Hier ist ein Code, den ich splatted zusammen, die denselben Wert wie das Beispiel bekommt (gut es wäre, wenn Sie die letzte = 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);