如何在C#.NET中保存密码?

时间:2011-07-03 13:52:26

标签: c# database

我正在制作一个C#.NET应用程序,其中我设计了一个管理员帐户。现在要登录该帐户,管理员必须输入密码。

我的问题是:如何保存该密码?

可能的选择:

  1. 全局变量(显然不正确,因为每次运行应用程序时它都会重置为默认值)

  2. 数据库关系(可行,但只能作为标量关系......)

  3. 我不想将它存储在标量关系中,因为我认为仅使用一个条目和一列的关系是愚蠢的!

    有没有其他最佳方式来存储密码?

5 个答案:

答案 0 :(得分:8)

您可以将其保存在用户设置文件中并进行哈希处理。

您可以使用以下内容访问默认设置文件:

private bool CheckPassword(string salt, string password) 
{
   var hash = Encoding.ASCII.GetBytes(salt + password);
   var sha1 = new SHA1CryptoServiceProvider();
   var sha1hash = sha1.ComputeHash(hash);
   var hashedPassword = ASCIIEncoding.GetString(sha1hash);

   return (Properties.Settings.Default.adminPass == hashedPassword);
}

答案 1 :(得分:5)

出于安全考虑,我建议您只存储密码的hash,而不是明文密码。您可以将它存储在您认为方便的任何持久性媒体中:文件注册表,数据库,......

答案 2 :(得分:3)

您的系统中是否已有数据库?然后把它放在那里。你可能会有一个用户表,可以扩展以容纳密码(?)如果没有,你可以将它存储在一个文件中。

真正重要的是,您不应该以纯文本格式存储密码。这是不好的安全措施。您应该使用良好的散列算法(例如SHA512)单向散列它,最好使用盐。

答案 3 :(得分:3)

假设这是在服务器上保留用户的凭据:在数据库中存储密码的哈希值。理想情况下,您应该计算和存储类似SALT + sha1(SALT + password)的内容,其中SALT是为存储的每个密码计算的随机字符串。

答案 4 :(得分:1)

除了每个人都在说存储明文密码的内容之外,你不应该用字符串中的明文密码工作(例如,获取时)文本框中的值。)

这是因为字符串可以在未知的,不受控制的时间内保留在内存中。

应使用SecureString存储它们。

以解释的方式:

  

System.String类的实例都是不可变的,当不再需要时,无法以编程方式安排进行垃圾回收;也就是说,实例在创建后是只读的,并且无法预测实例何时从计算机内存中删除。因此,如果String对象包含敏感信息(如密码,信用卡号或个人数据),则使用该信息后可能会显示该信息,因为您的应用程序无法从计算机内存中删除该数据。