【问题标题】:Convert C# to Ruby - HMAC SHA256 function将 C# 转换为 Ruby - HMAC SHA256 函数
【发布时间】:2015-11-13 13:44:31
【问题描述】:

我正在尝试获取 HMAC SHA256 值(str_signature),我遵循post 中的 Ruby 代码,尽管他的示例是从 Java 转换代码(使用十六进制键)。

C#

string strRawSignature = "200123123891:12|11231231|GET|just%20test%20value"

// Convert signature to byte array in order to compute the hash
byte[] bSignature = Encoding.UTF8.GetBytes(strRawSignature);

// Convert ApiKey to byte array - for initializing HMACSHA256
byte[] bSecretKey = Convert.FromBase64String(strApiKey);

string strSignature = "";
using (HMACSHA256 hmac = new HMACSHA256(bSecretKey))
{
    // Compute signature hash
    byte[] bSignatureHash = hmac.ComputeHash(bSignature);

    // Convert signature hash to Base64String for transmission
    str_signature = Convert.ToBase64String(bSignatureHash);
}

红宝石

require "openssl"
require "base64"

digest = OpenSSL::Digest.new('sha256')
key = [ 'xiIm9FuYhetyijXA2QL58TRlvhuSJ73FtdxiSNU2uHE=' ]

#this is just a dummy signature to show what the possible values are
signature = "200123123891:12|11231231|GET|just%20test%20value"

hmac = OpenSSL::HMAC.digest(digest, key.pack("m*"), signature)
str_signature = Base64.urlsafe_encode64(hmac)
example result: "B0NgX1hhW-rsnadD2_FF-grcw9pWghwMWgG47mU4J94="

更新:

  1. pack method 更改为输出 base64 字符串。

  2. 编辑变量名称以保持一致性

参考资料:

  1. 使用hexdigest,输出字符串长度不同。
  2. 这个example使用digest方法,虽然我不确定key参数有什么值,希望它是一个base 64编码的字符串。
  3. This 再次使用 hexdigest。我很确定摘要是与 hexdigest 相比的方法,因为与 C# 脚本中的示例 HMAC 值相比,hexdigest 输出的字符串更长。

【问题讨论】:

  • 您正在尝试将密钥转换为十六进制,但您的密钥不是十六进制(包含 0-9 和 A-F 以外的其他字符)......
  • 您是否试图找到如何将 Ruby 中的 hmac_string 与 C# 中的 strSignature 匹配?目前尚不清楚,因为您在每段代码中使用了非常不同的变量名称(以及令人困惑的变量名称,其中包含似乎是消息的“签名”一词),并且您没有显示 strRawSignature 的值是什么C# 中的起点。请同时显示 C# 中 strApiKey 的初始值
  • @MarcoSandrini - 感谢您指出这一点!我应该将 key.pack 切换到 key.pack("m*") 代替(base 64),但它仍然会生成与所需字符串不同的结果。
  • 我试图重现您的代码,但得到了不同的结果LgWgbV0hrs4tiE5LmffDMyTfG-_xjjexbcCIqF5PJnU= 请确保您在 C# 中使用的密钥和数据与您在 Ruby 中使用的完全匹配,并且预期的结果也会更新。
  • @MarcoSandrini 我的错,示例结果基于不同的输入数据。我没有发布它的机密性(参数)的实际数据原因,稍后我将通过发布两个脚本的实际结果来更新这篇文章。

标签: c# ruby


【解决方案1】:

终于得到了我背后的猴子!

毕竟我真的不需要创建一个 sha256 摘要对象,我只需要输入 'sha256' 参数。

require 'openssl'
require "base64"
#API_KEY = base64 encoded string
key = Base64.decode64(API_KEY)
hash  = OpenSSL::HMAC.digest('sha256', key, "Message")
puts Base64.encode64(hash)

感谢link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多