我正在制作一个C#.NET应用程序,其中我设计了一个管理员帐户。现在要登录该帐户,管理员必须输入密码。
我的问题是:如何保存该密码?
可能的选择:
全局变量(显然不正确,因为每次运行应用程序时它都会重置为默认值)
数据库关系(可行,但只能作为标量关系......)
我不想将它存储在标量关系中,因为我认为仅使用一个条目和一列的关系是愚蠢的!
有没有其他最佳方式来存储密码?
答案 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对象包含敏感信息(如密码,信用卡号或个人数据),则使用该信息后可能会显示该信息,因为您的应用程序无法从计算机内存中删除该数据。