如何正确保存密码

时间:2013-03-03 14:15:23

标签: c# passwords password-protection password-encryption securestring

我会编写一个程序,您可以使用该程序登录远程网站。对于拥有多个帐户的某些人,我会尝试为他们提供便利,并将帐户数据存储在IsolatedStorage中。在我的代码的当前状态下,密码只是在TextBox中输入,并且一旦存储就转换为MD5哈希。

现在我想将其重构为正确的代码,但我陷入困境。

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?
}

这是我的问题

  • 只要我将PasswordBox的普通密码输入var password,内存中是否有可见的内容?某些 hacker 是否能够通过反射/调试使这个普通值可见?哪些代码使这些字符串实际可见?我需要注意什么?
  • 如何处理SecureString的<{1}}?

我对这些东西有点不知所措,我无法弄清楚如何正确处理应用程序中密码的本质。

我不是在恳求整个解决方案并运行代码。如果有人能让我开始,我会很高兴。而且,我不想要企业解决方案。我只是在搜索一个,它很容易实现,并尽可能地节省我的努力。

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==(简化)

下次用户登录时,您会在数据库中找到他们的记录,您将获得在生成帐户时使用的唯一代码并附加到他们输入的密码。

使用相同的技术散列输入的密码,二进制文件比较结果,然后您不需要存储密码。如果哈希值不匹配,则您没有相同的密码。