Secara umum, Anda tidak perlu menggunakan lebih dari satu algoritma hashing.
Yang perlu Anda lakukan adalah:
Gunakan garam: garam tidak digunakan hanya untuk membuat kata sandi Anda lebih aman , itu digunakan untuk menghindari serangan tabel pelangi. Dengan begitu, seseorang akan memiliki pekerjaan yang lebih sulit untuk mencoba menghitung hash untuk kata sandi yang Anda simpan di sistem Anda.
Gunakan beberapa interasi: alih-alih hanya melakukan SHA (kata sandi + garam), lakukan SHA (SHA (SHA (SHA (SHA (... SHA (kata sandi + garam)))))))). Atau, untuk mewakili dengan cara lain:
hash = sha(password + salt)
for i=1 , i=5000, i++ {
hash = sha(hash + salt);
}
Dan, akhirnya, pilih fungsi hashing yang bagus. SHA, MD5, dll, tidak bagus karena mereka terlalu cepat . Karena Anda ingin menggunakan hash untuk perlindungan, Anda sebaiknya menggunakan hash yang lebih lambat. Lihatlah Bcrypt , PBKDF2 atau Scrypt , misalnya.
sunting : setelah pengamatan, mari kita coba untuk melihat beberapa poin (maaf, penjelasan panjang sampai akhir, karena mungkin membantu orang lain mencari jawaban yang sama):
Jika sistem Anda aman, seperti tidak ada yang akan pernah mendapatkan akses ke kata sandi yang disimpan, Anda tidak akan perlu hash. Kata sandi akan dirahasiakan, tidak ada yang akan mendapatkannya.
Tetapi tidak ada yang bisa memastikan bahwa database dengan kata sandi akan dicuri. Curi databasenya, dapatkan semua kata sandinya. Oke, sistem Anda dan perusahaan Anda akan menanggung semua akibatnya. Jadi, kita bisa mencoba menghindari kebocoran kata sandi ini.
PEMBERITAHUAN bahwa kami tidak khawatir tentang serangan online dalam hal ini. Untuk satu serangan online, solusi terbaik adalah memperlambat setelah kata sandi buruk, mengunci akun setelah beberapa kali mencoba, dll. Dan untuk itu tidak masalah ke arah mana Anda mengenkripsi, hash, menyimpan, dll, kata sandi Anda. Serangan online adalah masalah memperlambat input kata sandi .
Jadi, kembali ke don't let them take my plain passwords
masalahnya. Jawabannya sederhana: jangan menyimpannya sebagai teks biasa. OK mengerti.
Bagaimana cara menghindarinya?
Enkripsi kata sandi (?). Tapi, seperti yang Anda tahu, jika Anda mengenkripsi, Anda dapat mendekripsi kembali, jika Anda memiliki kunci yang tepat. Dan Anda akan berakhir dengan masalah "di mana menyembunyikan" kuncinya. Hum, tidak bagus, karena mereka punya Anda basis data, mereka bisa mendapatkan kunci Anda. Ok, jangan digunakan.
Jadi, pendekatan lain: mari kita ubah kata sandi dalam sesuatu yang lain yang tidak dapat dibalik dan simpan. Dan untuk memverifikasi apakah kata sandi yang diberikan benar, kami melakukan proses yang sama lagi dan memeriksa apakah kedua nilai yang diubah cocok. Jika mereka cocok = kata sandi yang baik diberikan.
Ok, sejauh ini bagus. Mari kita gunakan beberapa hash MD5 dalam kata sandi. Tetapi ... jika seseorang memiliki nilai kata sandi hash yang tersimpan, ia dapat memiliki banyak daya komputer untuk menghitung hash MD5 dari setiap kata sandi yang mungkin (brute force), sehingga ia dapat menemukan kata sandi asli. Atau, yang terburuk, ia dapat menyimpan semua MD5 dari semua kombinasi karakter, dan dengan mudah menemukan kata sandi. Jadi, lakukan banyak iteractions, HASH (HASH (HASH ())), untuk membuatnya lebih sulit, karena itu akan membutuhkan lebih banyak waktu.
Tetapi bahkan itu bisa dilewati, meja pelangi diciptakan tepat untuk mempercepat terhadap perlindungan semacam ini.
Jadi, mari kita gunakan garam di atasnya. Dengan cara ini, pada setiap interaksi, garam digunakan lagi. Seseorang yang mencoba menyerang kata sandi Anda harus membuat tabel pelangi mengingat garam ditambahkan setiap kali. Dan ketika dia membuat tabel pelangi itu, karena dihasilkan dengan satu garam, dia harus menghitung lagi dengan garam yang lain, jadi dia harus meluangkan waktu untuk setiap kata sandi (= setiap garam). Garam tidak akan menambahkan "lebih banyak kerumitan" pada kata sandi, itu hanya akan membuat penyerang kehilangan waktu membuat tabel pelangi, jika Anda menggunakan satu garam untuk setiap kata sandi, tabel dari satu garam tidak berguna untuk kata sandi lain.
Dan menggunakan lebih dari satu hash akan membantu di sini? Tidak. Orang yang menghasilkan serangan pelangi tertentu akan dapat membuatnya menggunakan satu atau lebih hash.
Dan menggunakan lebih dari satu hash dapat menuntun Anda ke satu masalah: ini seaman hash terlemah yang Anda gunakan. Jika seseorang menemukan tabrakan dalam satu algoritma hash, hash itu yang akan dieksploitasi, pada titik mana pun dari proses iterasi, untuk memecahkan kata sandi. Jadi, Anda tidak mendapatkan apa pun dengan menggunakan lebih banyak algoritma hash, lebih baik memilih hanya satu algo yang bagus. dan gunakan itu. Dan jika Anda pernah mendengar bahwa itu telah rusak, pikirkan bagaimana Anda akan mengubahnya di aplikasi Anda.
Dan mengapa menggunakan bcrypt atau sesuatu seperti itu (Anda mengatakan Anda menggunakannya): karena penyerang harus menghabiskan lebih banyak waktu membuat tabel. Itu sebabnya menggunakan MD5 + tunggu (3 detik) tidak membantu: serangan akan offline, jadi penyerang dapat menghasilkan tabel tanpa (penundaan 3 detik).