【发布时间】:2021-12-06 08:18:08
【问题描述】:
我正在为一家拥有酒店、餐厅和游泳池的大公司开发登录系统。 该公司内的每个员工都将有权访问/+监控系统数据库的凭据。
我了解以纯文本形式保存密码是一种BAD BAD 方法,因此我管理密码散列部分使用文本框和消息框(我稍后将其删除)对其进行了测试。并且由于几乎每个人(或我读过的帖子、视频和线程/表格)都说必须在HashedPassword 列旁边的数据库中拥有一个HashFunction 和一个Salt 列;我在将哈希函数值插入HashFunction 列时遇到了一些困难,因为我不知道保存它的值是什么!
这是我的代码
private MySqlConnection Connect()
{
string con = "Server = servername; DataBase=DBName; username= usr; password=pwd ; Persist Security Info = False; Charset =utf8";
MySqlConnection connection = new MySqlConnection(con);
connection.Open();
return connection;
}
private String Salt(int size)
{
var rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
var buffsize = new byte[size];
rng.GetBytes(buffsize);
return Convert.ToBase64String(buffsize);
}
private String GenerateSHA256Hash(string In, string salt)
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(In + salt);
SHA256Managed sha256hashstring = new SHA256Managed();
byte[] hash = sha256hashstring.ComputeHash(bytes);
return Convert.ToBase64String(hash);
}
private void BtnAddUsr_Click(object sender, EventArgs e)
{
string salt = Salt(10);
string hashedpswd = GenerateSHA256Hash(text.Text, salt);
string AddUser = "Insert into users(name,password,hashedpass,salt,position) VALUES ('" + txtu.Text + "','" + txtp.Text + "','" + hashedpswd.ToString() + "',";
}
我该如何处理这个问题,如果有人可以帮助我验证用户是否输入了正确的密码,那就太好了? 非常感谢。
【问题讨论】:
-
HashFunc 应该存储可以指示您对特定密码使用的散列算法的值。比如SHA-256、SHA-512等……你用这个值来决定用户登录时的哈希算法。
-
表中不需要密码列,因为您不会在其中存储纯文本密码
-
@Chetan 我的意思是密码列是散列的,这就是你看到散列函数的原因......现在你 你不需要表中的密码列,因为你不去要将纯文本密码存储在其中我想到了我需要删除 hashfunc 或密码列,尽管我仍然对验证密码感到困惑,我应该将
GenerateSHA256Hash方法的输出与存储的方法进行比较在数据库中? -
是的,您需要根据用户名检查用户是否存在。如果是,则获取用户的盐并生成用户输入的密码的哈希值并将其与为用户存储在数据库中的散列密码。如果哈希匹配密码正确。
-
不要推出自己的身份验证系统。
标签: c# mysql .net database hash