是否有针对.NET的FIPS兼容的密钥SHA256哈希算法?

时间:2013-07-25 15:34:07

标签: c# .net hash sha256 fips

我正在使用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使用的是底层SHA256Managed实现,它本身不符合FIPS。

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

我知道这已经过时了,但看起来微软解决了这个问题。我在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")));

答案 2 :(得分:0)

官方说你可能运气不好,但用SHA-256构建HMAC_SHA256应该相对容易。只需看看the Wikipedia page,看看这有多容易。

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

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