代码之家  ›  专栏  ›  技术社区  ›  Karim Agha

Ruby和C之间的sha哈希差异#

  •  2
  • Karim Agha  · 技术社区  · 17 年前

    我正在开发一个应用程序,它利用了一些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公司

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

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

    有什么想法吗?

    1 回复  |  直到 17 年前
        1
  •  8
  •   Jack Bolding    17 年前

    根据文件 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);
    
    推荐文章