Pertama, beberapa istilah yang penting:
Hashing - Tindakan mengambil string dan menghasilkan urutan karakter yang tidak dapat dikembalikan ke string asli.
Symmetric Encryption - (Biasanya hanya disebut sebagai 'enkripsi') - Tindakan mengambil string dan menghasilkan urutan karakter yang dapat didekripsi ke string asli melalui penggunaan kunci enkripsi yang sama yang dienkripsi itu.
Rainbow Table - tabel pencarian yang berisi semua variasi karakter yang hash dalam algoritma hashing tertentu.
Garam - string acak yang dikenal ditambahkan ke string asli sebelum hash.
Untuk .NET Framework, Bcrypt belum memiliki implementasi referensi terverifikasi . Ini penting karena tidak ada cara untuk mengetahui apakah ada kelemahan serius dalam implementasi yang ada. Anda bisa mendapatkan implementasi BCrypt untuk .NET di sini . Saya tidak cukup tahu tentang kriptografi untuk mengatakan apakah itu implementasi yang baik atau buruk. Kriptografi adalah bidang yang sangat dalam. Jangan mencoba membangun algoritma enkripsi Anda sendiri . Serius.
Jika Anda ingin menerapkan keamanan kata sandi Anda sendiri, maka Anda perlu melakukan beberapa hal:
- Gunakan algoritma hash yang relatif aman .
- Garam setiap kata sandi sebelum di-hash.
- Gunakan garam yang unik dan panjang untuk setiap kata sandi , dan simpan garam dengan kata sandi.
- Membutuhkan kata sandi yang kuat .
Sayangnya, bahkan jika Anda melakukan semua ini, seorang hacker yang gigih masih berpotensi menemukan kata sandinya, itu hanya akan memakan waktu yang sangat lama. Itu musuh utama Anda: Waktu .
The algoritma bcrypt bekerja karena butuh lima lipat lebih lama untuk hash password dari MD5 ; (dan masih lebih lama dari AES atau SHA-512). Ini memaksa peretas untuk menghabiskan lebih banyak waktu untuk membuat tabel pelangi untuk mencari kata sandi Anda, membuatnya jauh lebih kecil kemungkinannya bahwa kata sandi Anda akan terancam diretas.
Jika Anda salting dan hashing kata sandi Anda, dan setiap garam berbeda, maka peretas potensial harus membuat tabel pelangi untuk setiap variasi garam , hanya untuk memiliki tabel pelangi untuk satu kata sandi + hash asin. Itu berarti jika Anda memiliki 1 juta pengguna, seorang hacker harus menghasilkan 1 juta tabel pelangi. Jika Anda menggunakan garam yang sama untuk setiap pengguna, maka peretas hanya perlu membuat 1 tabel pelangi untuk berhasil meretas sistem Anda.
Jika Anda tidak memberi salin kata sandi, maka yang harus dilakukan penyerang adalah menarik tabel Rainbow yang ada untuk setiap implementasi di luar sana (AES, SHA-512, MD5) dan hanya melihat apakah ada yang cocok dengan hash. Ini sudah dilakukan , penyerang tidak perlu menghitung tabel Rainbow ini sendiri .
Bahkan dengan semua ini, Anda harus menggunakan praktik keamanan yang baik . Jika mereka dapat berhasil menggunakan vektor serangan lain (XSS, SQL Injection, CSRF, et. Al. ) Di situs Anda, keamanan kata sandi yang baik tidak masalah. Itu terdengar seperti pernyataan yang kontroversial, tetapi pikirkan: Jika saya bisa mendapatkan semua informasi pengguna Anda melalui serangan injeksi SQL, atau saya bisa meminta pengguna Anda untuk memberikan saya cookie mereka melalui XSS, maka tidak masalah seberapa baik kata sandi Anda keamanan .
Sumber lain:
- Jeff Atwood: .NET Enkripsi Sederhana (bagus untuk ikhtisar hashing)
- Jeff Atwood: Saya baru saja masuk sebagai Anda
- Jeff Atwood: Anda mungkin salah menyimpan kata sandi
- Jeff Atwood: Speed Hashing
Catatan: Harap rekomendasikan sumber daya lain yang baik. Saya pasti telah membaca selusin artikel oleh puluhan penulis, tetapi hanya sedikit yang menulis sejelas itu tentang subjek seperti yang dilakukan Jeff. Harap edit dalam artikel saat Anda menemukannya.