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

Lưu trữ tên người dùng và mật khẩu trong cơ sở dữ liệu có an toàn không?

Quy trình lưu trữ mật khẩu với các biện pháp bảo mật cơ bản khá đơn giản:

  • Băm mật khẩu bằng muối
  • Sử dụng một loại muối khác nhau cho mỗi người dùng / mật khẩu
  • Lưu trữ muối với mật khẩu được băm trong DB
  • Khi họ cố gắng đăng nhập, hãy chạy những gì PW đã cố gắng thông qua cùng một phương pháp; so sánh kết quả.

Nếu họ nhập đúng mật khẩu, các PW đã băm sẽ khớp. Hashing bảo vệ người dùng khỏi các cuộc tấn công cũng như người gác cổng đi ngang qua màn hình với các thành viên members bảng trên màn hình.

Tạo muối và băm PW

Kích thước muối
' salt size is 32 (0-31
Private Const SaltSize As Integer = 31
...

Dim dbPW As String = TextBox1.Text
Dim dbSalt = CreateNewSalt(SaltSize)
' eg: "dsEGWpJpwfAOvdRZyUo9rA=="

Dim SaltedPWHash As String = GetSaltedHash(dbPW, dbSalt)
' examples:
' using SHA256: bbKN8wYYgoZmNaG3IsQ2DPS2ZPIOnenl6i5NwUmrGmo=
' using SHA512: 
' 0vqZWBIbOlyzL25l9iWk51CxxJTiEM6QUZEH1ph+/aNp+lk4Yf8NYv8RLhYtbqCNpOqO3y8BmM+0YWtbAhE+RA=="

Lưu trữ băm PW và muối như một phần của hồ sơ người dùng. Muối không phải là bí mật, nhưng hãy thay đổi nó khi / nếu người dùng thay đổi mật khẩu của họ.

So sánh một lần đăng nhập

' check if PW entered equals DB
Dim pwTry = TextBox2.Text
' hash the login attempt using the salt stored in the DB
Dim pwLogin = GetSaltedHash(pwTry, dbSalt)

' compare the hash of what they entered to whats in the DB:
If String.Compare(SaltedPWHash, pwLogin, False) = 0 Then
    ' okay!
    Console.Beep()
End If

Nếu người dùng nhập cùng một PW, nó sẽ dẫn đến cùng một hàm băm, nó đơn giản như vậy. Mã băm không phức tạp như vậy:

Phương pháp băm

Private Function GetSaltedHash(pw As String, salt As String) As String
    Dim tmp As String = pw & salt

    ' or SHA512Managed
    Using hash As HashAlgorithm = New SHA256Managed()
        ' convert pw+salt to bytes:
        Dim saltyPW = Encoding.UTF8.GetBytes(tmp)
        ' hash the pw+salt bytes:
        Dim hBytes = hash.ComputeHash(saltyPW)
        ' return a B64 string so it can be saved as text 
        Return Convert.ToBase64String(hBytes)
    End Using

End Function

Private Function CreateNewSalt(size As Integer) As String
    ' use the crypto random number generator to create
    ' a new random salt 
    Using rng As New RNGCryptoServiceProvider
        ' dont allow very small salt
        Dim data(If(size < 7, 7, size)) As Byte
        ' fill the array
        rng.GetBytes(data)
        ' convert to B64 for saving as text
        Return Convert.ToBase64String(data)
    End Using
End Function
  • Thật hấp dẫn khi sử dụng thứ gì đó giống như GUID (System.Guid.NewGuid.ToString ) như muối, nhưng việc sử dụng trình tạo số ngẫu nhiên mật mã không quá khó.
  • Giống với mật khẩu băm, chuỗi trả về dài hơn do mã hóa.
  • Tạo một muối mới mỗi khi người dùng thay đổi mật khẩu của họ. Đừng sử dụng muối chung, nó làm mất đi mục đích.
  • Bạn cũng có thể băm PW nhiều lần. Một phần quan trọng là mất nhiều thời gian để thử tất cả các kết hợp khác nhau nếu / khi bị tấn công.
  • Các hàm là ứng cử viên lý tưởng cho Shared / static các thành viên trong lớp.

Cũng xin lưu ý, bài viết được liên kết đến bởi Kenneth rất đáng đọc.

Lưu ý rằng bài viết đề cập đến The salt should be stored in the user account table alongside the hash Điều này không có nghĩa là bạn phải có Salt trong DB. Bạn có thể thấy những điều sau đang được thực hiện trong bài viết được liên kết:

Dim dbPW As String = TextBox1.Text
Dim dbSalt = CreateNewSalt(SaltSize)

' get the salted PW hash
Dim SaltedPWHash As String = GetSaltedHash(dbPW, dbSalt)
' store salt with the hash:
SaltedPWHash = String.Format("{0}:{1}", dbSalt, dbPW)
' salt + ":" + hashed PW now ready to store in the db

Để tách muối khỏi mật khẩu đã băm:

Dim SaltAndPWHash = rdr.Item("PWHash").ToString()

Dim split = SaltAndPWHash.Split(":"c)    ' split on ":"
Dim Salt = split(0)                      ' element(0) == salt
Dim StoredPWHash = split(1)              ' element(1) == hashed PW

Bạn cần cả hai phần:sau khi bạn băm nhật ký cố gắng trong PW, hãy so sánh nó với split(1) .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel Migration Error:Lỗi cú pháp hoặc vi phạm quyền truy cập:1071 Khóa được chỉ định quá dài; độ dài khóa tối đa là 767 byte

  2. MySQL chọn một cột DISTINCT, với các cột khác tương ứng

  3. MySQL Chọn N hàng đầu

  4. Các phương pháp hay nhất cho độ dài cột SQL varchar

  5. Cách bảo mật MySQL:Phần một