有人会善待这个“绿角”吗?目前正致力于这个项目。现在的想法是从数据库中检索密码,并将其与用户键入的内容进行匹配。存储的密码使用Bcrypt加密。我现在尝试了不同的方法,但我仍然无法获得匹配的密码。
这是代码的一部分。
// String command used from SQL, match AccountNo with Accountbox, Password with Passwordbox, from the Accounts dbo.
string a = string.Format("Select * from Accounts where AccountNo='{0}' and Password='{1}'", Accountbox ,Passwordbox);
SqlCommand ACCcheck = new SqlCommand(a, conn);
conn.Open();
SqlDataAdapter adapt1 = new SqlDataAdapter(ACCcheck);
DataSet data1 = new DataSet();
adapt1.Fill(data1);
SqlDataReader read = ACCcheck.ExecuteReader();
try
{
if (read.Read())
{
string salt = BCryptHelper.GenerateSalt(10);
string hash = BCryptHelper.HashPassword(Passwordbox, salt);
string OGpassword = read["Password"].ToString();
string givenPass = BCryptHelper.HashPassword(hash, Passwordbox);
if (givenPass.Equals(OGpassword))
{
//if (read.HasRows) // if input data valid, then proceed. if not then close conn and force retry.
//{
MessageBox.Show("WORDKING!");
conn.Close();
read.Close();
string q = string.Format("Select * from Transactions where AccountNo =" + Accountbox); // Fetch data from transaction table
SqlCommand cmd = new SqlCommand(q, conn); // SQL query, checks if what the user has written is a match with whats on the Db. Accountbox and Passwordbox are Inputbox I've used for this program.
我不知道我在这里是否有SQL错误,或者是Bcrypt部分是否已损坏。
提前感谢您的援助。
答案 0 :(得分:1)
如果你使用bcrypt
,那不是你如何匹配数据库中的密码,例如,如果我使用相同的字符串来获取hash
,即使hash
是string
,它也将返回不同的 string str = "asdf";
string pass = BCrypt.Net.BCrypt.HashPassword(str, 10);
string pass2 = BCrypt.Net.BCrypt.HashPassword(str, 10);
bool a = pass == pass2;
相同
bcrypt
a永远都是假的,因为Verify
并不像那样工作而是验证密码,你必须使用自己的方法BCrypt.Net.BCrypt.Verify(str, pass);
true
现在它将返回str
此处txtbox
是您将从pass
获得的密码字符串,而hashed password
是存储在数据库中的{"California":["NJ","Seattle","NY"],"NJ":["California","Seattle","NY"],"NY":["NJ","Seattle","California"],"Seattle":["NJ","California","NY"]}
。
答案 1 :(得分:0)
当您首次加密密码时,您需要在表格中存储 Salt 以及加密密码。 解密密码时,应使用与加密相同的盐。
如果您将盐保存在表格中,则应从select语句中删除 和密码=' {1}' 条件也检查用户帐户记录后检查密码。