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
编辑: 有谁知道为什么微软在.NET的后续版本中拿出了AesProtectedConfigurationProvider?这似乎是一个倒退,因为AES是当前的标准,而不再推荐3DES.在与同事交谈时,他们提到可能由于安全漏洞而被删除,例如; 特权提升.众所周知,微软在安全方面做出了未经通知的变更.但是,我想知道是否有人确切知道.如果确实在AesProtectedConfigurationProvider中发现了一个缺陷,那么我可能倾向于继续使用3DES.
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)
你可以阅读AesProvider和IISWASOnlyAesProvider在IIS确保配置的文章:
AesProvider - 使用AES加密加密IIS工作进程读取的IIS配置节.
IISWASOnlyAesProvider - 使用AES加密加密WAS读取的IIS配置节.
所以回答你的第一个问题:
- 确认使用AesProtectedConfigurationProvider是否安全.微软在随后的.NET版本中删除了它,但我似乎无法找到原因
是的,如果我们假设您已正确实施它而没有安全漏洞,则使用您的自定义AES提供程序是安全的.微软尚未AesProtectedConfigurationProvider从.Net Framework中删除,它从未成为其中的一部分System.Configuration.如果微软在其实施中发现安全漏洞,他们可以修复它而不是删除,对吗?
- 提供实现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提供商更好.您正在使用现有的密钥存储方法,并且您可以避免可能的(极有可能的)安全漏洞.