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

我正在使用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哈希的方法,但似乎都不支持创建键控哈希。

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

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

我知道这已经过时了,但看起来微软解决了这个问题。 我在Windows 8上运行.NET 4.5.1。我无法说明修复了哪个版本的BCL或操作系统。

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

正式你可能运气不好,但用SHA-256构建HMAC_SHA256应该相对容易。 只需看一下维基百科页面 ,看看它有多容易。

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

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