无法获取存储的密码(Bcrypt)以匹配用户输入的内容

时间:2016-12-16 07:28:36

标签: c# sql-server bcrypt

有人会善待这个“绿角”吗?目前正致力于这个项目。现在的想法是从数据库中检索密码,并将其与用户键入的内容进行匹配。存储的密码使用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部分是否已损坏。

提前感谢您的援助。

2 个答案:

答案 0 :(得分:1)

如果你使用bcrypt,那不是你如何匹配数据库中的密码,例如,如果我使用相同的字符串来获取hash,即使hashstring,它也将返回不同的 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}' 条件也检查用户帐户记录后检查密码。