ASPNET_REGIIS:将AES密钥和IV放入KeyContainer

J W*_*ezy 12 c# asp.net encryption cryptography

是否可以使用ASPNET_REGIIS将AES密钥和IV放入KeyContainer?如果有,怎么样?

语境:

我创建了AesProtectedConfigurationProvider来使用AES加密web.config数据,而不是使用Triple DES(即3DES).我还创建了一个使用AesProtectedConfigurationProvider的控制台应用程序,以生成AES密钥和初始化向量(IV).我可以将密钥保存到文本文件,然后在web.config的提供程序中引用该文本文件.从那里,我可以加密web.config文件.但是,如果可能的话,我想通过将keys.txt文件移动到KeyContainer中来保护它们.

因此,在provider标记下,keyContainerName的部分将是:

keyContainerName="AesKeyContainer" 
Run Code Online (Sandbox Code Playgroud)

而不是

keyContainerName="C:\AesKey.txt"
Run Code Online (Sandbox Code Playgroud)

我的理解是ASPNET_REGIIS中现有的加密产品现在使用3DES加密web.config文件的内容,而RsaProtectedConfigurationProvider用于加密3DES密钥(如果我错了,请纠正我).因此,如果可以使用RsaProtectedConfigurationProvider将AES密钥加密到KeyContainer中,那么这将是有帮助的.我查看了以下网站,我不确定这是否可行:

https://msdn.microsoft.com/en-us/library/33ws57y0.aspx

如何使用AES而不是3DES加密web.config

编辑: 有谁知道为什么微软在.NET的后续版本中拿出了AesProtectedConfigurationProvider?这似乎是一个倒退,因为AES是当前的标准,而不再推荐3DES.在与同事交谈时,他们提到可能由于安全漏洞而被删除,例如; 特权提升.众所周知,微软在安全方面做出了未经通知的变更.但是,我想知道是否有人确切知道.如果确实在AesProtectedConfigurationProvider中发现了一个缺陷,那么我可能倾向于继续使用3DES.

Cod*_*ler 8

RsaProtectedConfigurationProvider并且AesProtectedConfigurationProvider,尽管非常相似的名称,不同的宇宙的组成部分.

RsaProtectedConfigurationProvider驻留在(System.Configuration并作为其他提供程序继承自abstract ProtectedConfigurationProvider)用于ASP.NET应用程序的web.config中的配置节的加密/解密.

AesProtectedConfigurationProvider反过来驻留在Microsoft.ApplicationHost并且仅用于IIS配置加密.在默认应用程序池(DefaultAppPool.config)的配置文件中,您将找到以下内容:

<configProtectedData>
    <providers>
        <!-- ... -->
        <add name="AesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" ... />
        <add name="IISWASOnlyAesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" ... />
    </providers>
</configProtectedData>
Run Code Online (Sandbox Code Playgroud)

你可以阅读AesProviderIISWASOnlyAesProviderIIS确保配置的文章:

AesProvider - 使用AES加密加密IIS工作进程读取的IIS配置节.

IISWASOnlyAesProvider - 使用AES加密加密WAS读取的IIS配置节.

所以回答你的第一个问题:

  1. 确认使用AesProtectedConfigurationProvider是否安全.微软在随后的.NET版本中删除了它,但我似乎无法找到原因

是的,如果我们假设您已正确实施它而没有安全漏洞,则使用您的自定义AES提供程序是安全的.微软尚未AesProtectedConfigurationProvider从.Net Framework中删除,它从未成为其中的一部分System.Configuration.如果微软在其实施中发现安全漏洞,他们可以修复它而不是删除,对吗?

  1. 提供实现AesProtectedConfigurationProvider的步骤并在ASPNET_REGIIS中创建KeyContainer

我相信你可以使用AES加密而无需实现自定义AesProtectedConfigurationProvider.

我深入研究了源代码,RsaProtectedConfigurationProvider发现它具有以下逻辑:

private SymmetricAlgorithm GetSymAlgorithmProvider() {
    SymmetricAlgorithm symAlg;

    if (UseFIPS) {
        // AesCryptoServiceProvider implementation is FIPS certified
        symAlg = new AesCryptoServiceProvider();
    }
    else {
        // Use the 3DES. FIPS obsolated 3DES
        symAlg = new TripleDESCryptoServiceProvider();

        byte[] rgbKey1 = GetRandomKey();
        symAlg.Key = rgbKey1;
        symAlg.Mode = CipherMode.ECB;
        symAlg.Padding = PaddingMode.PKCS7;
    }

    return symAlg;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,默认RSAProtectedConfigurationProvider支持通过三重DES切换到AES加密System.Security.Cryptography.AesCryptoServiceProvider.

UseFIPS标志从配置部分读取RsaProtectedConfigurationProvider.您可以在机器级别(machine.config)上设置它,以便它应用于所有加密配置或仅适用于特定的web.config.

对于以后的情况,请将以下部分添加到web.config(我已从machine.config复制了该部分并添加了useFIPS ="true"):

<configuration>

  <!-- ... -->

  <configProtectedData>
    <providers>
      <remove name="RsaProtectedConfigurationProvider"/>
      <add name="RsaProtectedConfigurationProvider"
           type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
           description="Uses RsaCryptoServiceProvider to encrypt and decrypt"
           keyContainerName="NetFrameworkConfigurationKey"
           cspProviderName=""
           useMachineContainer="true"
           useOAEP="false"
           useFIPS="true"
           />
    </providers>
  </configProtectedData>

  <!-- ... -->

</configuration>
Run Code Online (Sandbox Code Playgroud)

现在,如果您运行aspnet_regiis,您将看到数据使用256位AES加密:

<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
Run Code Online (Sandbox Code Playgroud)

AES对称密钥以与三重DES模式相同的方式存储:密钥使用RSA加密并嵌入加密部分,而RSA密钥存储在机器密钥容器中.有关详细信息,请参阅此博客文章.

我相信使用已经实现的AES加密RsaProtectedConfigurationProvider比自定义AES提供商更好.您正在使用现有的密钥存储方法,并且您可以避免可能的(极有可能的)安全漏洞.