FIPS-enabled系统中是否有替代MD5的哈希算法?

27
无论何时我尝试在启用 FIPS 的 Windows XP 计算机上使用 MD5,都会出现“System.InvalidOperationException”错误。
在 FIPS 上是否有替代的算法可供使用,而不是 MD5?

快速提示:如果在您的Windows服务器上启用了FIPS算法策略,则位于System.Cryptography库中的默认加密提供程序将关闭。 在选择解决方案时,请记住这一点,因为System.Cryptography提供程序将不再可用。 查看策略状态:HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ fipsalgorithmpolicy - Prisoner ZERO
这个重复问题的答案提供了另一种选择。 - Frédéric
4个回答

20

3
HMACSHA1和MACTripleDES都是带密钥的,与普通哈希函数有不同的用途。它们并不是MD5的直接替代品。 - LukeH
8
@CodyGray,“绝对没有理由不使用最安全的算法”这种说法并不准确——安全性始终是一个权衡,根据应用场景,您需要考虑诸如性能、存储要求和互操作性等因素。 - Cocowalla
5
有时候哈希值只是用于比较指纹,而非安全相关或密码哈希。 - Scott Stafford
2
请注意上下文,@Scott。这个问题是关于满足强制性FIPS标准的。 - Cody Gray
1
我看到了这篇文章,因为我正在部署到一个要求FIPS的机器上。在这里,特定的用例不需要强大的加密安全性,尽管该机器仅将MD5列入黑名单。对于我的情况来说,这有些过度并且很麻烦。 - Scott Stafford
显示剩余7条评论

13

当你在Windows安全策略设置中强制执行FIPS合规性时,你断言你只会使用经过FIPS认证的加密和散列算法。MD5不是其中获得批准的哈希算法之一,这就是为什么会引发异常。

解决方法很简单:选择另一个哈希算法。.NET Framework提供了许多其他选项,可以在System.Security.Cryptography命名空间中找到。选择SHA家族算法之一。我想象不出你为什么要使用MD5而不是其中的一种替代方案。


1
它们是否都符合FIPS标准,或者哪一个是符合FIPS标准的比MD5更好的替代方案? - qazwsx
2
@qazwsx:SHA系列中的任何一种都符合FIPS标准。它们按字母顺序排列在页面底部,因此您将在那里看到整个组。我不知道不使用SHA512的任何令人信服的理由。 - Cody Gray
14
"我想不出为什么你要使用MD5而不是其他替代方案。" 当与希望使用MD5哈希的第三方系统交互时。 - Micah Zoltu
如果在您的Windows服务器上启用了FIPS算法策略,则位于System.Cryptography库中的默认加密提供程序将关闭。 - Prisoner ZERO

7
你可以使用来自Org.BouncyCastle.Crypto.Digests的MD5Digest。
MD5Digest hash = new MD5Digest();

public byte[] Hash(byte[] input)
{
     hash.BlockUpdate(input, 0, input.Length);
     byte[] result = new byte[hash.GetDigestSize()];
     hash.DoFinal(result, 0);
     return result;
}

public string Hash(string input)
{
     var data = System.Text.Encoding.Unicode.GetBytes(input);
     hash.BlockUpdate(data, 0, data.Length);
     byte[] result = new byte[hash.GetDigestSize()];
     hash.DoFinal(result, 0);

     return Hex.ToHexString(result).ToUpper();
}

1
这是我在任何地方看到的对这个问题最好的答案。 - Mike Godin
10
您可以使用它,并且不会出错,但它不符合FIPS标准。 - Brian White

3

在进行加密哈希时,您可以使用SHA1、SHA2或SHA3,如果需要的话可以使用HMAC。

如果您想要用MD5进行非加密目的,那么也是可以的,但您需要提供自己的实现。例如:

  • 对文件进行哈希以确定重复项
  • 内部哈希表实现
  • 根据提供的MD5哈希验证文件

最后一点是有问题的;验证SHA1/SHA2哈希会更好,这取决于验证方式(例如,在传输过程中是否损坏 vs. 数据包认证)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接