Especialmente cuando se trata de encriptación, debe tener una idea general de los principios y conceptos involucrados. Hashing de contraseña con sal
explica las trampas comunes y hace una serie de recomendaciones (una es BCrypt
, para que pueda estar en el camino correcto).
Parece que no está leyendo el hash almacenado de la base de datos antes de verificar. No muestra cómo se guarda, pero eso es importante para que se verifique.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Crear nuevo inicio de sesión
' 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
Verificar un intento
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
Notas
DbConnection
,DbCommand
yDbDataReader
todos implementanDispose
lo que significa que muy bien pueden asignar recursos que deben liberarse. El código usa cada uno de ellos en unUsing
bloquear. Esto los crea al principio y los elimina al final del Bloque.- Esto usa un correo electrónico para el identificador único porque hay muchos Steves por ahí. Esto significa que SQL devolverá un registro como máximo.
- Después de cargar el hash pw de la base de datos, utilícelo it para verificar el intento de contraseña ingresado. Su código parece estar creando un nuevo hash (y en realidad no carga nada desde la base de datos).
La sal aleatoria generada originalmente cuando se creó la cuenta se vuelve parte del hash (así como el factor de trabajo que usó) como se muestra aquí:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Salida:
El 12
después de "$2a$"
es el factor trabajo.