【问题标题】:Difference in SHA hashes between ruby and C#ruby 和 C# 之间 SHA 哈希的差异
【发布时间】:2010-11-02 08:24:36
【问题描述】:

我正在开发一个使用一些 REST Web 服务的应用程序。 它的技术文档说我应该在请求中传递一些字符串的 SHA256 哈希。

在一个示例请求中(在文档中)一个字符串:

hn-Rw2ZHYwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires=1893013926label[0]=any/somestatistics=1d,2d,7d,28d,30d,31d,lifetimestatus=upl,livetitle=a

执行后:

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

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

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

有什么想法吗?

【问题讨论】:

  • 你修剪过字符串吗?可能在某个地方有一个空间。
  • 你能把你正在使用的字符串发给我们吗?我也不能用 ruby​​ 复制你的结果..
  • Rayan,你在 ruby​​ 中尝试散列的结果是什么?
  • 仅供参考,使用 Python 我得到了 RuVTyg6Wc5vL51Z4goeRGAqTdb1ioHknFihtyRzKlvw -- 越来越好奇了,Alice 说......
  • 您的测试字符串错误。该文档使用 hn-Rw2ZH-YwllUYkklL5Zo_7lWJVkrbShZPb5CD1expires=1893013926label[0]=any/somestatistics=1d,2d,7d,28d,30d,31d,lifetimestatus=upl,livetitle=a

标签: c# ruby hash sha256


【解决方案1】:

根据文档 here,您的字符串中缺少 -(即破折号)。似乎 Acrobat 有助于将其从文档的复制粘贴中删除...

这是我拼凑在一起的一些代码,它们的值与示例相同(如果你修剪了最后的 =,它会是这样)

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

【讨论】:

  • 你说的。我可能应该把它放在答案中。
猜你喜欢
  • 2011-08-08
  • 1970-01-01
  • 2012-05-20
  • 2018-08-24
  • 2023-03-22
  • 2013-08-10
  • 1970-01-01
  • 2017-02-26
  • 2018-11-04
相关资源
最近更新 更多