Saya selalu penasaran ... Mana yang lebih baik ketika memberi salin kata sandi untuk hashing: awalan, atau postfix? Mengapa? Atau apakah itu penting, asalkan Anda asin?
Untuk menjelaskan: Kita semua (semoga) tahu sekarang bahwa kita harus memberi garam kata sandi sebelum kita hash untuk penyimpanan dalam database [ Sunting: Jadi Anda dapat menghindari hal-hal seperti apa yang terjadi pada Jeff Atwood baru-baru ini ]. Biasanya ini dilakukan dengan menggabungkan garam dengan kata sandi sebelum meneruskannya melalui algoritma hashing. Tetapi contohnya bervariasi ... Beberapa contoh menambahkan garam sebelum kata sandi. Beberapa contoh menambahkan garam setelah kata sandi. Saya bahkan melihat beberapa yang mencoba untuk meletakkan garam di tengah.
Jadi metode mana yang lebih baik, dan mengapa? Apakah ada metode yang mengurangi kemungkinan tabrakan hash? Googling saya belum menemukan analisis yang layak tentang masalah ini.
Sunting: Jawaban yang bagus, teman-teman! Maaf saya hanya bisa memilih satu jawaban. :)
sumber
Jawaban:
Awalan atau akhiran tidak relevan, ini hanya tentang menambahkan beberapa entropi dan panjang kata sandi.
Anda harus mempertimbangkan tiga hal berikut:
Ada jawaban yang sangat baik oleh Dave Sherohman untuk pertanyaan lain mengapa Anda harus menggunakan garam yang dihasilkan secara acak alih-alih nama pengguna (atau data pribadi lainnya). Jika Anda mengikuti saran itu, tidak masalah di mana Anda memasukkan garam.
sumber
Saya pikir itu semua semantik. Menempatkannya sebelum atau sesudah tidak masalah kecuali terhadap model ancaman yang sangat spesifik.
Fakta bahwa itu ada di sana seharusnya mengalahkan tabel pelangi.
Model ancaman yang saya singgung adalah skenario di mana musuh dapat memiliki tabel pelangi dari garam biasa yang ditambahkan / ditambahkan ke kata sandi. (Katakan NSA) Anda menduga mereka telah menambahkan atau menambahkan tetapi tidak keduanya. Itu konyol, dan itu dugaan yang buruk.
Akan lebih baik untuk berasumsi bahwa mereka memiliki kapasitas untuk menyimpan tabel pelangi ini, tetapi tidak, katakanlah, tabel dengan garam aneh diselingi di tengah kata sandi. Dalam bahwa kasus sempit, saya akan menduga bahwa diselingi akan menjadi yang terbaik.
Seperti yang saya katakan. Itu semantik. Pilih garam berbeda per kata sandi, garam panjang, dan sertakan karakter aneh di dalamnya seperti simbol dan kode ASCII: © ¤¡
sumber
Jawaban sebenarnya, yang tampaknya tidak disentuh oleh siapa pun, adalah bahwa keduanya salah . Jika Anda menerapkan crypto Anda sendiri, tidak peduli seberapa sepele bagian yang Anda pikir Anda lakukan, Anda akan membuat kesalahan.
HMAC adalah pendekatan yang lebih baik, tetapi bahkan jika Anda menggunakan sesuatu seperti SHA-1, Anda sudah memilih algoritma yang tidak cocok untuk hashing kata sandi karena desainnya untuk kecepatan. Gunakan sesuatu seperti bcrypt atau mungkin scrypt dan singkirkan masalah sepenuhnya dari tangan Anda.
Oh, dan bahkan tidak berpikir tentang membandingkan hash yang dihasilkan untuk kesetaraan dengan bahasa pemrograman Anda atau utilitas perbandingan string basis data. Mereka membandingkan karakter dengan karakter dan hubungan pendek seolah-
false
olah karakter berbeda. Jadi sekarang penyerang dapat menggunakan metode statistik untuk mencoba dan mencari tahu apa hash itu, sebuah karakter sekaligus.sumber
Seharusnya tidak ada bedanya. Hash tidak akan lagi mudah ditebak di mana pun Anda meletakkan garam. Tabrakan hash jarang terjadi dan tidak dapat diprediksi, berdasarkan sengaja non-linear. Jika itu membuat perbedaan pada keamanan, itu akan menyarankan masalah dengan hashing, bukan pengasinan.
sumber
Jika menggunakan hash yang aman secara kriptografis, itu tidak masalah apakah Anda melakukan pre atau postfix; titik hashing adalah bahwa perubahan bit tunggal dalam data sumber (di mana pun) harus menghasilkan hash yang berbeda.
Namun yang penting adalah menggunakan garam panjang, menghasilkannya dengan PRNG kriptografi yang tepat, dan memiliki garam per pengguna. Menyimpan garam per-user dalam database Anda tidak masalah keamanan, menggunakan hash situs-lebar adalah .
sumber
Pertama-tama, istilah "meja pelangi" secara konsisten disalahgunakan. Tabel "pelangi" hanyalah jenis tabel pencarian tertentu, yang memungkinkan jenis kompresi data tertentu pada tombol. Dengan memperdagangkan komputasi untuk ruang, tabel pencarian yang membutuhkan 1.000 TB dapat dikompresi ribuan kali sehingga dapat disimpan pada drive drive yang lebih kecil.
Anda harus khawatir tentang tabel pencarian hash ke kata sandi, pelangi atau sebaliknya.
@ onebyone.livejournal.com:
Untuk fungsi hash sederhana yang memindai secara linear melalui string input, seperti generator kongruensier sederhana, ini adalah serangan praktis. Tetapi fungsi hash yang aman secara kriptografis sengaja dirancang untuk memiliki beberapa putaran, yang masing-masing menggunakan semua bit dari string input, sehingga menghitung keadaan internal sesaat sebelum penambahan garam tidak berarti setelah putaran pertama. Sebagai contoh, SHA-1 memiliki 80 putaran.
Selain itu algoritma hashing kata sandi seperti PBKDF menyusun fungsi hash mereka beberapa kali (disarankan untuk mengulangi PBKDF-2 minimal 1000 kali, setiap iterasi menerapkan SHA-1 dua kali) membuat serangan ini dua kali lipat tidak praktis.
sumber
BCrypt hash jika platform memiliki penyedia. Saya suka bagaimana Anda tidak khawatir tentang membuat garam dan Anda bisa membuatnya lebih kuat jika Anda mau.
sumber
Memasukkan garam jumlah karakter yang sewenang-wenang ke dalam kata sandi adalah kasus yang paling tidak diharapkan, dan karena itu yang paling "aman" secara sosial, tapi itu benar-benar tidak terlalu signifikan dalam kasus umum selama Anda menggunakan kata sandi yang panjang dan unik per kata sandi string untuk garam.
sumber