Terutama dalam hal enkripsi, Anda harus memiliki beberapa gagasan umum tentang prinsip dan konsep yang terlibat. Hashing Sandi Asin
menjelaskan perangkap umum dan membuat sejumlah rekomendasi (salah satunya adalah BCrypt
, jadi Anda mungkin berada di jalan yang benar).
Sepertinya Anda tidak membaca hash yang disimpan dari DB sebelum Anda memverifikasi. Anda tidak menunjukkan cara penyimpanannya, tetapi itu penting untuk memverifikasinya.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Buat Login Baru
' 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
Verifikasi Percobaan
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
Catatan
DbConnection
,DbCommand
danDbDataReader
semua menerapkanDispose
yang berarti mereka mungkin mengalokasikan sumber daya yang perlu dikeluarkan dengan sangat baik. Kode menggunakan masing-masing dalamUsing
memblokir. Ini membuatnya di awal dan membuangnya di akhir Blok.- Ini menggunakan email untuk pengenal unik karena ada banyak Steve di luar sana. Ini berarti SQL akan mengembalikan paling banyak satu record.
- Setelah memuat hash pw dari DB, gunakan itu untuk memverifikasi upaya sandi yang dimasukkan. Kode Anda tampaknya membuat hash baru (dan sebenarnya tidak memuat apa pun dari DB).
Garam acak yang awalnya dibuat saat akun dibuat menjadi bagian dari hash (serta faktor kerja yang Anda gunakan) seperti yang ditunjukkan di sini:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Keluaran:
12
setelah "$2a$"
adalah faktor pekerjaan.