无法使用vb.net验证mysql中的bcrypt哈希密码
我在vb.net中有一个应用程序,使用mysql作为数据库。应用程序有一个登录表单。还有一个注册表,可以使用bcrypt.net在存档中输入新密码,如本网站所示: 这是我注册新用户的代码公共程序Clean用于Clean表单:无法使用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
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