【问题标题】:BCrypt Verifying password against password in databaseBCrypt根据数据库中的密码验证密码
【发布时间】:2017-03-09 11:37:08
【问题描述】:

我正在尝试验证我的数据库中已使用 BCrypt 散列的散列密码。

我有两个网络表单,一个登录页面和一个注册页面。

在注册页面中,我创建哈希,验证哈希并将其插入数据库。工作正常。

在登录页面中,我从数据库中选择哈希密码,并将其与文本框中提交的密码进行比较。

我在根据提交的密码验证数据库中的哈希时似乎遇到了问题,我不知道出了什么问题。

这是注册页面代码:

protected void registerbutton_Click(object sender, EventArgs e)
    {
        string myPassword = passwordtextbox.Text;
        string mySalt = BCryptHelper.GenerateSalt();     
        string myHash = BCryptHelper.HashPassword(myPassword, mySalt);
        bool doesPasswordMatch = BCryptHelper.CheckPassword(myPassword, myHash);


        if (doesPasswordMatch == true)
        {
                using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
                using (SqlCommand cmd = new SqlCommand("INSERT INTO dbo.Users (Username, Password, FirstName, LastName) VALUES (@username, @password, @firstname, @lastname)", conn))
                {
                    cmd.Parameters.Add("@username", SqlDbType.NVarChar).Value = usernametextbox.Text;
                    cmd.Parameters.Add("@password", SqlDbType.Char).Value = myHash;
                    cmd.Parameters.Add("@firstname", SqlDbType.NVarChar).Value = firstnametextbox.Text;
                    cmd.Parameters.Add("@lastname", SqlDbType.NVarChar).Value = lastnametextbox.Text;

                    conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();

                    registerlabel3.Text = myHash;


            }
        }
        else
        {
            registerlabel3.Text = "Error";
        }
    }

这是登录页面代码:

protected void loginbutton_Click(object sender, EventArgs e)
    {
        const string query = "SELECT Username, Password FROM dbo.Users WHERE Username = @username";

        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
        using (SqlCommand cmd = new SqlCommand(query, conn))
        {
            cmd.Parameters.Add("@username", SqlDbType.NVarChar).Value = usernametextbox.Text;
            conn.Open();

            //string hashedPassword = BCrypt.Net.BCrypt.HashPassword(passwordtextbox.Text);

            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    var passwordInDb = reader.GetString(1);

                    Label3.Text = "submitted = " + passwordtextbox.Text;
                    Label4.Text = "database hash = " + passwordInDb;

                    if(BCryptHelper.CheckPassword(passwordtextbox.Text, reader.GetString(1)))
                    {
                        //login
                        loginlabel.Text = "Success";
                    }
                    else
                    {
                        loginlabel.Text = "Error";
                    }




                }
            }
        }
    }

感谢您的帮助和反馈。

【问题讨论】:

标签: c# mysql bcrypt


【解决方案1】:

写入数据库时​​,尝试:

protected void registerbutton_Click(object sender, EventArgs e) { .... cmd.Parameters.Add("@password", SqlDbType.NVarChar).Value = myHash; .... }

【讨论】:

  • 将哈希放入数据库是没有问题的,NVarChar和Char都可以。
【解决方案2】:

将数据库字段设置为 CHAR(60)

我将存储散列密码的数据库字段设置为 CHAR(60),现在它可以工作了。

为什么它必须是 CHAR(60),我不知道,但它有效。

如果能解释一下就好了。

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 2023-03-22
    • 2012-07-03
    • 2021-10-22
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2016-02-27
    相关资源
    最近更新 更多