mysql db的winforms/c应用程序

wfsdck30  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(374)

我目前正在制作一个密码管理器,因此我制作了一个带有用户名和密码字段的登录表单。我想 bcrypt 输入密码。我将salt和哈希密码存储在数据库中(屏幕截图1)。当用户输入用户名和密码时,我要做的是:
1.从db中取出盐并使用 BCrypt.Net.BCrypt.HashPassword(password.Text, sal) 方法将提交的密码与数据库中的salt进行哈希运算
2.从db表中检索原始哈希密码,然后使用 BCrypt.Net.BCrypt.Verify(submhash, passdb) 检查两个密码哈希是否匹配。
如果它们匹配,我打开程序的主窗体。
但是vs studio抛出了一个异常:无效的salt版本(截图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++;

            }

        }
zkure5ic

zkure5ic1#

首先,应该将mysqlcommand Package 在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
t1rydlwq

t1rydlwq2#

当bcrypt应该散列/验证的加密字符串的“前缀”中存在无效字符时,我遇到了这个错误。确保bcrypt函数输入字符串以正确的bcrypt版本和salt长度(例如:$2b$10)开头,如本文所示。
我会检查代码中的'sal'字符串,以确保它包含正确的哈希修订(从$2b$xyz序列开始)

c9qzyr3d

c9qzyr3d3#

我也碰到过这个问题。一般来说,对于bcrypt,您不必自己处理盐,库建议您让他们为您生成盐:
注意:尽管此库允许您自己提供盐,但您最好允许库为您生成盐。提供这些方法是为了保持兼容性,并满足可能需要使用它们的更高级的跨平台需求。
经过一番推敲,我发现我在做一件非常简单、非常愚蠢的事情——我把论点的顺序传错了。我在网上看到了一些关于这个主题的其他问题,对我来说,挖掘库代码本身就是一个兔子洞——问题要简单得多。因此,我建议,如果您正在考虑显式生成/处理bcrypt salt来解决这样的问题,请首先仔细检查实现中的bug。
另一个需要注意的关键问题是,如果你这样做了: dotnet add package BCrypt.Net 在撰写本文时,我得到了bcrypt.net 0.1.0,我期望的版本是4.0.0。正确的包被调用 BCrypt.Net-Next : dotnet add package BCrypt.Net-Next --version 4.0.0 似乎找到了正确的图书馆。
op应该考虑处理idisposables,并在单个查询中选择salt和密码,因为它们都在同一个表中,以防止对数据库的额外往返。

2w2cym1i

2w2cym1i4#

int salt = 12;
string passwordHash = BCrypt.Net.BCrypt.HashPassword(enteredpassword, salt);
bool correctPassword = BCrypt.Net.BCrypt.Verify(storedPassword, passwordHash);

我交换了passwordhash和storedpassword,correctpassword是真的,程序运行正常。

相关问题