Saya sedang mengerjakan proyek yang harus memiliki otentikasi (nama pengguna dan kata sandi)
Ini juga terhubung ke database, jadi saya pikir saya akan menyimpan nama pengguna dan kata sandi di sana. Namun, sepertinya bukan ide yang baik untuk memiliki kata sandi hanya sebagai bidang teks dalam tabel yang berada di database.
Saya menggunakan C # dan menghubungkan ke server ekspres 2008. Adakah yang bisa menyarankan (dengan sebanyak mungkin contoh) apa cara terbaik untuk menyimpan data jenis ini?
PS Saya terbuka pada gagasan bahwa info ini tidak disimpan dalam database jika alasan yang baik dapat diberikan
Jawaban:
Anda benar bahwa menyimpan kata sandi di bidang teks biasa adalah ide yang mengerikan . Namun, sejauh lokasi berjalan , untuk sebagian besar kasus yang akan Anda temui (dan saya benar-benar tidak bisa memikirkan contoh tandingan) menyimpan representasi kata sandi dalam database adalah hal yang tepat untuk dilakukan. Dengan representasi saya berarti bahwa Anda ingin hash password menggunakan garam (yang harus berbeda untuk setiap pengguna) dan algoritma 1-cara yang aman dan toko yang , membuang password asli. Kemudian, ketika Anda ingin memverifikasi kata sandi, Anda hash nilainya (menggunakan algoritma hashing dan garam yang sama) dan membandingkannya dengan nilai hash dalam database.
Jadi, walaupun Anda memikirkan hal ini adalah hal yang baik dan ini adalah pertanyaan yang bagus, sebenarnya ini adalah duplikat dari pertanyaan-pertanyaan ini (setidaknya):
Untuk mengklarifikasi sedikit lebih jauh pada bit penggaraman, bahayanya dengan hanya membuat password dan menyimpannya adalah bahwa jika seorang pelanggar menguasai database Anda, mereka masih dapat menggunakan apa yang dikenal sebagai tabel pelangi untuk dapat "mendekripsi" kata sandi (setidaknya yang muncul di tabel pelangi). Untuk menyiasatinya, pengembang menambahkan garam ke kata sandi yang, jika dilakukan dengan benar, membuat serangan pelangi tidak mungkin dilakukan. Perhatikan bahwa kesalahpahaman yang umum adalah dengan menambahkan string unik dan panjang yang sama ke semua kata sandi; Meskipun ini tidak mengerikan , yang terbaik adalah menambahkan garam unik ke setiap kata sandi. Baca ini untuk lebih lanjut.
sumber
Latar Belakang Anda tidak pernah ... benar-benar ... perlu mengetahui kata sandi pengguna. Anda hanya ingin memverifikasi pengguna yang masuk mengetahui kata sandi untuk suatu akun.
Hash It: Menyimpan kata sandi pengguna hash (enkripsi satu arah) melalui fungsi hash yang kuat. Pencarian untuk "c # mengenkripsi kata sandi" memberikan banyak contoh.
Lihat pembuat hash SHA1 online untuk gagasan tentang apa yang dihasilkan fungsi hash (Tapi jangan gunakan SHA1 sebagai fungsi hash, gunakan sesuatu yang lebih kuat seperti SHA256).
Sekarang, kata sandi hash berarti Anda (dan pencuri basis data) tidak dapat membalikkan hash itu kembali ke kata sandi semula.
Bagaimana cara menggunakannya: Tapi, Anda berkata, bagaimana saya menggunakan kata sandi yang dihaluskan yang disimpan dalam database?
Ketika pengguna masuk, mereka akan memberi Anda nama pengguna dan kata sandi (dalam teks aslinya). Anda hanya menggunakan kode hash yang sama untuk hash kata sandi yang diketik untuk mendapatkan versi yang disimpan.
Jadi, bandingkan dua kata sandi hash (hash basis data untuk nama pengguna dan kata sandi yang diketik & hash). Anda dapat mengetahui apakah "apa yang mereka ketikkan" cocok dengan "apa yang dimasukkan oleh pengguna asli untuk kata sandi mereka" dengan membandingkan hash mereka.
Kredit tambahan:
Pertanyaan: Jika saya memiliki basis data Anda, maka bisakah saya mengambil cracker seperti John the Ripper dan mulai membuat hash sampai saya menemukan kecocokan dengan kata sandi hash yang tersimpan? (karena pengguna memilih kata-kata kamus yang pendek ... seharusnya mudah)
Jawab: Ya ... ya mereka bisa.
Jadi, Anda harus 'garam' kata sandi Anda. Lihat artikel Wikipedia tentang garam
Lihat "Cara hash data dengan garam" contoh C #
sumber
Sebagai hash yang dikeraskan dengan kunci, menggunakan algoritma aman seperti sha-512.
sumber
Praktik keamanan terbaik adalah tidak menyimpan kata sandi sama sekali (bahkan tidak dienkripsi), tetapi untuk menyimpan hash asin (dengan garam unik per kata sandi) dari kata sandi terenkripsi.
Dengan cara itu (secara praktis) tidak mungkin untuk mengambil kata sandi plaintext.
sumber
Saya benar-benar merekomendasikan membaca artikel Cukup Dengan Tabel Pelangi: Yang Perlu Anda Ketahui Tentang Skema Sandi Aman [tautan mati, salin di Internet Archive ] dan Cara Menyimpan Kata Sandi Secara Aman .
Banyak coders, termasuk saya sendiri, berpikir mereka memahami keamanan dan hashing. Sayangnya kebanyakan dari kita tidak.
sumber
Saya mungkin sedikit di luar topik ketika Anda menyebutkan perlunya nama pengguna dan kata sandi, dan pemahaman saya tentang masalah ini memang bukan yang terbaik tetapi apakah OpenID sesuatu yang patut dipertimbangkan?
Jika Anda menggunakan OpenID maka Anda tidak akan menyimpan kredensial sama sekali jika saya memahami teknologi dengan benar dan pengguna dapat menggunakan kredensial yang sudah mereka miliki, menghindari kebutuhan untuk membuat identitas baru yang khusus untuk aplikasi Anda.
Ini mungkin tidak cocok jika aplikasi tersebut murni untuk penggunaan internal
RPX menyediakan cara mudah yang bagus untuk mengintegrasikan dukungan OpenID ke dalam suatu aplikasi.
sumber
Dalam skenario Anda, Anda dapat melihat keanggotaan asp.net, merupakan praktik yang baik untuk menyimpan kata sandi pengguna sebagai string hash dalam database. Anda dapat mengotentikasi pengguna dengan membandingkan kata sandi masuk yang hash dengan yang disimpan dalam database.
Semuanya telah dibangun untuk tujuan ini, periksa keanggotaan asp.net
sumber
Saya akan MD5 / SHA1 kata sandi jika Anda tidak perlu dapat membalikkan hash. Saat pengguna masuk, Anda bisa mengenkripsi kata sandi yang diberikan dan membandingkannya dengan hash. Tabrakan hash hampir tidak mungkin dalam kasus ini, kecuali seseorang mendapatkan akses ke database dan melihat hash yang sudah mereka tabrakan.
sumber