在我的配置文件中,我有一些敏感信息,我想加密以获得更高的安全性。
这是我的代码(按预期工作):
class Program
{
static void Main(string[] args)
{
System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @"D:\Web_S\Prep\test\test.exe.config";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
string userNameWithoutEncryption = configuration.AppSettings.Settings["username"].Value;
EncryptAppSettings("appSettings", configuration);
}
protected static void EncryptAppSettings(string section, Configuration configuration)
{
AppSettingsSection objAppsettings = (AppSettingsSection)configuration.GetSection(section);
objAppsettings.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
objAppsettings.SectionInformation.ForceSave = true;
configuration.Save(ConfigurationSaveMode.Modified);
}
}
的.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="username" value="a2zmenu"/>
<add key="password" value="password"/>
</appSettings>
</configuration>
加密的.config看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="customAppSettings" type="System.Configuration.NameValueSectionHandler" />
</configSections>
<appSettings configProtectionProvider="RsaProtectedConfigurationProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>09+Lm23xDWWnAZFOagh3NRwp5tzad+3oedvTgoeWqunQBiAfk9UGfGxriZg6snwwANUDzOANZ+wOFUb6qa0Atf
NgSd6b4FFSKTqzkfLlk+S9GtPSAVrRaLU9
/Q2Qu7oxoSbhW7NWtengJbEZrFm+GqlLlm08w8Np/y03DMExFeA=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>qSYRXNEKhbwNodH60c7qoWeKZ2QKVQmizPXVGCgHVZPMQ4F+XDqlZa2OyIin0kEI3j8pCjNL097RlZClgdd
gPEd61AEw6DXJc43Z98obNFHmXfK9aS67qEtO6E
T+qCWQq2ZRbfK6xZ6jlfeink35/veUmoxAmDXrkwdrbQVKv98=</CipherValue>
</CipherData>
</EncryptedData>
</appSettings>
</configuration>
我有以下问题: 让信息如
是安全的 <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<。>在.config中?
是不是可以用这些信息解密它? 文件加密后,您能否确认我可以对此行进行评论:
EncryptAppSettings("appSettings", configuration);
当我尝试使用此行加密文件后获取用户名值时:
string userNameafterEncryption = configuration.AppSettings.Settings["username"].Value;
即使我的文件现在已加密,我也会获得解密值。我不明白为什么......
感谢您的帮助
答案 0 :(得分:16)
首先,您需要了解加密如何以及从哪种配置中真正保护您。 RsaProtectedConfigurationProvider
可以存储在两个地方用于实际加密的私钥。第一个是
C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
这是存储机器范围密钥的文件夹。默认情况下,任何用户都可以访问此文件夹,但您需要升级(以管理员身份运行)才能读取此文件夹中的文件(默认情况下再次)。
第二个可能的位置是
C:\Documents and Settings\[user name]\Application Data\Microsoft\Crypto\RSA
这是用户级位置 - 只有特定用户才能访问它。
默认情况下,RsaProtectedConfigurationProvider
将使用计算机级位置,这由此提供程序的UseMachineContainer
属性控制。默认配置在机器级配置文件(位于C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
)中定义,并且定义如下:
<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"/>
如果您想使用用户级位置加密您的部分,可以在自己的app.config文件中覆盖此配置(请参阅更多here)。
现在,当您了解所有这些内容时,您可以做出明智的决定,是否需要加密您的部分,如果是,则使用哪个位置。
如果您使用计算机级别的位置(默认) - 您的应用程序应该提升(在管理员下),以加密部分的加密和解密。如果有人可以访问您的配置文件 - 他将无法在没有管理员权限的情况下解密它。在某些环境(特别是公司)中运行提升可能是一个问题。
如果您使用用户级位置 - 您的应用程序不需要运行提升。只有加密部分的用户以后才能对其进行解密。如果有人在不同的用户(想象一些公司域)下访问您的计算机并窃取文件 - 他将无法解密它。
您可以为特定用户\机器预加密您的部分(加密部分的密钥可以在必要时从一台机器导出到另一台机器)或首次运行时请求用户键入敏感数据(密码到数据库为示例) - 然后将该数据保存到app.config并加密部分。
至于为什么你自动获得解密值 - 这是因为如果可能的话,它会被动态解密。您默认情况下以管理员身份运行(例如,禁用UAC),因此您可以访问用于加密的密钥,因此可以解密。如果您在没有管理员的情况下运行 - 当您尝试访问加密值时,它将抛出异常。