Zwłaszcza jeśli chodzi o szyfrowanie, powinieneś mieć ogólne pojęcie o związanych z nim zasadach i koncepcjach. Hashing solonego hasła
wyjaśnia typowe pułapki i przedstawia szereg zaleceń (jedną z nich jest BCrypt
, więc możesz być na dobrej drodze).
Wygląda na to, że nie odczytujesz zapisanego skrótu z bazy danych przed weryfikacją. Nie pokazujesz, jak jest zapisany, ale jest to ważne, aby można go było zweryfikować.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Utwórz nowe logowanie
' 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
Zweryfikuj próbę
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
Notatki
DbConnection
,DbCommand
iDbDataReader
wszystkie implementująDispose
co oznacza, że mogą bardzo dobrze alokować zasoby, które muszą zostać uwolnione. Kod używa każdego z nich wUsing
blok. To tworzy je na początku i usuwa na końcu Bloku.- Unikatowy identyfikator jest używany w adresie e-mail, ponieważ Steve'ów jest wielu. Oznacza to, że SQL zwróci najwyżej jeden rekord.
- Po wczytaniu zahaszowanego pw z bazy danych użyj go aby zweryfikować wprowadzoną próbę hasła. Twój kod wydaje się tworzyć nowy skrót (i faktycznie nie ładuje niczego z bazy danych).
Losowa sól generowana pierwotnie podczas tworzenia konta staje się częścią skrótu (jak również użytym czynnikiem pracy), jak pokazano tutaj:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Wyjście:
12
po "$2a$"
to czynnik pracy.