- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的配置文件中,我想要加密一些敏感信息以提高安全性。
这是我的代码(按预期工作):
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);
}
}
.配置:
<?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;
即使我的文件现在已加密,我也能得到解密后的值。我不明白为什么...
谢谢你的帮助
最佳答案
首先,您需要了解加密如何以及从哪些配置中真正保护您。 RsaProtectedConfigurationProvider
可以在两个地方存储用于实际加密的私钥。第一个是
C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
这是存储机器范围 key 的文件夹。默认情况下,任何用户都可以访问此文件夹,但您需要提升权限(以管理员身份运行)才能读取此文件夹中的文件(同样,默认情况下)。
第二个可能的位置是
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)。
现在,当您知道所有这些后,您就可以做出明智的决定,是否需要加密您的部分,如果需要 - 使用哪个位置。
如果您使用机器级位置(默认)- 您的应用程序应该运行提升(在管理员下)以加密和您的部分的解密。如果有人可以访问您的配置文件 - 他将无法在没有管理员权限的情况下解密它。在某些环境(尤其是企业)中,提升运行可能是个问题。
如果您使用用户级位置 - 您的应用程序不需要以提升的方式运行。只有加密部分的用户以后才能解密它。如果有人以不同的用户(想象一些公司域)访问您的计算机并窃取文件 - 他将无法解密它。
您可以为特定用户\机器预加密您的部分(如有必要,加密部分的 key 可以从一台机器导出到另一台机器)或在第一次运行时要求用户输入敏感数据(数据库密码为示例)- 然后将该数据保存到 app.config 和加密部分。
至于为什么您会自动获得解密值 - 那是因为如果可能的话,它是即时解密的。默认情况下,您似乎以管理员身份运行(例如,禁用了 UAC),因此您可以访问用于加密的 key ,因此可以解密。如果您在没有管理员的情况下运行 - 当您尝试访问加密值时它会抛出异常。
关于c# - 如何使用 RsaProtectedConfigurationProvider 加密/解密配置文件部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37142094/
场景: 我有一个 WPF 桌面应用程序,它将为不同的客户分布在不同的机器上。 该应用程序有一个 XML 配置文件“ApplicationConfiguration.xml” 此 XML 文件包含连接字
在什么情况下应该使用 RsaProtectedConfigurationProvider 而不是 DataProtectionConfigurationProvider,反之亦然? 最佳答案 它们都提
在我的连接到 MS Sql 数据库的应用程序中,我使用的是 Microsoft.Data.ConnectionUI我的应用程序在我的电脑上工作。如果我在另一台计算机上运行此应用程序,当我打开连接对话框
在我的 Windows 应用程序中,我试图加密 app.config 文件的连接字符串部分,我的 app.config 文件的连接字符串部分是 在 .cs 文件中,我正在加密它 Configur
在我的配置文件中,我想要加密一些敏感信息以提高安全性。 这是我的代码(按预期工作): class Program { static void Main(string[] args) {
我正在使用 System.Configuration 来加密和保护自定义配置部分中的一些密码:-。 static public void SetPassAndProtectSection(string
我的应用程序可以保护所选的配置文件。这是使用 SectionInformation.ProtectSection 完成的加载指定部分的方法Configuration .我正在使用标准提供程序 RsaP
如果开发人员在自己的机器上使用 RSAProtectedConfigurationProvider 加密连接字符串 app.config 部分,然后将其部署到用户的工作站,那么该用户的工作站(或服务器
无法使用提供程序“RsaProtectedCo”加密“connectionStrings”部分 nfigurationProvider'。来自提供者的错误消息:对象已存在。 我遵循了 http://m
我找不到(经过数小时的谷歌搜索)MSDN 文章/文档,其中声明了 RSAProtectedConfigurationProvider 在为 ASP.NET Web 应用程序加密 web.config
在我们的程序安装过程中,我们运行此方法来加密 app.config 的部分: // Get the application configuration file. Configuration conf
在下面的示例中,我保护了“Sleutels.config”文件的“DemoWinApp.Properties.Settings”部分。 private static void togglePr
对于我的 .NET Windows 服务,我需要为我自己的 ASP.NET 网络应用程序解析 web.config 文件。我使用 XmlTextReader 进行解析,效果很好,除非我需要解密用 Rs
我正在尝试按照 procedure described on MSDN 加密 ASP.NET 2.0 Web 应用程序的 Web.Config 文件中的连接字符串值。 。使用 RsaProtected
我是一名优秀的程序员,十分优秀!