sql >> Databasteknik >  >> RDS >> Mysql

BCrypt Verifiera lagrat lösenordshash

Speciellt när det kommer till kryptering bör du ha en allmän uppfattning om principerna och begreppen som är involverade. Saltad lösenordshasning förklarar vanliga fallgropar och ger ett antal rekommendationer (en är BCrypt , så du kanske är på rätt väg).

Det verkar som att du inte läser den lagrade hashen från DB:n innan du verifierar. Du visar inte hur det sparas, men det är viktigt för att det ska kunna verifieras.

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

Skapa ny inloggning

' 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

Verifiera ett försök

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

Anteckningar

  • DbConnection , DbCommand och DbDataReader alla implementerar Dispose vilket innebär att de mycket väl kan allokera resurser som behöver frigöras. Koden använder var och en av dem i en Using blockera. Detta skapar dem i början och kasserar dem i slutet av blocket.
  • Detta använder en e-post för den unika identifieraren eftersom det finns många Steves där ute. Detta innebär att SQL returnerar högst en post.
  • När du har laddat den hashade pw från DB, använd it för att verifiera lösenordsförsöket. Din kod verkar skapa en ny hash (och laddar faktiskt ingenting från DB).

Det slumpmässiga saltet som ursprungligen genererades när kontot skapades blir en del av hashen (liksom arbetsfaktorn du använde) som visas här:

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

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

Utdata:

12 efter "$2a$" är arbetsfaktorn.




  1. Skiftlägeskänslig i Mysql med hjälp av välj var Fråga

  2. exportera tabell till csv på postgres

  3. Hur blir man av med en tom men enorm LOB-kolumn?

  4. Anrop till odefinierad funktion sqlsrv_connect() - Felsökning