对于支持FIPS的系统,是否有针对MD5的备用哈希算法?

qaz*_*wsx 19 .net c# md5 cryptography invalidoperationexception

每当我尝试在启用了FIPS的Windows XP计算机上使用MD5时,我都会得到一个System.InvalidOperationException.

在FIPS上是否应该使用替代算法而不是MD5?

Bor*_*rja 15

MD5不符合FIPS标准.您可以使用以下散列算法之一代替MD5:

  • @CodyGray它根本不是真的,"绝对没有理由使用除了最安全的算法之外的任何东西" - 安全性始终是一种权衡,并且根据应用程序,您需要考虑诸如性能,存储要求和互操作性之类的东西. (6认同)
  • @Cody Gray:有时哈希只是用于比较指纹的哈希,而不是与安全相关的哈希或密码哈希。 (3认同)
  • HMACSHA1和MACTripleDES都是键控的,与普通哈希的用途不同.它们并不是MD5的直接替代品. (2认同)
  • 请注意上下文,@Scott。问题在于是否满足法定的 FIPS 标准。 (2认同)

Cod*_*ray 12

在Windows安全策略设置中强制执行FIPS合规性时,您断言您将仅使用FIPS认证的加密和散列算法.MD5 不是这些经批准的散列算法之一,这就是抛出异常的原因.

解决方法很简单:选择不同的散列算法..NET Framework在System.Security.Cryptography命名空间中提供了许多其他选项.选择SHA系列算法之一.我无法想象你有什么理由不得不使用MD5而不是其中一种替代品.

  • @CodyGray"我无法想象你将不得不使用MD5而不是其中一种替代方案." 与需要MD5哈希值的第三方系统进行交互时. (6认同)
  • @qazwsx:任何SHA系列都符合FIPS标准.它们在页面上按字母顺序排序,因此您将看到整个组位于底部.我不知道任何令人信服的理由不使用SHA512. (2认同)

Man*_*shM 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用它并且不会出错,但它不符合 fips。 (11认同)