我正在使用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哈希的方法,但似乎都不支持创建键控哈希值。
答案 0 :(得分:4)
答案 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的算法就足够了。这取决于你愿意走多远 这条线...