为啥 App.config 存储连接字符串的位置比源代码中更安全?

Posted

技术标签:

【中文标题】为啥 App.config 存储连接字符串的位置比源代码中更安全?【英文标题】:Why is App.config a more secure location for storing a connection string than in the source code?为什么 App.config 存储连接字符串的位置比源代码中更安全? 【发布时间】:2012-11-16 09:55:10 【问题描述】:

简单的问题,我知道在源代码中以纯文本形式存储连接字符串是一个坏主意,因为有人可以使用 Ildasm.exe 之类的工具来反编译并随后查看您的连接字符串,但为什么要使用 App.配置更安全吗?

这个配置文件肯定就在你的可执行文件旁边,所以如果有人可以访问你的可执行文件进行反编译,他们也可以访问你的配置文件,因此也可以访问你的连接字符串。

所以我的问题是,为什么 App.config 存储连接字符串的位置比在代码中更安全?

【问题讨论】:

是什么让您觉得它更安全?在配置文件中更改连接字符串比在代码中更容易 - 这就是为什么它通常被认为是他们的更好位置。 您可以加密 app.config 文件。 (msdn.microsoft.com/en-us/library/53tyfkaw.aspx) 【参考方案1】:

您可以保护配置文件中的任何信息。这个指向Walkthrough: Encrypting Configuration Information Using Protected Configuration的链接解释了如何

更新: 抱歉链接断开,我更新它并添加文章标题。解决方案是使用 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");

connectionStringsappSettingslog4net 是我想要保护的 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>

【讨论】:

【参考方案2】:

使用简单的十六进制编辑器可以很容易地从已编译的二进制文件中以文字字符串的形式存储连接字符串,除非二进制文件已被混淆。

App.config 不一定更安全,但有一个选项可以加密 App.config 中的信息,这将比明文更安全。

App.config 也可以在文件系统的 ACL 级别进行保护。这可以补充安全性,但并不总是像通常那样实用,主机服务器管理员将有权访问该文件。

【讨论】:

【参考方案3】:

如果您以明文形式保留连接字符串,则 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

如果您不想将连接字符串存储在应用程序文件夹中的文件中,也可以将连接字符串存储在加密的注册表项中。

【讨论】:

以上是关于为啥 App.config 存储连接字符串的位置比源代码中更安全?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我需要在 Azure 管理门户中而不是在我的 WebJob 的 App.config 中为 WebJobs 配置连接字符串?

web.config 覆盖 app.config ...为啥?

为啥使用 app.config 来存储配置数据?

如何在(App.config)connectionString 中使用应用程序数据

在 C# 运行时读取、写入和更新 app.config 文件中的连接字符串

为啥这个类库 dll 没有从 app.config 获取信息