【问题标题】:Is there a keyed SHA256 hash algorithm that is FIPS compliant for .NET?是否有符合 .NET 的 FIPS 的键控 SHA256 哈希算法?
【发布时间】:2013-07-25 14:38:32
【问题描述】:

我正在使用带有以下代码的 HMACSHA256 创建键控 SHA256 哈希:

HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey);
byte[] hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(data));

string hashResult = string.Empty;
for (int i = 0; i < hash.Length; i++)
{
    hashResult += hash[i].ToString("x2"); // hex format
}

这工作得很好,但是在启用 FIPS 的环境中它会失败,因为 HMACSHA256 使用本身不符合 FIPS 的底层 SHA256Managed 实现。

通过 MSDN 文档搜索,我发现 KeyedHashAlgorithm 的唯一 SHA256 实现是 HMACSHA256。

我需要使用带键的 SHA256 哈希对 Web 服务请求进行签名(因此我无法更改哈希类型),并且我必须能够在启用 FIPS 的环境中运行。

谷歌搜索显示 SHA256CryptoServiceProvider 和 SHA256Cng 都是符合 FIPS 的创建 SHA256 哈希的方法,但似乎都不支持创建密钥哈希。

【问题讨论】:

    标签: c# .net hash sha256 fips


    【解决方案1】:

    我知道这是旧的,但微软似乎解决了这个问题。我在 Windows 8 上运行 .NET 4.5.1。我无法确定这是修复的 BCL 版本或操作系统。

    this.m_hash1 = HMAC.GetHashAlgorithmWithFipsFallback((Func<HashAlgorithm>) (() => (HashAlgorithm) new SHA256Managed()), (Func<HashAlgorithm>) (() => HashAlgorithm.Create("System.Security.Cryptography.SHA256CryptoServiceProvider")));
    

    【讨论】:

    • 我只是同意你的观察。我在 Windows 8.1 和 Windows7 SP1 上都启用了 FIPS。 HMACSHA512、HMACSHA256 类似乎工作得很好。我在两个平台上运行了以下代码。 HMACSHA26 和 HMAC512 在 .NET 3.5 下失败,但在 .Net 4.0 及更高版本下通过。
    【解决方案2】:

    不,没有。 Here 是一个列表(向下滚动到 FIPS.sys Algorithms 部分)。

    我过去使用过的解决方法是here,但我不确定这是否适用于 Web 服务。 This 解决方案可以工作。

    【讨论】:

    • 正如the Meta discussion 指出的那样,您的答案应该比链接更重要。
    • @neontapir - 这个问题的答案是否定的,所以在我看来更多的东西是实质性的:)
    • 我的意思是我需要按照您答案中的链接查看您所指的解决方法和可能的解决方案。危险在于链接变得陈旧,然后答案变得无用。
    • 我理解其中的原因,但如果没有链接,这个答案不会毫无用处。我添加它们是为了提供更多的内容,而不仅仅是 No
    • "FIPS.sys" 用于内核组件,但这个家伙正在使用 .Net 在用户区工作。我认为他有比看起来更多的机会。例如,RSA Enhanced Provider (RSAENH) 可在旧平台上使用,而新平台具有 Bcrypt 算法和 CNG 提供程序(不确定如何引用 CNG...)。
    【解决方案3】:

    官方说你可能不走运,但从 SHA-256 构建 HMAC_SHA256 应该相对容易。看看the Wikipedia page 看看这有多简单。

    请注意,HMAC 可能未在 FIPS 模式下获得批准,因为它容易受到侧信道攻击。在这种情况下,您应该确保有一些针对侧信道攻击的保护措施。

    用加密原语构建自己的加密算法有点危险。如果您自己尝试声称 FIPS 级别的安全性,那么这可能会成为一个问题。但是对于大多数用户来说,如果你说你只使用符合 NIST 的算法就足够了。这取决于你愿意沿着这条线走多远......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-11
      • 2016-08-24
      • 2011-03-05
      • 1970-01-01
      • 2013-05-12
      • 2014-01-14
      • 2019-05-15
      • 2013-05-28
      相关资源
      最近更新 更多