ASPNET_REGIIS:将AES密钥和IV放入KeyContainer

时间:2018-02-14 05:32:48

标签: 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" 

而不是

keyContainerName="C:\AesKey.txt"

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

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

How to encrypt web.config with AES instead of 3DES

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

1 个答案:

答案 0 :(得分:7)

RsaProtectedConfigurationProviderAesProtectedConfigurationProvider,尽管名称非常相似,但却是不同宇宙的一部分。

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>

您可以在IIS Securing Configuration文章中了解AesProviderIISWASOnlyAesProvider

  

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

     

IISWASOnlyAesProvider - 使用AES加密加密WAS读取的IIS配置部分。

回答你的第一个问题:

  
      
  1. 确认使用AesProtectedConfigurationProvider是否安全。微软在随后的.NET版本中删除了它,但是我   似乎找不到理由
  2.   

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

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

我相信您可以在不实施自定义AesProtectedConfigurationProvider的情况下进行AES加密。

我深入研究RsaProtectedConfigurationProvider的{​​{3}},发现它具有以下逻辑:

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;
}

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

UseFIPS的配置部分读取

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

以后的情况将以下部分添加到web.config(我已经从machine.config复制了部分并添加了useFIPS =&#34; true&#34;):

<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>

现在,如果你运行aspnet_regiis,你会发现数据是用256位AES加密的:

<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />

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

我认为使用已在RsaProtectedConfigurationProvider中实施的AES加密是比自定义AES提供商更好的选择。您正在使用现有的密钥存储方法,并且可以防止可能的(极有可能的)安全漏洞。