我目前正在制作密码管理器,因此我制作了一个带有用户名和密码字段的登录表单。我想对密码进行 bcrypt。我将盐和散列密码存储在数据库 ( screenshot 1 ) 中。当用户输入他们的用户名和密码时,我所做的是:

1.从数据库中检索salt,使用BCrypt.Net.BCrypt.HashPassword(password.Text, sal)方法将提交的密码与数据库中的salt进行hash

2.从db表中检索原始哈希密码,然后使用BCrypt.Net.BCrypt.Verify(submhash, passdb)方法检查2个密码哈希是否匹配。

3.如果它们匹配我打开程序的主窗体。

但是 VS Studio 抛出异常: 盐版本无效 (screenshot 2)

我想问一下问题出在哪里,我该如何解决?

            conn.Open();
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = conn;
            cmd.Parameters.AddWithValue("@usr", username.Text);
           // cmd.Parameters.AddWithValue("@pas", password.Text);
            cmd.CommandText = "select password from users where username = @usr";
            passdb = (string)cmd.ExecuteScalar();
            MySqlCommand ss = new MySqlCommand();
            ss.Connection = conn;
            ss.Parameters.AddWithValue("@uun", username.Text);
            ss.CommandText = "select salt from users where username  = @uun";
            sal= (string)ss.ExecuteScalar();
            submhash = BCrypt.Net.BCrypt.HashPassword(password.Text, sal);
            MySqlCommand com = new MySqlCommand();
            com.Connection = conn;
            com.Parameters.AddWithValue("@unm", username.Text);
            if (BCrypt.Net.BCrypt.Verify(submhash, passdb))
            {
                frmMain fm = new frmMain();
                SesUser.username = username.Text;
                SesUser.password = password.Text;
                this.Hide();
                fm.Show();


            }
            else
            {
                MessageBox.Show("Username or password is incorrect!","Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
                i++;

            }

        }

最佳答案

首先,您应该将 MySqlCommand 包装在 using 语句中,因为 DbCommand 实现了 IDisposable。

关于您的 BCrypt 问题。

您不必创建新的散列并将其与保存的散列值进行比较。因为每次执行此操作时,您都会得到不同的哈希值。
您只需要使用 BCrypt.Net 根据保存的哈希值验证密码。

所以以下应该工作

if (BCrypt.Net.BCrypt.Verify(password.Text, passdb))
{
  // logged in
}
// not logged in

我期待 passdb 拥有一个 bcrypt 哈希,如下所示:
$2a$12$VvDRKYKGt4Zd2Ux35LeG2OI.Vr5f.UuY2q7MrnHlJj4K5diifQV3e

关于c# - BCrypt.Net 库中的盐版本无效错误 - 带有 MySQL DB 的 WinForms/C# 应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52276841/

10-11 22:29
查看更多