题
我开发一个应用程序,这使得使用一些REST Web服务。 它的技术文档中说,我应该通过在请求某些字符串的SHA256哈希值。
在一个示例请求的字符串(在文档中):
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
和因此,应用程序执行失败导致的签名不匹配的错误。
我试图改变编码而字符串转换为一个字节数组之前的散列和没有什么改变。
任何想法?
解决方案
基于文档这里
,你缺少一个 - (这是一个破折号)在您的字符串。似乎的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);
不隶属于 StackOverflow