如何正确保存密码

本文关键字:密码 保存 何正确 | 更新日期: 2023-09-27 18:01:51

我试着写一个程序,用它你可以登录到一个远程网站。对于一些拥有多个帐户的人,我试图使他们更容易并将帐户数据存储在IsolatedStorage中。在我的代码的当前状态下,密码只是在TextBox中输入,并在存储后立即转换为MD5哈希。

现在我想把它重构成合适的代码,但是我卡住了。

A PasswordBox通过PasswordBox.SecureStringPasswordBox.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?
}

这是我的问题

  • 一旦我把普通密码从我的PasswordBoxvar 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中找到他们的记录,您将获得生成帐户时使用的唯一代码,并附加到他们输入的密码。

用相同的技术对输入的密码进行散列并对结果进行二进制比较,然后您不需要存储他们的密码。如果哈希值不匹配,就说明密码不相同。