是否可以使用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。
答案 0 :(得分:7)
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>
您可以在IIS Securing Configuration文章中了解AesProvider
和IISWASOnlyAesProvider
:
AesProvider - 使用AES加密加密IIS工作进程读取的IIS配置节。
IISWASOnlyAesProvider - 使用AES加密加密WAS读取的IIS配置部分。
回答你的第一个问题:
- 确认使用AesProtectedConfigurationProvider是否安全。微软在随后的.NET版本中删除了它,但是我 似乎找不到理由
醇>
是的,如果我们假设您已正确实施它而没有安全漏洞,那么使用您的自定义AES提供程序是安全的。 Microsoft尚未从.Net Framework中删除AesProtectedConfigurationProvider
,它从未成为System.Configuration
的一部分。如果微软在其实施中发现了安全漏洞,他们可以修复它而不是删除,更正吗?
- 提供实施AesProtectedConfigurationProvider的步骤并在ASPNET_REGIIS中创建KeyContainer
醇>
我相信您可以在不实施自定义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提供商更好的选择。您正在使用现有的密钥存储方法,并且可以防止可能的(极有可能的)安全漏洞。