加密将重新分发的 App.config 文件中的部分和/或设置

Posted

技术标签:

【中文标题】加密将重新分发的 App.config 文件中的部分和/或设置【英文标题】:Encrypting sections and-or settings in an App.config file that will be redistributed 【发布时间】:2011-01-13 07:10:56 【问题描述】:

我正在创建一个常规的 Windows 应用程序,该应用程序将分发给我部门的多个用户。我需要在 App.config 文件中包含一些连接密码,而且我显然不希望最终用户启动记事本并查看密码。

有几篇文章指出了如何加密/解密配置部分,但您似乎必须与可部署的解决方案共享/发送一些密钥。

有没有更简单的方法,只是加密一些设置,使它们不可读,但在重新分发程序时不需要额外的步骤或文件?好处是访问配置设置在 .NET 代码中仍然是透明的。我总是可以创建一个自定义方法来加盐/加密字符串并在我的自定义代码中解密它,但我想知道是否有更简单的方法。

非常感谢任何有关如何执行此操作的文章的答案或链接。谢谢

【问题讨论】:

【参考方案1】:

如果您尝试在 App.Config/Web.Config 中加密连接字符串,您可以使用 Configuration 类来实现:

Configuration config = ConfigurationManager.   OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSection section =    config.GetSection("connectionStrings");
if (section != null)

    if (!section.IsReadOnly())
    
        section.SectionInformation.ProtectSection             ("RsaProtectedConfigurationProvider");
        section.SectionInformation.ForceSave = true;
        config.Save(ConfigurationSaveMode.Full);
    

有两种方法:RsaProtectedConfigurationProviderDPAPIProtectedConfigurationProvider

看这个 --> http://www.codeproject.com/KB/cs/Configuration_File.aspx 和 http://msdn.microsoft.com/en-us/library/89211k9b(VS.80).aspx。

【讨论】:

Bhaskar,你试过这个吗?实际加密该部分,将受保护的 app.config 文件重新分发给另一个开发人员或最终用户机器,并查看透明解密是否自动工作? 是的,我已经加密了配置文件并在我的 prod 环境中重新分发了它。 这样的解决方案(默默无闻的“安全”)会让你在一家称职的科技公司被解雇。如果您的代码可以检索明文,是什么让您认为攻击者不能使用相同的代码...检索明文?唯一真正的解决方案是在服务器端施加安全限制。【参考方案2】:

简而言之,密码学不是可以神奇地修复不安全程序的魔杖。

攻击者会在应用程序运行时尝试使用调试器从内存中获取密码。密码也将存在于二进制文件中,并且很容易获得。可以绕过任何加密的使用,因为密码在使用时必须是纯文本。任何时候使用内存都可以通过调试器进行观察。

答案在于反调试:http://www.codeproject.com/KB/security/Intro_To_Win_Anti_Debug.aspx

更高级的windows反调试:

http://www.veracode.com/blog/2008/12/anti-debugging-series-part-i/

http://www.veracode.com/blog/2008/12/anti-debugging-series-part-ii/

http://www.veracode.com/blog/2009/01/anti-debugging-series-part-iii/

http://www.veracode.com/blog/2009/02/anti-debugging-series-part-iv/

【讨论】:

您也可以使用SecureString来确保密码在任何时候都不会以纯文本形式出现在内存中。 @Ryan 理论上很好,但实际上没有 SqlConnection 接受 SecureString,并且在从配置中读取它并将其传递到之间的某个时间点,该字符串也必须不加密安全字符串。【参考方案3】:

无论哪种方式,应用程序配置文件的加密和解密都是没有意义的,因为.EXE可以通过Reflector检查!

当然,您可以混淆代码,但这会让在生产环境中调试成为一场噩梦,因为您无法知道什么/在哪里/为什么/如何监控奇怪的错误这只会在发布时显示,因为堆栈跟踪和错误消息也会被混淆......

这是需要牢记的事情,也是一个潜在的陷阱……用户可能不精通技术,但理论上他们可以确保他们可以在你不知情的情况下让朋友/亲戚/合作伙伴破解/破坏它。这个答案并不是要让你失望,希望你不会被我的回答冒犯......

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

感谢汤姆,但我并不真正关心它是否被真正加密,加密就可以了。只要用文本编辑器打开app.config看不到密码就好了。

以上是关于加密将重新分发的 App.config 文件中的部分和/或设置的主要内容,如果未能解决你的问题,请参考以下文章

加密 connectionStrings 部分 - app.config 的实用程序

加密 App.Config 部分并部署到多台机器

为 WinForms 应用程序加密 app.config 中的连接字符串

App.config 中的更改不会在重新启动应用程序后反映出来

获取加密的 app.config 的公钥和私钥

加密 app.config 中的连接字符串