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
undDbDataReader
alle implementierenDispose
was bedeutet, dass sie sehr wohl Ressourcen zuweisen können, die freigegeben werden müssen. Der Code verwendet jeden von ihnen in einemUsing
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.