2

我尝试编写一个程序,您可以使用它登录到远程网站。对于一些拥有多个帐户的人,我尽量让他们更容易,并将帐户数据存储在IsolatedStorage. 在我的代码的当前状态下,密码只是在 a 中输入,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?
}

这是我的问题

  • 一旦我将普通密码从我的PasswordBox输入var password中,内存中是否有可见的东西?一些黑客是否能够通过反射/调试使这个简单的值可见?哪个代码使这些字符串真正可见?我需要注意什么?
  • 怎么处理SecureStringPasswordBox

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

我不是恳求一个完整的解决方案和运行代码。如果有人可以让我开始,我会很高兴。而且,我不想要企业解决方案。我只是在寻找一个,它易于实现并且尽可能节省我投入的精力。

4

1 回答 1

1

你真的需要密码是可逆的吗?

一种更安全的存储方法是对其进行加盐和哈希处理。

用户:JOHN

密码:(开头为)myUserPassword667!

然后对数据库中的用户使用某种数据库唯一代码。让我们说一个 GUID。

现在你有了abcd-1234-12-1212121abJOHN 的唯一性

所以你现在有一个基本密码(在散列之前)

myUserPassword667!abcd-1234-12-1212121ab

您现在可以使用命名空间中的一种 SHA 或其他散列算法对此进行散列System.Security

现在你在内部有一些盐,你可以应用到你的散列算法......(仅限你的部分代码)

MySecretSaltWords559BC

然后将结果作为 Base64 或二进制存储在您的数据库中。

Ab09l\311sas==(简化)

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

Hash the entered password with the same technique and binary compare the result, then you don't need to ever store their password. If the hashes don't match you don't have the same password.

于 2013-03-03T14:35:24.313 回答