繁体   English   中英

ruby和C#之间SHA哈希的差异

[英]Difference in SHA hashes between ruby and C#

我正在开发一个使用一些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

这个例子是ruby,因为文档适用于ruby开发人员。

当我执行时,我正在用C#和完全相同的字符串开发我的应用程序:

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

并删除尾随的“=”符号,我得到:

Vw8pl / KxnjcEbyHtfNiMikXZdIunysFF2Ujsow8hyiw

因此,应用程序无法执行导致签名不匹配错误。

我已经尝试在将字符串转换为散列之前的字节数组时更改编码,并且没有任何更改。

有任何想法吗?

基于文档这里在你的字符串(这是一个破折号) - ,你缺少一个。 似乎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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM