在源代码中保护密码?

时间:2010-11-11 14:07:47

标签: c# security password-protection

我的代码中有一个密码,需要连接到sftp服务器。什么是在代码中“混淆”或隐藏它的最佳方法?

由于

10 个答案:

答案 0 :(得分:27)

请勿在您的源代码中存储密码,将其存储在App.Config(或Web.Config)中的受保护部分。

请参阅此Microsoft Doc

中的使用受保护配置加密配置文件部分部分

这可以通过使用内置Windows资料加密加密密钥,锁定到Mac地址和其他各种未记录的内容来实现。

如果您使用多台服务器,这甚至可以使用:

  

...如果您计划在多个服务器(例如Web场)上使用相同的加密配置文件,则只有RsaProtectedConfigurationProvider允许您导出用于加密数据的加密密钥并将其导入另一台服务器。 / p>

使用此功能,如果有人想获取您的密码,他们必须首先破解您服务器上的Windows安全性(这不是不可能的,但比到目前为止查看您的IL密码更难)。

答案 1 :(得分:13)

不要打扰。
你能做的任何事情,你的攻击者都可以轻易撤消。

但是,如果它只需要在一台计算机上运行,​​则可以使用ProtectedData class,这样可以安全地保护它免受那台机器和/或用户以外的人的攻击。<​​/ p>

通常,唯一可以远程安全的方法是将密钥存储在一个单独的安全位置 例如,您可以使用密码的(非MD5)哈希对其进行加密,然后要求用户输入密码以便您可以获取哈希值。 (哈希和密码本身不会存储在任何地方;您应该使用单独的哈希来验证密码)

答案 2 :(得分:12)

我实际上考虑使用&#34;受保护的部分&#34; App.Config或Web.Config中的功能比在代码中存储密码更安全。

任何有服务器访问权限的人都可以通过运行每个人都引用的文章中描述的解密命令来加密配置的该部分,就像加密它一样快:

aspnet_regiis -pd "connectionStrings" -app "/SampleApplication"

https://msdn.microsoft.com/en-us/library/zhhddkxy.aspx#Anchor_1

因此,ASP.Net的这个功能只会增加安全性,以防黑客以某种方式访问​​您的web.config但不能访问整个服务器(发生在2010中,如{oracle}中提到的@djteller填充攻击评论)。但如果他们确实拥有服务器访问权限,则会在一次 cmd 调用中公开。他们甚至不必安装ildasm.exe。

但是,在代码中存储实际密码是一项维护噩梦。因此,我所看到的一件事就是在您的web.config中存储加密密码并将加密密钥存储在您的代码中。这实现了在可维护的同时将密码隐藏在随意浏览中的目标。

在这种情况下,黑客必须至少反编译您的代码,找到您的密钥,然后找出您正在使用的加密算法。并非不可能,但肯定比运行更加困难&#34; aspnet_regiis -pd ...&#34;。

与此同时,我也在寻找这个六年之久问题的更好答案......

答案 3 :(得分:3)

答案 4 :(得分:2)

在源代码中存储密码没有“最好的方法”,因为它可以通过多种方式恢复。

您可以对密码字符串进行模糊处理,甚至对其进行加密,以防止通过简单的查看显示,但不能将其视为严重保护。

答案 5 :(得分:2)

您可以将其作为加密值放在web.config文件中。它看起来不太难: K scott Allen教程http://odetocode.com/blogs/scott/archive/2006/01/08/encrypting-custom-configuration-sections.aspx

我认为这是一篇Scott gu博文,其中包含其他信息的链接。 http://weblogs.asp.net/scottgu/archive/2006/01/09/434893.aspx

答案 6 :(得分:2)

使用类似AES的强大功能对其进行加密,但正如SLaks所暗示的那样,攻击者可以对代码进行反向工程并制定加密方法和密钥。你所要做的就是添加一个层来保持脚本小子和一定程度的攻击者。真正想要解决问题的人可以做到。他们还可以运行您的程序并查看发送的密码。

答案 7 :(得分:1)

请勿将密码保存在源代码中。

阅读本文: http://en.wikipedia.org/wiki/Security_through_obscurity

没有好办法。

您所能做的就是使用智能算法来加密密码。

经验丰富的逆向工程师会设法破解它。

答案 8 :(得分:1)

对于真正想要密码的人,你所做的事情并不多。但是,如果这不是公共应用程序(Intranet?内部应用程序或其他东西),您可以使用对称加密算法对其进行加密,或者执行类似base 64编码的操作。 你也可以在你的代码上运行一个混淆器,以使某些地方的密码不那么明显。

你还有其他选择吗?原始SFTP访问有点危险,也许您可​​以在其间创建某种代理服务,这只允许您的应用程序所需的特定操作。在代码中存储该服务的密码并不像在代码中存储SFTP密码那样危险。

答案 9 :(得分:1)

您可以使用类似SLP Code Protector的内容来阻止程序集的逆向工程。不过,我同意其他人的意见,这不是最好的主意。