sql >> Base de Datos >  >> RDS >> Mysql

BCrypt Verificar hash de contraseña almacenada

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 y DbDataReader todos implementan Dispose lo que significa que muy bien pueden asignar recursos que deben liberarse. El código usa cada uno de ellos en un Using 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.