使用 C# 生成带密钥的 HMAC SHA256 的标准代码是什么

Fre*_*enz 6 c# hash sha

我想知道是否有标准代码可以使用密钥生成 SHA256 哈希值。我遇到过几种类型的代码,但是它们不会生成相同的输出。

在JokeCamp找到的代码

private string CreateToken(string message, string secret)
{
  secret = secret ?? "";
  var encoding = new System.Text.ASCIIEncoding();
  byte[] keyByte = encoding.GetBytes(secret);
  byte[] messageBytes = encoding.GetBytes(message);
  using (var hmacsha256 = new HMACSHA256(keyByte))
  {
    byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
    return Convert.ToBase64String(hashmessage);
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我找到的另一张

private static string ComputeHash(string apiKey, string message)
{
    var key = Encoding.UTF8.GetBytes(apiKey);
    string hashString;
    using (var hmac = new HMACSHA256(key))
    {
        var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
        hashString = Convert.ToBase64String(hash);
    }

    return hashString;
 }
Run Code Online (Sandbox Code Playgroud)

这两个生成的代码与http://www.freeformatter.com/hmac-generator.html#ad-output生成的代码不同

我将使用SHA256我们的外部 API 之一,消费者可以在其中对数据进行哈希处理并将其发送给我们。所以我们只是想确保我们使用标准方法,以便他们向我们发送正确的哈希值。另外,我想知道是否有任何知名的金块。我还尝试使用 Bouncy Castle 寻找解决方案,但是,我找不到使用密钥进行哈希的解决方案。

Bob*_*les 3

差异是由于字符编码(示例中的 ASCII 与 UTF-8)造成的。请注意,散列算法采用字节数组,并且您事先将字符串转换为该字节数组。

您的问题“标准代码是什么”可能没有答案,我说如果您希望输入仅包含ASCII字符空间的内容,请选择该内容,如果不选择 UTF-8。无论哪种方式 - 将其传达给您的用户

如果您想从可用性的角度来看待它并使其最适合您的用户 - 两者兼而有之。以两种方式对内容进行哈希处理并再次检查用户传入的哈希值,但这完全取决于您对时钟周期、安全性与可用性的评估(您可以有两个)