Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用vb.net验证mysql中的bcrypt哈希密码_Mysql_Vb.net_Authentication_Bcrypt.net - Fatal编程技术网

无法使用vb.net验证mysql中的bcrypt哈希密码

无法使用vb.net验证mysql中的bcrypt哈希密码,mysql,vb.net,authentication,bcrypt.net,Mysql,Vb.net,Authentication,Bcrypt.net,我在vb.net中有一个应用程序,使用mysql作为数据库。应用程序有一个登录表单。还有一个注册表,可以使用bcrypt.net在存档中输入新密码,如本网站所示: 这是我注册新用户的代码公共程序Clean用于Clean表单: Private Sub btSignUp_Click(sender As Object, e As EventArgs) Handles btSignUp.Click dim hash as string hash = HashPassword(txCon

我在vb.net中有一个应用程序,使用mysql作为数据库。应用程序有一个登录表单。还有一个注册表,可以使用bcrypt.net在存档中输入新密码,如本网站所示:

这是我注册新用户的代码公共程序Clean用于Clean表单:

 Private Sub btSignUp_Click(sender As Object, e As EventArgs) Handles btSignUp.Click
dim hash as string
        hash = HashPassword(txConfirmPass.Text)
        If (txPass.Text <> txConfirmPass.Text) Then
            MessageBox.Show("Passwords don't matches")
        Else
            Dim sql As String = "INSERT INTO fusion_login(name,user,password) VALUES (@name,@user,@pass)"
            Using myconnection As MySqlConnection = Connection.getInstance.getConnection()
                Using mycommand As New MySqlCommand()
                    With mycommand
                        .CommandText = sql
                        .CommandType = CommandType.Text
                        .Connection = myconnection
                        .Parameters.Add("@name", MySqlDbType.VarChar).Value = txName.Text
                        .Parameters.Add("@user", MySqlDbType.VarChar).Value = txUser.Text
                        .Parameters.Add("@pass", MySqlDbType.VarChar).Value = hash
                    End With
                    Try
                        myconnection.Open()
                        mycommand.ExecuteNonQuery()
                        If (MessageBox.Show("Do you insert a new user again?", "Register", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes) Then 
                            Clean(Me)
                        Else
                            Me.Hide()
                            Login.Show()
                        End If
                    Catch ex As MySqlException
                        MessageBox.Show("Error: " + ex.ToString)
                    Finally
                        myconnection.Close()
                    End Try
                End Using
            End Using
        End If
    End Sub

我不确定我是否插入了错误的密码,或者在登录时比较了错误的用户名/密码。这里可能有什么问题?

问题是这行:

If myreader.HasRows = 0 Then
在这段代码中,myreader.HasRows是布尔值,但0是整数。要进行此比较,必须首先将0值隐式转换为布尔值。将0强制转换为布尔值将导致False。这意味着,如果数据读取器未返回任何结果,则代码将只输入If块。我相信这与你想发生的恰恰相反。相反,只需这样做:

If myreader.HasRows = True Then
或者,更好的是:

If myreader.HasRows Then
当我在这里时,仅仅散列密码是不够的。您还需要为每个用户设置一个salt值,并在创建散列之前将其与密码相结合。当您对用户进行身份验证时,您将检索该用户名的salt,将其与提供的密码组合,然后将其与结果进行比较。密码比较代码应该更像这样:

公共函数authenticateUserVal作为字符串,ByVal密码作为字符串作为布尔值 Dim sql As String=从fusion_登录选择用户、密码、盐,其中用户=@user 将myconnection用作MySqlConnection=Connection.getInstance.getConnection_ mycommand作为新的MySqlCommandsql、myconnection 尝试 mycommand.Parameters。Add@user,MySqlDbType.VarChar.Value=Username 我的连接,打开 将rdr用作MySqlDataReader=mycommand.ExecuteReader 如果不是rdr.Read,则返回False 返回HashPasswordPassword,rdrsalt.equalsrpassword 终端使用 Catch'您可能想在这里做更多的工作,但是对于这个快速示例来说,返回False就足够了 返回错误 结束尝试 终端使用 端函数 当然,您还需要更新HashPassword函数,以允许附加参数、您的插入代码首先生成salt,以及您的数据库表具有存储该值的空间


还有一件事。。。即使这样也不完全正确。如果您真的想正确执行此操作,则需要确保明文密码仅与对象一起保存在内存中。

已找到解决此问题的方法:

If mydatareader.Hasrows Then
   While mydatareader.Read
       If (Bcrypt.Net.Bcrypt.Verify(txtPassword.text, mydatareader.Item("password"))) then
           MsgBox("Valid Credentials")
       else
           MsgBox("Invalid Credentials")
       End if
   End While
  mydatareader.Close()
End If

这是一个很好的开始——至少通过选择散列并使用bcrypt而不是不太安全的东西,您比大多数人走得更远。不幸的是,您仍然无法为每个用户选择和存储salt值。我已经下载了上面站点的dll,并在项目中引用。在项目标题中:Imports BCrypt.Net.BCrypt。HashPassword由此引用提供!!!Bcrypt.HashPassword自动生成salt或由用户根据站点中的示例提供!!!!!!通过实例访问共享成员、常量成员、枚举成员或嵌套类型;将不计算限定表达式。此行中的警告返回密码。Equals我需要使用来自bcrypt的函数verify。如何检索存储的哈希密码???这取决于。你把它放在哪里了?我用火鸟!类bcrypt有一个布尔函数verify。sintax是验证普通密码、存储密码。我想在我的登录表中检索存储的密码!
If mydatareader.Hasrows Then
   While mydatareader.Read
       If (Bcrypt.Net.Bcrypt.Verify(txtPassword.text, mydatareader.Item("password"))) then
           MsgBox("Valid Credentials")
       else
           MsgBox("Invalid Credentials")
       End if
   End While
  mydatareader.Close()
End If