如何在asp.net代码中强制执行FIPS(此实现不是Windows平台FIPS验证的加密算法的一部分。)

时间:2016-07-25 18:05:24

标签: c# asp.net algorithm fips

我的公司在.Net Framework 3.5中使用ASP.NET创建项目,并使用Windows Web服务器2008 r2来托管项目。

在Web服务器中,我们启用了“系统加密:使用符合FIPS的算法进行加密,散列和签名”的设置

之后,应用程序无法运行。它显示以下错误

[InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.]
   System.Security.Cryptography.RijndaelManaged..ctor() +7715396
   System.Web.Configuration.MachineKeySection.ConfigureEncryptionObject() +232
   System.Web.Configuration.MachineKeySection.EnsureConfig() +156
   System.Web.Configuration.MachineKeySection.GetEncodedData(Byte[] buf, Byte[] modifier, Int32 start, Int32& length) +37
   System.Web.UI.ObjectStateFormatter.Serialize(Object stateGraph) +166
   System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Serialize(Object state) +4
   System.Web.UI.Util.SerializeWithAssert(IStateFormatter formatter, Object stateGraph) +37
   System.Web.UI.HiddenFieldPageStatePersister.Save() +79
   System.Web.UI.Page.SavePageStateToPersistenceMedium(Object state) +105
   System.Web.UI.Page.SaveAllState() +236
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1099

堆栈追踪:

<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES" decryption="3DES"/>
<enforceFIPSPolicy enabled="false"/>

我们正在寻找解决方案。我们在网上找到的大多数解决方案都建议通过禁用“系统加密:使用符合FIPS的算法进行加密,散列和签名”的设置来禁用FIPS检查。 或者在web.config中添加这两行。

{{1}}

但出于安全考虑,我们不想为代码禁用FIPS检查。 相反,我们希望调整我们的代码或服务器设置,以便它在项目中强制执行FIPS策略并解释其功能。

任何人都可以就此提出任何想法吗?

2 个答案:

答案 0 :(得分:1)

有一个相关的MSDN blog。请尝试以下注册表更改:

  • HKLM \ System \ CurrentControlSet \ Control \ Lsa \ FIPSAlgorithmPolicy \ Enabled此注册表值反映当前的FIPS设置。如果启用此设置,则值为1.如果禁用此设置,则值为0.
  • HKLM \系统\ CurrentControlSet \控制\ LSA \ FIPSAlgorithmPolicy 此注册表值反映当前的FIPS设置。如果启用此设置,则值为1.如果禁用此设置,则值为0.
  

启用或禁用系统加密:使用符合FIPS的算法进行加密,散列和签名安全设置后,必须重新启动应用程序(如Internet Explorer)才能使新设置生效。

在您的情况下,回收网站的应用域应该足够了。

另请注意@Basic的评论,即在与政府系统进行交互的同时启用FIPS模式,可以cause other security headaches

答案 1 :(得分:0)

从堆栈跟踪中看,您似乎正在使用Rijndael算法的托管版本。
根据{{​​3}},没有托管实施经过FIPS认证

使用非托管实现应该可以解决您的问题:Rijnaed是AES的先驱-也许尝试this answer

非托管实现的缺点是它们可能AesCng