【问题标题】:Whats the standard code to generate HMAC SHA256 with key using C#使用 C# 生成带有密钥的 HMAC SHA256 的标准代码是什么
【发布时间】:2017-10-03 10:26:35
【问题描述】:

我想知道是否有使用密钥生成 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);
  }
}

这是我找到的另一个

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;
 }

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

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

【问题讨论】:

    标签: c# hash sha


    【解决方案1】:

    区别在于字符编码(在您的示例中为 ASCII 与 UTF-8)。请注意,散列算法需要一个字节数组,并且您事先将字符串转换为该字节数组。

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

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

    【讨论】:

      【解决方案2】:

      它们几乎是等价的。

      区别在于字符串的编码是如何建立的。

      在代码的第一部分它假定为 ASCII,而在第二部分它假定为 UTF-8。字符串可能使用了另一种编码,而这些编码都不是。

      但不管怎样,我们的想法是了解此操作的目标是什么。在这种情况下真正相关的事情是:

      1. 给定相同的输入,输出应该相同
      2. 应该没有办法仅通过知道输出(在合理的时间内)来检索明文
      3. 散列后,您不再需要明文的原始输入。

      一个安全的加密散列函数(意味着不是像 MD5 这样的旧函数)可以实现这一点。

      然后,如果您存储哈希的数据存储遭到破坏,攻击者将只有一个无法用于检索原始明文的哈希。这就是为什么使用散列而不是加密的原因,加密是可逆的操作(通过解密)。

      然后,在系统内,如果您决定使用一种编码,则需要在系统中的所有组件之间保持该决定的一致性,以便它们可以互操作。

      【讨论】:

        猜你喜欢
        • 2016-10-10
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多