Soprattutto quando si tratta di crittografia, dovresti avere un'idea generale dei principi e dei concetti coinvolti. Hashing delle password salate
spiega le insidie comuni e fornisce una serie di consigli (uno è BCrypt
, quindi potresti essere sulla strada giusta).
Sembra che tu non stia leggendo l'hash memorizzato dal DB prima della verifica. Non mostri come viene salvato, ma è importante per verificarlo.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Crea nuovo accesso
' 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
Verifica un tentativo
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
Note
DbConnection
,DbCommand
eDbDataReader
tutti implementanoDispose
il che significa che possono benissimo allocare risorse che devono essere rilasciate. Il codice usa ciascuno di essi in unUsing
bloccare. Questo li crea all'inizio e li elimina alla fine del Blocco.- Questo utilizza un'e-mail per l'identificatore univoco perché ci sono molti Steve là fuori. Ciò significa che l'SQL restituirà al massimo un record.
- Dopo aver caricato la pw hash dal DB, usa it per verificare il tentativo di password inserito. Il tuo codice sembra creare un nuovo hash (e in realtà non carica nulla dal DB).
Il sale casuale originariamente generato quando è stato creato l'account diventa parte dell'hash (così come il fattore di lavoro che hai utilizzato) come mostrato qui:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Uscita:
Il 12
dopo "$2a$"
è il fattore lavoro.