【发布时间】: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="
更新:
将 pack method 更改为输出 base64 字符串。
编辑变量名称以保持一致性
参考资料:
【问题讨论】:
-
您正在尝试将密钥转换为十六进制,但您的密钥不是十六进制(包含 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 我的错,示例结果基于不同的输入数据。我没有发布它的机密性(参数)的实际数据原因,稍后我将通过发布两个脚本的实际结果来更新这篇文章。