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

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

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

可能的选择:

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

  2. 数据库关系(可行,但它只是一个标量关系….)

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

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

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

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

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); } 

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

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

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

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

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

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

它们应该使用SecureString存储。

在解释方式:

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