Især når det kommer til kryptering, bør du have en generel idé om de involverede principper og koncepter. Saltet adgangskodehashing
forklarer almindelige faldgruber og giver en række anbefalinger (en er BCrypt
, så du kan være på rette vej).
Det ser ud til, at du ikke læser den gemte hash fra DB'en, før du bekræfter. Du viser ikke, hvordan det er gemt, men det er vigtigt, for at det kan verificeres.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Opret nyt 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
Bekræft et forsøg
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
Noter
DbConnection
,DbCommand
ogDbDataReader
alle implementererDispose
hvilket betyder, at de meget vel kan allokere ressourcer, som skal frigives. Koden bruger hver af dem i enUsing
blok. Dette opretter dem i starten og kasserer dem i slutningen af blokken.- Dette bruger en e-mail til den unikke identifikator, fordi der er mange Steves derude. Det betyder, at SQL'en maksimalt vil returnere én post.
- Når du har indlæst den hasherede pw fra databasen, skal du bruge det for at bekræfte det indtastede adgangskodeforsøg. Din kode ser ud til at skabe en ny hash (og indlæser faktisk ikke noget fra DB).
Det tilfældige salt, der oprindeligt blev genereret, da kontoen blev oprettet, bliver en del af hashen (såvel som den arbejdsfaktor, du brugte), som vist her:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Output:
12
efter "$2a$"
er arbejdsfaktoren.