sql >> Database >  >> RDS >> Mysql

BCrypt Verifieer opgeslagen wachtwoordhash

Vooral als het gaat om encryptie, zou je een algemeen idee moeten hebben van de principes en concepten die erbij betrokken zijn. Gezouten wachtwoordhashing legt veelvoorkomende valkuilen uit en doet een aantal aanbevelingen (een daarvan is BCrypt , dus je bent misschien op de goede weg).

Het lijkt erop dat u de opgeslagen hash niet uit de DB leest voordat u verifieert. Je laat niet zien hoe het is opgeslagen, maar dat is belangrijk om het te verifiëren.

 ' cuts down on dot operators
 Imports BCryptor = BCrypt.Net.BCrypt

Nieuwe aanmelding maken

' 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

Een poging verifiëren

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

Opmerkingen

  • DbConnection , DbCommand en DbDataReader allemaal implementeren Dispose wat betekent dat ze heel goed middelen kunnen toewijzen die moeten worden vrijgegeven. De code gebruikt ze allemaal in een Using blok. Dit creëert ze aan het begin en verwijdert ze aan het einde van het blok.
  • Dit gebruikt een e-mailadres voor de unieke identificatie omdat er veel Steve's zijn. Dit betekent dat de SQL maximaal één record zal retourneren.
  • Na het laden van de gehashte pw uit de DB, gebruik it om de ingevoerde wachtwoordpoging te verifiëren. Je code lijkt een nieuwe hash aan te maken (en laadt eigenlijk niets uit de DB).

De willekeurige salt die oorspronkelijk werd gegenereerd toen het account werd gemaakt, wordt onderdeel van de hash (evenals de werkfactor die u hebt gebruikt), zoals hier wordt weergegeven:

Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)

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

Uitgang:

De 12 na "$2a$" is de werkfactor.




  1. selecteer/toon laatst ingevoegde serie-ID in postgres

  2. orakel plegen moorden

  3. Hoe lokale tijd naar UTC te converteren?

  4. Een MySQL JSON-kolom toewijzen aan een Java-entiteitseigenschap met behulp van JPA en Hibernate