Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

BCrypt Verifique o hash de senha armazenado


Especialmente quando se trata de criptografia, você deve ter uma ideia geral dos princípios e conceitos envolvidos. Hashing de senha salgada explica armadilhas comuns e faz várias recomendações (uma é BCrypt , então você pode estar no caminho certo).

Parece que você não está lendo o hash armazenado do banco de dados antes de verificar. Você não mostra como ele é salvo, mas isso é importante para que ele seja verificado.
 ' cuts down on dot operators
 Imports BCryptor = BCrypt.Net.BCrypt

Criar novo logon

' 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 uma tentativa

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

Observações
  • DbConnection , DbCommand e DbDataReader todos implementam Dispose o que significa que eles podem muito bem alocar recursos que precisam ser liberados. O código usa cada um deles em um Using quadra. Isso os cria no início e os descarta no final do Bloco.
  • Isso usa um e-mail para o identificador exclusivo porque há muitos Steves por aí. Isso significa que o SQL retornará no máximo um registro.
  • Depois de carregar o pw com hash do banco de dados, use ele para verificar a tentativa de senha digitada. Seu código parece estar criando um novo hash (e na verdade não carrega nada do banco de dados).

O sal aleatório gerado originalmente quando a conta foi criada torna-se parte do hash (assim como o fator de trabalho que você usou), conforme mostrado aqui:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)

Console.WriteLine(salt)
Console.WriteLine(hash)

Resultado:

O 12 depois de "$2a$" é o fator trabalho.