Особено когато става въпрос за криптиране, трябва да имате някаква обща представа за включените принципи и концепции. Хеширане на солена парола
обяснява често срещани клопки и прави редица препоръки (една е BCrypt
, така че може да сте на прав път).
Изглежда, че не четете съхранения хеш от DB, преди да потвърдите. Не показвате как се запазва, но това е важно, за да може да се провери.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Създаване на ново влизане
' 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
Потвърдете опит
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
Бележки
DbConnection
,DbCommand
иDbDataReader
всички изпълняватDispose
което означава, че те могат много добре да разпределят ресурси, които трябва да бъдат освободени. Кодът използва всеки от тях вUsing
блок. Това ги създава в началото и ги изхвърля в края на блока.- Това използва имейл за уникален идентификатор, защото има много Steves там. Това означава, че SQL ще върне най-много един запис.
- След като заредите хеширания pw от DB, използвайте го за проверка на въведения опит за парола. Вашият код изглежда създава нов хеш (и всъщност не зарежда нищо от DB).
Произволната сол, първоначално генерирана при създаването на акаунта, става част от хеша (както и работния фактор, който сте използвали), както е показано тук:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Изход:
12
след "$2a$"
е факторът работа.