Especialmente quando se trata de criptografia, você deve ter uma ideia geral dos princípios e conceitos envolvidos. Hashing de senha salgada explica armadilhas comuns e faz várias recomendações (uma é
BCrypt
, então você pode estar no caminho certo). Parece que você não está lendo o hash armazenado do banco de dados antes de verificar. Você não mostra como ele é salvo, mas isso é importante para que ele seja verificado.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Criar novo logon
' new user save
Dim sql = "INSERT INTO userlogin (email, username, pwhash) VALUES (@email, @n, @pw)"
' prep:
Dim salt = BCryptor.GenerateSalt(12) ' == 2^12
Dim hash = BCryptor.HashPassword(tbPass)
' to do: Try/Catch for an email that already exists
Using dbCon As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, dbCon)
cmd.Parameters.Add("@email", MySqlDbType.Text).Value = tbEmail
cmd.Parameters.Add("@n", MySqlDbType.Text).Value = tbUserName
cmd.Parameters.Add("@pw", MySqlDbType.Text).Value = hash
dbCon.Open()
cmd.ExecuteNonQuery()
End Using
Verificar uma tentativa
Dim bRet As Boolean = False
' login user
Dim sql = "SELECT pwhash FROM userlogin WHERE email = @email"
Using dbCon As New MySqlConnection(MySQLConnStr),
cmd As New MySqlCommand(sql, dbCon)
' data for the where clause
cmd.Parameters.Add("@email", MySqlDbType.Text).Value = tbEmail
dbCon.Open()
Using rdr = cmd.ExecuteReader()
' read from the reader to load data
If rdr.Read() Then
' get the saved hash
Dim savedHash = rdr.GetString(0)
bRet = BCryptor.Verify(tbPass, savedHash)
Else
bRet = False
End If
End Using
' return whether the hash verified
Return ret
End Using
Observações
DbConnection
,DbCommand
eDbDataReader
todos implementamDispose
o que significa que eles podem muito bem alocar recursos que precisam ser liberados. O código usa cada um deles em umUsing
quadra. Isso os cria no início e os descarta no final do Bloco.- Isso usa um e-mail para o identificador exclusivo porque há muitos Steves por aí. Isso significa que o SQL retornará no máximo um registro.
- Depois de carregar o pw com hash do banco de dados, use ele para verificar a tentativa de senha digitada. Seu código parece estar criando um novo hash (e na verdade não carrega nada do banco de dados).
O sal aleatório gerado originalmente quando a conta foi criada torna-se parte do hash (assim como o fator de trabalho que você usou), conforme mostrado aqui:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Resultado:
O
12
depois de "$2a$"
é o fator trabalho.