Mysql
 sql >> Datenbank >  >> RDS >> Mysql

BCrypt Gespeicherten Passwort-Hash überprüfen

Besonders wenn es um Verschlüsselung geht, sollten Sie eine allgemeine Vorstellung von den Prinzipien und Konzepten haben. Salted Password Hashing erklärt gängige Fallstricke und gibt eine Reihe von Empfehlungen (eine davon ist BCrypt , also sind Sie vielleicht auf dem richtigen Weg).

Es sieht so aus, als würden Sie den gespeicherten Hash nicht aus der DB lesen, bevor Sie ihn überprüfen. Sie zeigen nicht, wie es gespeichert wird, aber das ist wichtig, damit es überprüft werden kann.

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

Neue Anmeldung erstellen

' 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

Verifizieren Sie einen Versuch

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

Notizen

  • DbConnection , DbCommand und DbDataReader alle implementieren Dispose was bedeutet, dass sie sehr wohl Ressourcen zuweisen können, die freigegeben werden müssen. Der Code verwendet jeden von ihnen in einem Using Block. Dies erstellt sie am Anfang und entsorgt sie am Ende des Blocks.
  • Hier wird eine E-Mail als eindeutige Kennung verwendet, da es viele Steves gibt. Das bedeutet, dass die SQL höchstens einen Datensatz zurückgibt.
  • Nachdem Sie das gehashte pw aus der DB geladen haben, verwenden Sie es um den eingegebenen Passwortversuch zu verifizieren. Ihr Code scheint einen neuen Hash zu erstellen (und lädt eigentlich nichts aus der DB).

Das zufällige Salt, das ursprünglich generiert wurde, als das Konto erstellt wurde, wird Teil des Hashs (sowie der von Ihnen verwendete Arbeitsfaktor), wie hier gezeigt:

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

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

Ausgabe:

Die 12 nach "$2a$" ist der Arbeitsfaktor.