如何在C#中保存密码

本文关键字:保存 密码 | 更新日期: 2023-09-27 18:00:54

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

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

可能的选项:

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

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

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

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

如何在C#中保存密码

您可以将其存储在用户设置文件中。

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

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对象包含敏感信息,如密码、信用卡号或个人数据,则该信息在使用后可能会被泄露,因为您的应用程序无法从计算机内存中删除数据。