如何正确保存密码
本文关键字:密码 保存 何正确 | 更新日期: 2023-09-27 18:01:51
我试着写一个程序,用它你可以登录到一个远程网站。对于一些拥有多个帐户的人,我试图使他们更容易并将帐户数据存储在IsolatedStorage
中。在我的代码的当前状态下,密码只是在TextBox
中输入,并在存储后立即转换为MD5哈希。
现在我想把它重构成合适的代码,但是我卡住了。
A 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
,有一些可见的内存?一些黑客能够通过反射/调试使这个简单的值可见吗?哪些代码使这些字符串实际可见?我需要注意什么? - 如何处理
PasswordBox
中的SecureString
?
我对这些东西有点不知所措,我还不能弄清楚如何正确处理应用程序中的密码的本质。
我不是在恳求一个完整的解决方案和运行代码。如果有人能帮我开始,我会很高兴的。而且,我也不想要企业解决方案。我只是在寻找一个,这是容易实现的,并尽可能节省我投入的努力。
你真的需要密码是可逆的吗?
更安全的存储方法是对其进行盐化和散列。
User: JOHN
密码:(开头为)myUserPassword667!
然后在数据库中对用户使用某种数据库唯一代码。比如GUID
现在您有abcd-1234-12-1212121ab
作为JOHN
所以你现在有一个基本密码(在哈希之前)
myUserPassword667!abcd-1234-12-1212121ab
您现在可以在System.Security
命名空间中使用SHA或其他散列算法之一对其进行散列。
现在你内部有一些盐,你应用到你的哈希算法…(仅是代码的一部分)
MySecretSaltWords559BC
然后将结果存储为Base64或二进制。
Ab09l'311sas==
(简体)
下次用户登录时,您在DB中找到他们的记录,您将获得生成帐户时使用的唯一代码,并附加到他们输入的密码。
用相同的技术对输入的密码进行散列并对结果进行二进制比较,然后您不需要存储他们的密码。如果哈希值不匹配,就说明密码不相同。