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
ochDbDataReader
alla implementerarDispose
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 enUsing
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.