如何在C#中保存密码
本文关键字:保存 密码 | 更新日期: 2023-09-27 18:00:54
我正在制作一个C#.NET应用程序,其中我设计了一个管理员帐户。现在要登录该帐户,管理员必须输入密码。
我的问题是:如何保存密码?
可能的选项:
-
全局变量(显然不正确,因为每次我运行应用程序时它都会重置为默认值(
-
数据库关系(可行,但它只是一个标量关系……(
我不想把它存储在标量关系中,因为我认为只对一个条目和一列使用关系是愚蠢的!
是否有其他最佳方式来存储密码?
您可以将其存储在用户设置文件中。
您可以使用以下内容访问默认设置文件:
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对象包含敏感信息,如密码、信用卡号或个人数据,则该信息在使用后可能会被泄露,因为您的应用程序无法从计算机内存中删除数据。