3

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

4

3 回答 3

4

我知道这很旧,但看起来微软已经解决了这个问题。我在 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")));
于 2014-07-03T03:56:51.910 回答
3

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

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

于 2013-07-25T15:42:28.223 回答
0

正式地你可能不走运,但从 SHA-256 构建 HMAC_SHA256 应该相对容易。只需查看Wikipedia 页面即可了解这有多容易。

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

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

于 2013-07-26T16:07:57.613 回答