【发布时间】:2016-08-03 04:18:22
【问题描述】:
我需要使用 SHA256 哈希函数来计算 HMAC。我有一个以 base64 格式编码的密钥。还有一个在线工具可以正确计算 HMAC(已验证)。 http://www.freeformatter.com/hmac-generator.html 我写了如下代码sn-p:
var signatureHashHexExpected = "559bd871bfd21ab76ad44513ed5d65774f9954d3232ab68dab1806163f806447";
var signature = "123456:some-string:2016-04-12T12:44:16Z";
var key = "AgQGCAoMDhASFAIEBggKDA4QEhQCBAYICgwOEBIUAgQ=";
var shaKeyBytes = Convert.FromBase64String(key);
using (var shaAlgorithm = new System.Security.Cryptography.HMACSHA256(shaKeyBytes))
{
var signatureBytes = System.Text.Encoding.UTF8.GetBytes(signature);
var signatureHashBytes = shaAlgorithm.ComputeHash(signatureBytes);
var signatureHashHex = string.Concat(Array.ConvertAll(signatureHashBytes, b => b.ToString("X2"))).ToLower();
System.Diagnostics.Debug.Assert(signatureHashHex == signatureHashHexExpected);
}
问题: 我的代码没有生成正确的 HMAC。我使用不同的在线工具和替代的 C# 实现验证了不同的步骤。仅未确认从 base64 进行的转换。我错过了什么?
更新: 我的代码计算的signatureHashHex是“a40e0477a02de1d134a5c55e4befa55d6fca8e29e0aa0a0d8acf7a4370208efc”
回答: 该问题是由误导性文档引起的,该文档指出密钥以 Base64 格式提供。查看接受的答案:
var shaKeyBytes = System.Text.Encoding.UTF8.GetBytes(key);
【问题讨论】:
-
你确定签名是用UTF8编码的吗?
-
不,但我尝试了许多不同的编码,结果相同。
-
signatureHashHex的结果是什么? -
@Ivar 我用计算值更新了我的问题。