Mysql
 sql >> Base de données >  >> RDS >> Mysql

BCrypt Vérifier le hachage du mot de passe stocké

Surtout en ce qui concerne le cryptage, vous devez avoir une idée générale des principes et des concepts impliqués. Hachage de mot de passe salé explique les pièges courants et fait un certain nombre de recommandations (l'une est BCrypt , vous êtes donc peut-être sur la bonne voie).

Il semble que vous ne lisez pas le hachage stocké à partir de la base de données avant de vérifier. Vous ne montrez pas comment il est enregistré, mais c'est important pour qu'il puisse être vérifié.

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

Créer une nouvelle connexion

' 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

Vérifier une tentative

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

Remarques

  • DbConnection , DbCommand et DbDataReader tous implémentent Dispose ce qui signifie qu'ils peuvent très bien allouer des ressources qui doivent être libérées. Le code utilise chacun d'eux dans un Using bloquer. Cela les crée au début et les supprime à la fin du bloc.
  • Ceci utilise un e-mail pour l'identifiant unique car il y a beaucoup de Steves là-bas. Cela signifie que le SQL renverra un enregistrement au maximum.
  • Après avoir chargé le mot de passe haché à partir de la base de données, utilisez il pour vérifier la tentative de mot de passe saisie. Votre code semble créer un nouveau hachage (et ne charge en fait rien de la base de données).

Le sel aléatoire généré à l'origine lors de la création du compte devient une partie du hachage (ainsi que le facteur de travail que vous avez utilisé) comme indiqué ici :

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

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

Sortie :

Le 12 après "$2a$" est le facteur travail.