Mysql
 sql >> Database >  >> RDS >> Mysql

BCrypt Verifica l'hash della password memorizzata

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 e DbDataReader tutti implementano Dispose il che significa che possono benissimo allocare risorse che devono essere rilasciate. Il codice usa ciascuno di essi in un Using 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.