Vooral als het gaat om encryptie, zou je een algemeen idee moeten hebben van de principes en concepten die erbij betrokken zijn. Gezouten wachtwoordhashing
legt veelvoorkomende valkuilen uit en doet een aantal aanbevelingen (een daarvan is BCrypt
, dus je bent misschien op de goede weg).
Het lijkt erop dat u de opgeslagen hash niet uit de DB leest voordat u verifieert. Je laat niet zien hoe het is opgeslagen, maar dat is belangrijk om het te verifiëren.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Nieuwe aanmelding maken
' 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
Een poging verifiëren
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
Opmerkingen
DbConnection
,DbCommand
enDbDataReader
allemaal implementerenDispose
wat betekent dat ze heel goed middelen kunnen toewijzen die moeten worden vrijgegeven. De code gebruikt ze allemaal in eenUsing
blok. Dit creëert ze aan het begin en verwijdert ze aan het einde van het blok.- Dit gebruikt een e-mailadres voor de unieke identificatie omdat er veel Steve's zijn. Dit betekent dat de SQL maximaal één record zal retourneren.
- Na het laden van de gehashte pw uit de DB, gebruik it om de ingevoerde wachtwoordpoging te verifiëren. Je code lijkt een nieuwe hash aan te maken (en laadt eigenlijk niets uit de DB).
De willekeurige salt die oorspronkelijk werd gegenereerd toen het account werd gemaakt, wordt onderdeel van de hash (evenals de werkfactor die u hebt gebruikt), zoals hier wordt weergegeven:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Uitgang:
De 12
na "$2a$"
is de werkfactor.