使用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.
解决方案
- 在系统的组策略中禁用FIPS加密算法, 具体路径:
组策略 -> 计算机配置 -> Windows设置 -> 安全设置 -> 本地策略 -> 安全选项
禁用系统加密:将FIPS兼容算法用于加密、哈希和签名项
- 在注册表中关闭FIPS加密算法, 具体路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy
将Enable的值设为0.
- 在应用程序的配置文件中,增加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;
}
}