我已经在这里搁置了好几个小时了。我一直在尝试创建一个登录表单来开发一个简单的应用程序。c#验证存储在SQL数据库中的散列密码
我已经成功设法对salt/hash密码进行加密和创建用户帐户,登录,散列和salt都使用INSERT查询存储在SQL数据库表的不同列中。
我现在需要做的是在登录页面输入来自用户的密码,并将其与存储的盐值相结合,重组合并的pw + salt并将其与存储的哈希值进行比较以验证用户。我正在使用SELECT查询来尝试实现这一目标,但迄今为止都不成功。
这里是我的代码:
///Gather the data from the SQL db, find the username, hash and salt values
string ds = @"Data Source";
using (SqlConnection con = new SqlConnection(ds))
{
///define a set of strings for the query, the login textbox, password textbox and the Hash Gen Algorithm
string query = "SELECT Login, Hash, Salt FROM [Table] WHERE ([email protected], [email protected], [email protected])";
string uname = logTXT.Text;
string passw = pwTXT.Text;
string hash = GenHash(passw, "@salt");
using (SqlCommand cmd = new SqlCommand(query, con))
{
con.Open();
cmd.Parameters.AddWithValue("@Login", uname);
cmd.Parameters.AddWithValue("@Hash", hash);
cmd.Connection = con;
SqlDataReader dr = cmd.ExecuteReader();
if("@Hash" == hash)
{
MessageBox.Show("Login Successful");
}
else
{
MessageBox.Show("Login Failed");
}
}
}
我不知道如何使这个成功发生。我如何获取存储密码salt的SQL列的值,然后将其添加到来自文本框(pwTXT.Text +存储的pw盐)的用户密码输入中,以便我可以通过我的散列算法把结果,然后比较值来验证用户?
编辑:感谢弗拉德Stryapko的答案我能够得到它通过使用稍微修改后的版本工作,并已成功实施散列算法,一切工作,因为它应该。 所以正确/最有帮助的答案应该发给他。
string ds = @"Data Source";
using (SqlConnection con = new SqlConnection(ds))
{
string query = "SELECT Salt FROM [Table] WHERE ([email protected])";
string uname = logTXT.Text;
using (SqlCommand cmd = new SqlCommand(query, con))
{
con.Open();
cmd.Parameters.AddWithValue("@Login", uname);
SqlDataReader dr = cmd.ExecuteReader();
string salt = null;
if (dr.Read())
{
salt = dr.GetString(0);
}
}
究竟是什么不明显?你已经很准确地描述了算法。你有从数据库读取的问题?将阅读结果与文本框结合起来有问题吗? –
嘿谢谢你的回应,我的问题是,我无法弄清楚如何从数据库中获取盐的价值,并将它与文本框中的输入相结合,就像你提到的那样。我知道我需要用算法实现的过程,但实际上从数据库中提取数据对我来说很麻烦。关于我需要做什么来实现这一点的任何建议? – lostintranslation
请检查我的答案,看看它是否有帮助。 –