我会编写一个程序,您可以使用该程序登录远程网站。对于拥有多个帐户的某些人,我会尝试为他们提供便利,并将帐户数据存储在IsolatedStorage
中。在我的代码的当前状态下,密码只是在TextBox
中输入,并且一旦存储就转换为MD5哈希。
现在我想将其重构为正确的代码,但我陷入困境。
PasswordBox
通过PasswordBox.SecureString
和PasswordBox.Password
公开其数据。
因此,当点击我的保存按钮时,我会执行类似
的操作public void OnClick(...)
{
var password = passwordBox.Password;
// store it somehow (e.g. custom MD5 encryption)
var savePassword = passwordBox.SecureString;
// store this string somehow, but how?
}
这是我的问题
PasswordBox
的普通密码输入var password
,内存中是否有可见的内容?某些 hacker 是否能够通过反射/调试使这个普通值可见?哪些代码使这些字符串实际可见?我需要注意什么?SecureString
的<{1}}?我对这些东西有点不知所措,我无法弄清楚如何正确处理应用程序中密码的本质。
我不是在恳求整个解决方案并运行代码。如果有人能让我开始,我会很高兴。而且,我不想要企业解决方案。我只是在搜索一个,它很容易实现,并尽可能地节省我的努力。
答案 0 :(得分:1)
你真的需要密码是可逆的吗?
更安全的存储方式是对其进行加盐和散列。
用户:JOHN
密码:(开头为)myUserPassword667!
然后对DB中的用户使用某种数据库唯一代码。让我们说一个GUID。
现在你有abcd-1234-12-1212121ab
作为JOHN
所以你现在有一个基本密码(在散列之前)
myUserPassword667!abcd-1234-12-1212121ab
您现在可以使用System.Security
命名空间中的SHA或其他哈希算法之一来对其进行哈希处理。
现在你内部有一些你应用于哈希算法的Salt ...(仅部分代码)
MySecretSaltWords559BC
然后将结果存储为数据库中的Base64或Binary。
Ab09l\311sas==
(简化)
下次用户登录时,您会在数据库中找到他们的记录,您将获得在生成帐户时使用的唯一代码并附加到他们输入的密码。
使用相同的技术散列输入的密码,二进制文件比较结果,然后您不需要存储密码。如果哈希值不匹配,则您没有相同的密码。