简单的问题,我知道在源代码中以纯文本形式存储连接字符串是一个坏主意,因为有人可以使用 Ildasm.exe 之类的工具来反编译并随后查看您的连接字符串,但为什么使用 App.config 更安全?
当然,这个配置文件就在你的可执行文件旁边,所以如果有人可以访问你的可执行文件进行反编译,他们也可以访问你的配置文件,因此也可以访问你的连接字符串。
所以我的问题是,为什么 App.config 存储连接字符串的位置比在代码中更安全?
简单的问题,我知道在源代码中以纯文本形式存储连接字符串是一个坏主意,因为有人可以使用 Ildasm.exe 之类的工具来反编译并随后查看您的连接字符串,但为什么使用 App.config 更安全?
当然,这个配置文件就在你的可执行文件旁边,所以如果有人可以访问你的可执行文件进行反编译,他们也可以访问你的配置文件,因此也可以访问你的连接字符串。
所以我的问题是,为什么 App.config 存储连接字符串的位置比在代码中更安全?
您可以保护配置文件中的任何信息。此演练链接:使用受保护的配置加密配置信息解释了如何
更新:抱歉链接断开,我更新它并添加文章标题。解决方案是使用RsaProtectedConfigurationProvider。我在我的 WebUtility 帮助器类中创建了一个简单的方法:
public static void CheckWebConfigSecured(string webPath, params string[] sections)
{
Configuration confg = WebConfigurationManager.OpenWebConfiguration(webPath);
bool done = false;
foreach (string section in sections)
{
ConfigurationSection confSection = confg.GetSection(section);
if ((confSection != null) && !confSection.SectionInformation.IsProtected)
{
confSection.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
done = true;
}
}
if (done)
{
confg.Save();
}
}
我在Application_BeginRequest上从Global.asax.cs调用
WebUtility.CheckWebConfigSecured(
context.Request.ApplicationPath,
"connectionStrings",
"appSettings",
"log4net");
其中connectionStrings、appSettings和log4net是我要保护的 web.config 部分。
结果服务器上 Web.config 文件中的这些部分类似于以下示例,在部署后首次访问该站点后:
<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>YbjvJF6IpTaEFb58ag1O ... HJm1uzA=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>mzJ2PoteOG7ZpAs922sounmG ... 02D3ZiM1PCliSw==</CipherValue>
</CipherData>
</EncryptedData>
</appSettings>
除非二进制文件被混淆,否则使用简单的十六进制编辑器可以很容易地从已编译的二进制文件中以文字字符串的形式存储连接字符串。
App.config 不一定更安全,但有一个选项可以加密 App.config 中的信息,这比明文更安全。
App.config 也可以在文件系统的 ACL 级别进行保护。这可以补充安全性,但并不总是像通常那样实用,主机服务器管理员将拥有该文件的权限。
如果您以明文形式保留连接字符串,则 App.config 本身并不会更安全。但是,您可以加密部分配置文件,这将提高安全性。
http://msdn.microsoft.com/en-us/library/53tyfkaw.aspx
http://www.codeproject.com/Articles/18209/Encrypting-the-app-config-File-for-Windows-Forms-A
如果您不想将连接字符串存储在应用程序文件夹中的文件中,也可以将连接字符串存储在加密的注册表项中。