是否存在适用于.NET的符合FIPS的键控SHA256哈希算法
本文关键字:SHA256 算法 哈希 FIPS 存在 适用于 NET 是否 | 更新日期: 2023-09-27 18:25:06
我正在使用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哈希的方法,但似乎都不支持创建密钥哈希。
我知道这是旧的,但看起来微软解决了这个问题。我在Windows8上运行.NET 4.5.1。我不知道这是什么版本的BCL修复或操作系统。
this.m_hash1 = HMAC.GetHashAlgorithmWithFipsFallback((Func<HashAlgorithm>) (() => (HashAlgorithm) new SHA256Managed()), (Func<HashAlgorithm>) (() => HashAlgorithm.Create("System.Security.Cryptography.SHA256CryptoServiceProvider")));
不,没有。以下是一个列表(向下滚动到FIPS.sys Algorithms
部分)。
我过去使用过的变通方法在这里,但我不确定这是否适用于web服务。这个解决方案是可行的。
官方表示,您可能运气不佳,但从SHA-256构建HMAC_SHA256应该相对容易。只要看看维基百科的页面就知道这有多容易
请注意,HMAC可能未在FIPS模式下获得批准,因为它容易受到侧信道攻击。在这种情况下,您应该确保有一些保护措施来抵御侧通道攻击。
用加密原语构建自己的加密算法有点危险。如果您自己尝试并声明FIPS级别的安全性,那么这可能会成为一个问题。但对于大多数用户来说,如果你说你只使用符合NIST的算法,那就足够了。这取决于你愿意在这条线上走多远。。。