Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

BCrypt Xác minh băm mật khẩu được lưu trữ

Đặ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 , DbCommandDbDataReader tất cả triển khai Dispose 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ột Using 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính nguyên tử nhiều truy vấn con MySQL trong một truy vấn CHÈN / CẬP NHẬT?

  2. Rò rỉ bộ nhớ Java MySQL JDBC

  3. Cách lấy cấu trúc cơ sở dữ liệu trong MySQL thông qua truy vấn

  4. Nhóm các giá trị liên tiếp trong MySQL và thêm id vào các nhóm như vậy

  5. Tìm cách trích xuất dữ liệu giữa các dấu ngoặc đơn trong một chuỗi thông qua MYSQL