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

C# 使用C生成带有密钥的HMAC SHA256的标准代码是什么#,c#,hash,sha,C#,Hash,Sha,我想知道是否有使用密钥生成SHA256哈希的标准代码。我遇到过几种类型的代码,但是,它们不会生成相同的输出 代码位于 这是我找到的另一个 private static string ComputeHash(string apiKey, string message) { var key = Encoding.UTF8.GetBytes(apiKey); string hashString; using (var hmac = new HMACSHA256(key))

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

代码位于

这是我找到的另一个

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;
 }
这两种方法生成的代码与


我将对我们的一个外部API使用
SHA256
,消费者将在其中散列数据并将其发送给我们。因此,我们只想确保使用标准方法,以便他们向我们发送正确的散列。另外,我想知道是否有任何著名的裸体。我也试着用Bouncy Castle找到一个解决方案,但是,我找不到一个使用密钥散列的解决方案。

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

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


如果你想从可用性的角度来看待它,让它成为用户的最佳选择,那么两者都可以。对内容进行双向散列并检查用户传入的散列,但这完全取决于您对时钟周期、安全性和可用性的评估(您可以有两个)

它们几乎是等效的

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

代码的第一部分采用ASCII,而第二部分采用UTF-8。该字符串可能使用了其他编码,但这些编码都不是

但不管怎样,我们的想法是要了解这次行动的目标是什么。这方面真正相关的事情是:

  • 如果输入相等,输出应该相同
  • 只有知道输出(在合理的时间内)才能检索明文
  • 散列之后,您不再需要原始的明文输入
  • 一个安全的加密散列函数(意思不是像MD5这样的旧函数)实现了这一点

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

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

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