Đặc biệt khi nói đến mã hóa, bạn phải có một số ý tưởng chung về các nguyên tắc và khái niệm liên quan. Băm mật khẩu muối
giải thích những cạm bẫy phổ biến và đưa ra một số khuyến nghị (một là BCrypt
, vì vậy bạn có thể đang đi đúng đường).
Có vẻ như bạn không đọc hàm băm được lưu trữ từ DB trước khi xác minh. Bạn không cho biết cách nó được lưu, nhưng điều đó rất quan trọng để nó được xác minh.
' cuts down on dot operators
Imports BCryptor = BCrypt.Net.BCrypt
Tạo đăng nhập mới
' 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
Xác minh một lần thử
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
Ghi chú
-
DbConnection
,DbCommand
vàDbDataReader
tất cả triển khaiDispose
có nghĩa là họ có thể phân bổ rất tốt các nguồn tài nguyên cần được phát hành. Mã sử dụng mỗi mã trong mộtUsing
khối. Điều này tạo ra chúng ở đầu và xử lý chúng ở cuối Block. - Điều này sử dụng một email cho số nhận dạng duy nhất vì có rất nhiều Steves ngoài đó. Điều này có nghĩa là SQL sẽ trả về tối đa một bản ghi.
- Sau khi tải pw được băm từ DB, hãy sử dụng it để xác minh nỗ lực nhập mật khẩu. Mã của bạn dường như đang tạo một hàm băm mới (và không thực sự tải bất kỳ thứ gì từ DB).
Muối ngẫu nhiên được tạo ban đầu khi tài khoản được tạo sẽ trở thành một phần của hàm băm (cũng như hệ số công việc bạn đã sử dụng) như được hiển thị ở đây:
Dim pw = "My!Weak#Pa$$word"
Dim salt = BCryptor.GenerateSalt(12)
Dim hash = BCryptor.HashPassword(pw, salt)
Console.WriteLine(salt)
Console.WriteLine(hash)
Đầu ra:
12
sau "$2a$"
là yếu tố công việc.