C#中的HMAC SHA256哈希计算

kal*_*sov 4 c# hash hmac

我需要使用SHA256哈希函数来计算HMAC.我有一个以base64格式编码的密钥.还有一个正确计算HMAC(已验证)的在线工具. http://www.freeformatter.com/hmac-generator.html 我写了以下代码片段:

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);
}
Run Code Online (Sandbox Code Playgroud)

问题:我的代码没有生成正确的HMAC.我通过使用不同的在线工具和替代C#实现验证了不同的步骤.仅确认无法从base64进行转换.我错过了什么?

更新:我的代码计算的signatureHashHex是"a40e0477a02de1d134a5c55e4befa55d6fca8e29e0aa0a0d8acf7a4370208efc"

答案:该问题是由一个误导性的文档引起的,该文件说明密钥是以Base64格式提供的.看到接受的答案:

var shaKeyBytes = System.Text.Encoding.UTF8.GetBytes(key);
Run Code Online (Sandbox Code Playgroud)

Ale*_* K. 6

您的结果是正确的,区别在于您链接到的工具不会解码Base64的键值并将其视为一系列字符.

例如,要复制其结果,请将您的密钥视为字符串:

var shaKeyBytes = System.Text.Encoding.UTF8.GetBytes("AgQGCAoMDhASFAIEBggKDA4QEhQCBAYICgwOEBIUAgQ=");
Run Code Online (Sandbox Code Playgroud)

哪个收益率

559bd871bfd21ab76ad44513ed5d65774f9954d3232ab68dab1806163f806447
Run Code Online (Sandbox Code Playgroud)

(这显然不是正确的方法)