我正在尝试设置一个Web应用程序,以便在Windows注册表中FIPSAlgorithmPolicy
设置为1
的环境中工作(特别是HKLM / SYSTEM / CurrentControlSet / Control / Lsa) 。启用此标志后,对类MD5CryptoServiceProvider
的任何调用都将导致使用以下堆栈跟踪抛出Invalid Operation Exception
:
[InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.]
System.Security.Cryptography.RijndaelManaged..ctor() +10480142
System.Web.Configuration.MachineKeySection.ConfigureEncryptionObject() +439
System.Web.Configuration.MachineKeySection.EnsureConfig() +152
System.Web.Configuration.MachineKeySection.GetEncodedData(Byte[] buf, Byte[] modifier, Int32 start, Int32& length) +48
System.Web.UI.ObjectStateFormatter.Serialize(Object stateGraph) +381
System.Web.UI.Util.SerializeWithAssert(IStateFormatter formatter, Object stateGraph) +59
System.Web.UI.HiddenFieldPageStatePersister.Save() +89
System.Web.UI.Page.SaveAllState() +1117
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3864
根据我在this article中读到的内容,您应该能够将以下内容添加到配置文件中以禁用算法检查:
<configuration>
<runtime>
<enforceFIPSPolicy enabled="false"/>
</runtime>
</configuration>
通过修改app.config,我可以在测试控制台应用程序中使用它。但是,在修改.NET 2.0 Web应用程序的web.config。
时,它似乎不起作用对我来说有趣的是,即使我在代码中实例化MD5CryptoServiceProvider
时捕获了所有异常,但它似乎甚至没有进入我的代码部分。这是我的测试应用程序中调用的代码:
protected string printSomething()
{
string toPrint = String.Empty;
try
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
toPrint = "Created algorithm.";
}
catch (Exception e)
{
toPrint = e.ToString();
}
return toPrint;
}
这是我在访问该页面时看到的内容:
所以这提出了几个问题:
<enforceFIPSPolicy enabled="false"/>
?答案 0 :(得分:6)
1)。您的代码不会抛出异常。 ASP.NET正在做其他事情。 ASP.NET正在尝试序列化ViewState;可以通过机器密钥加密。当ASP.NET在内部执行此操作时;它使用RijndaelManaged
类(不符合FIPS 140;并且爆炸。同样;当ASP.NET尝试加密/解密表单身份验证票证时;它也将使用机器密钥。
您有一些机器密钥问题的选项。您可以使用3DES(通过将web.config中的MachineKey设置为如下所示,它将始终使用符合FIPS的实现:
<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES" decryption="3DES" />
2)。我不确定为什么你的旗子被忽略了。它不应该。如果我搞清楚了,我会编辑。
请注意,MD5CryptoServiceProvider
可能仍在轰炸。 MD5不是符合FIPS标准的哈希。我所知道的;只有SHA-1和SHA-2哈希算法在.NET中。以CryptoServiceProvider
结尾的加密函数依赖于Windows CSP;这也承认了这面旗帜。另一种方法是使用BouncyCastle而不是.NET的实现,因为它不关心那个标志。
答案 1 :(得分:2)
我认为您需要更新更多文件。来自here
将以下文本添加到文件中。
<configuration>
<runtime>
<enforceFIPSPolicy enabled="0" />
</runtime>
</configuration>
如果ASP.NET Development Server正在运行,请将其停止。您可以通过右键单击系统托盘中的图标并选择停止来执行此操作。
C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\
或包含devenv.exe.config的任何文件夹。将以下行添加到devenv.exe.config的运行时部分。
<enforceFIPSPolicy enabled=”0” />
如果Visual Studio已打开,请将其关闭并再次打开。
仔细检查Web.config中没有。设置调试编译时,.NET使用MD5哈希进行内部簿记。 MD5不符合FIPS,因此您会收到此错误。
ASP.NET 2.0在处理视图状态数据时使用AES算法的RijndaelManaged实现。 RijndaelManaged实施尚未得到美国国家标准与技术研究院(NIST)的认证,符合联邦信息处理标准(FIPS)。因此,AES算法不是Windows平台FIPS验证的加密算法的一部分。要解决此问题,您可以使用以下行在web.config中指定其他算法:
<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES" decryption="3DES"/>
它还通过MSFT确认here您得到了同样的错误。解决它:
在记事本等文本编辑器中,打开应用程序级Web.config文件。 在Web.config文件中,找到该部分。 在以下部分添加以下部分:
`<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES" decryption="3DES"/>`
保存Web.config文件。 重新启动Microsoft Internet信息服务(IIS)服务。为此,请在命令提示符处运行以下命令: IISRESET
答案 2 :(得分:1)
正如您所发现的那样,web.config条目不起作用,至少在iis 7.5转发中是这样。相反,您需要使用应用程序池配置文件,如here
所述答案 3 :(得分:0)
因此,即使它很旧,它仍然有些相关。设置
<configuration>
<runtime>
<enforceFIPSPolicy enabled="false" />
</runtime>
</configuration>
进入Framework和/或Framework64 .net文件夹中的aspnet.config。此旁路设置适用于应用程序配置文件。 Web.config不是应用程序配置文件。