代码之家  ›  专栏  ›  技术社区  ›  Tim Danner

ASP.NET脚本管理器是否可以用于Windows FIPS安全策略?

  •  5
  • Tim Danner  · 技术社区  · 14 年前

    如果在Windows中启用“使用符合FIPS的加密、哈希和签名算法”安全策略选项,尝试使用.NET框架中的许多加密类将导致InvalidOperationException。默认情况下,ASP.NET使用AES加密viewstate blob,因此失败。您可以通过向web.config添加这样的键来解决此问题:

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

    这就涵盖了基本的ASP.NET使用。我的问题是:我有一个庞大、复杂的ASP.NET Web应用程序,大量使用Script管理器(ASP.NET Ajax的基础),需要由一个必须启用FIPS策略设置的政府客户来部署。带有脚本管理器的任何ASP.NET页都会引发此异常:

    [InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.]
       System.Security.Cryptography.SHA1Managed..ctor() +3607454
       System.Security.Policy.Hash.get_SHA1() +45
       System.Web.Handlers.ScriptResourceHandler.GetAssemblyInfoInternal(Assembly assembly) +85
       System.Web.Handlers.ScriptResourceHandler.GetAssemblyInfo(Assembly assembly) +99
       System.Web.Handlers.RuntimeScriptResourceHandler.GetScriptResourceUrlImpl(List`1 assemblyResourceLists, Boolean zip, Boolean notifyScriptLoaded) +525
       System.Web.Handlers.RuntimeScriptResourceHandler.System.Web.Handlers.IScriptResourceHandler.GetScriptResourceUrl(List`1 assemblyResourceLists, Boolean zip, Boolean notifyScriptLoaded) +910
       System.Web.Handlers.RuntimeScriptResourceHandler.System.Web.Handlers.IScriptResourceHandler.GetScriptResourceUrl(Assembly assembly, String resourceName, CultureInfo culture, Boolean zip, Boolean notifyScriptLoaded) +193
       System.Web.UI.ScriptReference.GetUrlFromName(ScriptManager scriptManager, IControl scriptManagerControl, Boolean zip) +306
       System.Web.UI.ScriptManager.RegisterUniqueScripts(List`1 uniqueScripts) +169
       System.Web.UI.ScriptManager.RegisterScripts() +407
       System.Web.UI.ScriptManager.OnPagePreRenderComplete(Object sender, EventArgs e) +200
       System.Web.UI.Page.OnPreRenderComplete(EventArgs e) +11041982
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3672
    

    甚至添加 <enforceFIPSPolicy enabled="false"/> 元素到web.config无法解决异常。

    是否有任何方法来配置ASP.NET,以便脚本管理器可以与Windows FIPS安全策略一起使用?

    2 回复  |  直到 14 年前
        1
  •  3
  •   John Taylor    14 年前

    来自Microsoft的更新:热修复程序位于 http://code.msdn.microsoft.com/KB981119

    答案是,不能在启用FIPS的服务器上使用ScriptManager。:(

    类System.Web.Handlers.ScriptResourceHandler的静态方法GetAssemblyInfo创建不符合FIPS的哈希对象。这在.NET 3.5 SP1和.NET 3.51之间进行了更改。

    (system.web.extensions版本3.5.30729.196)
    XP/2003/2008.NET 3.5 SP1版

    private static Pair<AssemblyName, DateTime> GetAssemblyInfoInternal(Assembly assembly)
    {
        return new Pair<AssemblyName, DateTime>(new AssemblyName(assembly.FullName), GetLastWriteTime(assembly));
    }
    

    (system.web.extensions版本3.5.30729.4926)
    Win7/2008R2.NET 3.51

    private static Pair<AssemblyName, string> GetAssemblyInfoInternal(Assembly assembly)
    {
        AssemblyName first = new AssemblyName(assembly.FullName);
        return new Pair<AssemblyName, string>(first, Convert.ToBase64String(new Hash(assembly).SHA1));
    }
    

    显然,从时间日期戳到哈希的变化破坏了FIPS的遵从性。我们已经与微软一起开启了一个支持案例。

        2
  •  1
  •   chrisj    14 年前

    微软发布了一个修补程序来解决这个问题:KB981119。我不认为修补程序是通过微软网站公开的。