Surtout en ce qui concerne le cryptage, vous devez avoir une idée générale des principes et des concepts impliqués. Hachage de mot de passe salé
explique les pièges courants et fait un certain nombre de recommandations (l'une est BCrypt
, vous êtes donc peut-être sur la bonne voie).
Il semble que vous ne lisez pas le hachage stocké à partir de la base de données avant de vérifier. Vous ne montrez pas comment il est enregistré, mais c'est important pour qu'il puisse être vérifié.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Créer une nouvelle connexion
' 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
Vérifier une tentative
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
Remarques
DbConnection
,DbCommand
etDbDataReader
tous implémententDispose
ce qui signifie qu'ils peuvent très bien allouer des ressources qui doivent être libérées. Le code utilise chacun d'eux dans unUsing
bloquer. Cela les crée au début et les supprime à la fin du bloc.- Ceci utilise un e-mail pour l'identifiant unique car il y a beaucoup de Steves là-bas. Cela signifie que le SQL renverra un enregistrement au maximum.
- Après avoir chargé le mot de passe haché à partir de la base de données, utilisez il pour vérifier la tentative de mot de passe saisie. Votre code semble créer un nouveau hachage (et ne charge en fait rien de la base de données).
Le sel aléatoire généré à l'origine lors de la création du compte devient une partie du hachage (ainsi que le facteur de travail que vous avez utilisé) comme indiqué ici :
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Sortie :
Le 12
après "$2a$"
est le facteur travail.