首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BCrypt.Net库中无效的salt版本错误-使用MySQL DB的WinForms/C#应用程序

BCrypt.Net库中无效的salt版本错误-使用MySQL DB的WinForms/C#应用程序
EN

Stack Overflow用户
提问于 2018-09-11 13:16:02
回答 5查看 8.8K关注 0票数 4

我目前正在制作一个密码管理器,因此我用用户名和密码字段制作了一个登录表单。我想要bcrypt密码。我将salt和哈希密码存储在数据库(截图1)中。当用户输入他们的用户名和密码时,我所做的是:

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

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

3.如果它们匹配,我就打开程序的主要形式。

然而,version抛出一个异常:无效的salt版本( 截图2)

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

代码语言:javascript
复制
            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++;

            }

        }
EN

回答 5

Stack Overflow用户

发布于 2018-09-11 13:34:24

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

关于你的BCrypt问题。

您不必创建新哈希并将其与保存的哈希值进行比较。因为每次你这样做都会得到不同的哈希。您只需使用BCrypt.Net对保存的哈希验证密码即可。

因此,以下内容应该有效

代码语言:javascript
复制
if (BCrypt.Net.BCrypt.Verify(password.Text, passdb))
{
  // logged in
}
// not logged in

我希望passdb保存一个bcrypt哈希,就像折叠一样:

代码语言:javascript
复制
$2a$12$VvDRKYKGt4Zd2Ux35LeG2OI.Vr5f.UuY2q7MrnHlJj4K5diifQV3e
票数 3
EN

Stack Overflow用户

发布于 2020-07-19 10:51:13

代码语言:javascript
复制
int salt = 12;
string passwordHash = BCrypt.Net.BCrypt.HashPassword(enteredpassword, salt);
bool correctPassword = BCrypt.Net.BCrypt.Verify(storedPassword, passwordHash);

我交换了storedPasswordcorrectPasswordpasswordHash,这是真的,而且程序工作正常。

票数 3
EN

Stack Overflow用户

发布于 2019-04-12 11:04:11

当加密字符串的“前缀”中有一个无效字符时,我遇到了这个错误,bcrypt应该对其进行散列/验证。确保您的bcrypt函数输入字符串以正确的bcrypt版本和盐分长度(例如:$20亿,$10)开头,如在这篇维基百科文章中所示。

我将检查代码中的“sal”字符串,以确保它包含正确的散列修订(从$2b$xyz序列开始)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52276841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档