2010-02-04 65 views
8

我正在创建一个定期的Windows应用程序,该应用程序将分配给我的部门中的多个用户。我需要在App.config文件中包含一些连接密码,而且我显然不希望最终用户只是启动记事本并查看密码。加密将要重新分配的App.config文件中的部分和/或设置

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

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

任何答案或链接到文章如何做到这一点非常感谢。谢谢

回答

8

如果您试图加密您的App.Config/Web中的连接字符串。配置,你可以这样做使用配置类:

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.aspxhttp://msdn.microsoft.com/en-us/library/89211k9b(VS.80).aspx

+0

Bhaskar,你试过这个吗?实际上加密该部分,将受保护的app.config文件重新分发给其他开发人员或最终用户机器,并查看透明解密是否自动工作? – GR7 2010-02-05 23:41:29

+0

是的,我已经加密了配置文件并在我的prod环境中重新分配了它。 – Bhaskar 2010-02-06 07:54:00

+1

像这样的解决方案(默默无闻的“安全性”)会让你在一家有实力的科技公司中被解雇。如果你的代码能够检索明文,是什么让你认为攻击者不能使用相同的代码来检索明文?唯一真正的解决方案是在服务器端强加安全约束。 – MickLH 2013-11-26 14:36:09

0

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

当然,你可以混淆代码,但是,这将使调试在生产环境中,一个陌生的未知/未被发现的错误蹑手蹑脚,你就不能告诉什么/在哪里/为什么/如何监视一个陌生的噩梦只会在发布中显示的错误,因为堆栈跟踪和错误消息也会被混淆...

这是需要记住的事情和潜在的缺陷......用户可能不是技术高明,但肯定他们在理论上可以,问朋友/亲戚/合作伙伴破解/打破它没有你knowledge..This的答案是不是为了把你赶走,希望你不觉得我的回答冒犯......

希望这个帮助ps, 此致, 汤姆。

+0

谢谢汤姆,但我真的不在乎它是真正加密的,加密就没问题。只要用文本编辑器打开app.config就无法看到密码,我很好。 – GR7 2010-02-04 22:35:48

+0

@silverCORE:好的...将密码硬编码到代码本身是一个不可能的... – t0mm13b 2010-02-05 00:14:06

1

简而言之,密码术不是一个魔法棒,可以奇迹般地修复一个不安全的程序。

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

答案就在反调试: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/

+2

您也可以使用SecureString来确保密码在任何时候都不会以纯文本形式出现在内存中。 – 2012-09-17 16:20:25

+2

@Ryan理论上很好,但实际上没有SqlConnection接受SecureString,并且在从配置中读取字符串并将其传递到SecureString之间的某个时间点,字符串也必须是未加密的。 – CodeCaster 2016-05-12 09:40:50

相关问题