我有smtp服务器的用户名和密码。目前,他们在我的代码中进行了硬编码:
string userName = "username";
string password = "password";
目前,任何反汇编我的dll的人都可以看到这些字符串,对吗?
我希望将这些安全地存储在注册表中,以防将来更改smtp服务器和/或凭据。我并不担心smtp服务器地址字符串的安全性。我只担心证书的安全性。
如果不在任何地方对凭证进行硬编码,我该怎么做?我希望在注册表中看到加密的字符串。
我可以加密密码,然后将加密存储在注册表中,从代码中删除密码,并使用解密的密码,假设它是正确的。但是,对我的代码进行反汇编的人是否仍然无法解密存储在注册表中的加密字符串?
最安全的方法是什么?
答案 0 :(得分:3)
在某些时候,无论您拥有多少层安全性,代码都必须使用未加密的密码。这意味着,无论您做什么,有权访问您的系统以查看和/或修改注册表的人都可以访问您的代码以获取您的密码。
我知道作为开发人员,我们倾向于与paranoia = Paranoia.Maximum;
合作很多,但有时候你必须支持一些。
那就是说,你可以做一些事情。如果凭证需要是安全的,请考虑将它们(如果可能)存储在远程数据库中。您可以将它们加密存储在远程服务器上,这样任何有权访问您机器的人都无需访问数据库服务器。
如果你真的想要解决偏执狂,同时让安全性成为用户的责任,请让他们为包含数据的文件提供“安全位置”。然后,您可以建议该位置类似于拇指驱动器,当您的程序不使用时,该驱动器将从计算机中物理移除。
无论如何,在安全性方面,您需要考虑层次。你做的任何事情都不足以实现真正良好的安全性,但通过分层几种措施,你可以提高安全性,使其足以满足你的需求。
答案 1 :(得分:0)
问题不是新问题。操作系统从Windows XP hat凭证API开始,可以在不同的场景中使用。例如,CredRead(另请参阅http://www.pinvoke.net/default.aspx/advapi32/CredRead.html)和CredWrite可用于以加密形式保存任何常规凭据信息。在CREDENTIAL结构的相应字段中,您可以定义以提取保存凭据的持久性级别(登录会话,同一台计算机上的所有后续登录会话或同一计算机上同一用户的其他登录会话)在其他计算机上为此用户登录会话。)
如果您希望应用程序仅读取凭据信息,您可以在管理员使用的单独配置实用程序中使用CredWrite,或者将API用作应用程序设置的一部分。