Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah aman menyimpan nama pengguna dan kata sandi di database?

Proses penyimpanan sandi dengan ukuran keamanan dasar cukup sederhana:

  • Hash password dengan garam
  • Gunakan garam yang berbeda untuk setiap pengguna/sandi
  • Simpan garam dengan kata sandi hash di DB
  • Saat mereka mencoba masuk, jalankan apa yang dicoba PW melalui metode yang sama; bandingkan hasilnya.

Jika mereka memasukkan kata sandi yang benar, PW yang di-hash akan cocok. Hashing melindungi pengguna dari serangan serta petugas kebersihan berjalan di dekat layar dengan members tabel dipajang.

Membuat Salt dan Hashing PW

' 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=="

Simpan hash PW dan garam sebagai bagian dari catatan pengguna. Garam bukanlah rahasia, tetapi ubah ketika/jika pengguna mengubah kata sandinya.

Membandingkan upaya Login

' 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

Jika pengguna memasukkan PW yang sama, itu akan menghasilkan hash yang sama, sesederhana itu. Kode hashing tidak terlalu rumit:

Metode Hash

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
  • Sangat menggoda untuk menggunakan sesuatu seperti GUID (System.Guid.NewGuid.ToString ) sebagai garam, tetapi tidak terlalu sulit untuk menggunakan pembuat angka acak kriptografis.
  • Seperti halnya sandi yang di-hash, string yang dikembalikan lebih panjang karena penyandiannya.
  • Buat garam baru setiap kali pengguna mengubah sandi. Jangan gunakan garam global, itu merusak tujuannya.
  • Anda juga dapat meng-hash PW beberapa kali. Bagian dari kuncinya adalah membuatnya butuh waktu lama untuk mencoba semua berbagai kombinasi jika/saat diserang.
  • Fungsi adalah kandidat ideal untuk Shared / static anggota kelas.

Perhatikan juga, artikel yang ditautkan oleh Kenneth layak dibaca.

Perhatikan bahwa artikel menyebutkan The salt should be stored in the user account table alongside the hash Ini tidak berarti Anda harus memiliki Salt kolom di DB. Anda dapat melihat hal berikut dilakukan di artikel tertaut:

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

Untuk memisahkan garam dari kata sandi hash:

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

Anda memerlukan kedua bagian:setelah Anda melakukan hash pada percobaan masuk PW, bandingkan dengan 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. JSON_STORAGE_FREE() – Cari Tahu Berapa Banyak Ruang Penyimpanan yang Dikosongkan Setelah Pembaruan Dokumen JSON di MySQL

  2. SQL pilih hanya baris dengan nilai maksimal pada kolom

  3. Bagaimana saya bisa daftar memiliki data id yang sama dengan loop sementara di PHP?

  4. Cara Mendapatkan Nama Bulan Pendek dari Tanggal di MySQL

  5. Pengecualian:Sudah ada DataReader terbuka yang terkait dengan Koneksi ini yang harus ditutup terlebih dahulu