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

BCrypt Bekræft gemt adgangskode-hash

Især når det kommer til kryptering, bør du have en generel idé om de involverede principper og koncepter. Saltet adgangskodehashing forklarer almindelige faldgruber og giver en række anbefalinger (en er BCrypt , så du kan være på rette vej).

Det ser ud til, at du ikke læser den gemte hash fra DB'en, før du bekræfter. Du viser ikke, hvordan det er gemt, men det er vigtigt, for at det kan verificeres.

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

Opret nyt 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

Bekræft et forsøg

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

Noter

  • DbConnection , DbCommand og DbDataReader alle implementerer Dispose hvilket betyder, at de meget vel kan allokere ressourcer, som skal frigives. Koden bruger hver af dem i en Using blok. Dette opretter dem i starten og kasserer dem i slutningen af ​​blokken.
  • Dette bruger en e-mail til den unikke identifikator, fordi der er mange Steves derude. Det betyder, at SQL'en maksimalt vil returnere én post.
  • Når du har indlæst den hasherede pw fra databasen, skal du bruge det for at bekræfte det indtastede adgangskodeforsøg. Din kode ser ud til at skabe en ny hash (og indlæser faktisk ikke noget fra DB).

Det tilfældige salt, der oprindeligt blev genereret, da kontoen blev oprettet, bliver en del af hashen (såvel som den arbejdsfaktor, du brugte), som vist her:

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

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

Output:

12 efter "$2a$" er arbejdsfaktoren.




  1. Brug af local.js til at gemme sails-mysql adgangskode

  2. PHP/MYSQL AJAX Chat

  3. postgresql 9.1 - få adgang til tabeller gennem funktioner

  4. MySQL:Hvordan tilmelder jeg mig samme bord flere gange?