使用dotNet框架自带的Md5加密MD5CryptoServiceProvider时,在部分电脑上会出现InvalidOperationException.

System.InvalidOperationException: 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。
   在 System.Security.Cryptography.MD5CryptoServiceProvider..ctor()

出现的原因是系统启用了FIPS兼容算法,而FIPS标准并不支持MD5,所以当框架中的MD5算法调用系统的加密模块时就会爆异常.

FIPS 140-2 defines security standards that the United States and Canadian governments use to validate security levels for products that implement cryptography.

解决方案


  1. 在系统的组策略中禁用FIPS加密算法, 具体路径:
组策略 -> 计算机配置 -> Windows设置 -> 安全设置 -> 本地策略 -> 安全选项 

禁用系统加密:将FIPS兼容算法用于加密、哈希和签名

  1. 在注册表中关闭FIPS加密算法, 具体路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy

Enable的值设为0.

  1. 在应用程序的配置文件中,增加enforceFIPSPolicy键,将值设为false.
<configuration>
    <runtime>
        <enforceFIPSPolicy enabled="false"/>
    </runtime>
</configuration>
附方法2的C#版实现:

/// <summary>
/// 禁用系统FIPS算法
/// </summary>
public static void DisableFIPS()
{
    try
    {
        RegistryKey fipsAlgorithmPolicy = Registry.LocalMachine.CreateSubKey(@"SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy");
        fipsAlgorithmPolicy.SetValue("Enabled", 0);
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}