2009-06-12 62 views
2

我開發一個應用程序,這使得使用一些REST Web服務之間的哈希值。 它的技術文檔說我應該在請求中傳遞一些字符串的SHA256散列。差異SHA Ruby和C#

在一個示例中請求(在文檔中)的字符串:

HN-Rw2ZHYwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires = 1893013926label [0] =任何/ somestatistics = 1D,2D,7D,28D,30D,31D,lifetimestatus = UPL ,livetitle =一個

執行後:

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

結果在哈希:

YRYuN2zO + VvxISNp/vKQM5Cl6Dpzoin7mNES0IZJ06U

這個例子是在紅寶石,由於文檔是紅寶石開發者。

我發展我的C#和完全相同的字符串應用程序,當我執行:

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

和刪除尾隨 「=」 的招牌,我得到:

Vw8pl/KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw

因此,應用程序執行失敗導致簽名不匹配錯誤。

我試圖改變編碼而字符串轉換爲改變散列並沒有什麼之前的字節數組。

任何想法?在您的字符串(這是一個破折號) -

+0

你有沒有修剪的字符串?在某處可能會有空間。 – stimms 2009-06-12 01:56:47

+0

你可以寄給我們你正在使用的字符串。我不能複製的結果無論是紅寶石.. – 2009-06-12 02:01:53

回答

8

基於文檔here,你缺少一個。似乎是有益的Acrobat刪除它從一個文件複製粘貼...

下面是一些代碼,我splatted在一起得到了相同的值作爲例子(如果你修剪最後阱它會=)

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);