Zejména pokud jde o šifrování, měli byste mít nějakou obecnou představu o principech a pojmech. Salted Password Hashing
vysvětluje běžná úskalí a uvádí řadu doporučení (jedno je BCrypt
, takže možná jste na správné cestě).
Zdá se, že před ověřením nečtete uložený hash z DB. Neukazujete, jak se to ukládá, ale to je důležité pro ověření.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Vytvořit nové přihlášení
' 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
Ověřte pokus
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
Poznámky
DbConnection
,DbCommand
aDbDataReader
všechny implementujíDispose
což znamená, že mohou velmi dobře alokovat zdroje, které je třeba uvolnit. Kód používá každý z nich vUsing
blok. To je vytvoří na začátku a zlikviduje je na konci bloku.- Toto používá e-mail pro jedinečný identifikátor, protože je tam hodně Steveů. To znamená, že SQL vrátí maximálně jeden záznam.
- Po načtení hashovaného pw z DB použijte to pro ověření zadaného pokusu o heslo. Zdá se, že váš kód vytváří nový hash (a ve skutečnosti nenačítá nic z DB).
Náhodná sůl původně vygenerovaná při vytvoření účtu se stává součástí hash (stejně jako faktor práce, který jste použili), jak je znázorněno zde:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Výstup:
12
po "$2a$"
je pracovní faktor.