我正在开发一个应用程序,它利用了一些RESTWeb服务。 技术文档说我应该在请求中传递某个字符串的sha256散列。
在示例请求(在文档中)中,字符串:
hn-rw2zhywlluykkll5zo lwjvkrbshzpb5cd1有效期=1893013926label[0]=任何/某些统计数据=1d、2d、7d、28d、30d、31d、lifetime状态=upl、livetitle=a
执行后:
digest = Digest::SHA256.digest(string_to_sign) signature = Base64::encode64(digest).chomp.gsub(/=+$/, '')
产生哈希:
YRYUN2ZO+VVXISNP/VKQM5CL6DPZON7MNES0IZJ06U
这个例子在Ruby中,正如文档是为Ruby开发人员编写的一样。
我正在用C语言开发我的应用程序,并使用完全相同的字符串,当我执行以下操作时:
byte[] rawHash = sha256.ComputeHash(rawRequest, 0, rawRequest.Length); string friendlyHash = Convert.ToBase64String(rawHash);
去掉后面的“=”符号,我得到:
vw8pl/kxnjcebyhtfnimikxzdiunysff2ujsow8hyiw公司
因此,应用程序无法执行,导致签名不匹配错误。
我尝试在将字符串转换为哈希前的字节数组时更改编码,但没有任何更改。
有什么想法吗?
根据文件 here ,您的字符串中缺少一个(即破折号)。似乎Acrobat从文档中删除了一个复制粘贴…
下面是一些代码,我将它们放在一起,得到与示例相同的值(如果修剪final=,它会得到相同的值)
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);