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

BCrypt Verifikasi hash kata sandi yang tersimpan

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 dan DbDataReader semua menerapkan Dispose yang berarti mereka mungkin mengalokasikan sumber daya yang perlu dikeluarkan dengan sangat baik. Kode menggunakan masing-masing dalam Using 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Regresi linier, menemukan kemiringan di MySQL

  2. Setel Ulang Kata Sandi Root MySQL di Windows

  3. Contoh UTC_DATE – MySQL

  4. Pilih jumlah baris minimal dengan jumlah total lebih besar dari atau sama dengan ambang batas yang diberikan

  5. daftar tarik-turun ajax php