Saya akan memberikan pandangan yang sedikit berbeda tentang ini.
Saya selalu menyimpan garam yang dicampur dengan hash-password asin.
Sebagai contoh, saya akan meletakkan bagian pertama dari garam sebelum kata sandi asin, dan bagian terakhir dari garam setelah kata sandi asin. Aplikasi ini menyadari desain ini sehingga dapat mengambil data ini, dan mendapatkan garam dan hash kata sandi asin.
Alasan saya untuk pendekatan ini:
Jika kata sandi / hash data dikompromikan dan jatuh ke tangan seorang penyerang, penyerang tidak akan tahu apa garamnya dari melihat data. Dengan cara ini penyerang tidak bisa secara praktis melakukan serangan brute-force untuk mendapatkan kata sandi yang cocok dengan hash, karena ia tidak tahu hash untuk memulai dan tidak memiliki cara untuk mengetahui bagian mana dari data yang merupakan bagian dari garam, atau bagian dari hash kata sandi asin ( kecuali dia tahu logika otentikasi aplikasi Anda ).
Jika hash kata sandi asin disimpan apa adanya, maka serangan brute-force dapat dilakukan untuk mendapatkan kata sandi yang ketika asin dan hash menghasilkan data yang sama dengan hash kata sandi asin.
Namun, misalnya, bahkan jika hash kata sandi asin disimpan apa adanya, tetapi ditangguhkan dengan byte acak tunggal, selama penyerang tidak menyadari bahwa byte pertama ini harus dibuang, ini juga akan meningkatkan kesulitan serangan. Aplikasi Anda akan tahu untuk membuang byte pertama data saat digunakan untuk mengautentikasi pengguna Anda.
Kesimpulan untuk ini ..
1) Jangan pernah menyimpan data yang digunakan aplikasi otentikasi Anda dalam bentuk persisnya.
2) Jika memungkinkan, jaga kerahasiaan logika otentikasi Anda untuk keamanan tambahan.
Selangkah lebih maju ..
Jika Anda tidak dapat merahasiakan logika otentikasi aplikasi Anda - banyak orang tahu bagaimana data Anda disimpan dalam database. Dan misalkan Anda telah memutuskan untuk menyimpan hash kata sandi asin yang dicampur bersama dengan garam, dengan sebagian garam mendahului hash kata sandi asin, dan sisa garam menambahkannya.
Saat membuat garam acak, Anda juga bisa secara acak menentukan proporsi garam yang akan Anda simpan sebelum / setelah hash kata sandi asin.
Misalnya, Anda menghasilkan garam acak sebesar 512 byte. Anda menambahkan garam ke kata sandi Anda, dan mendapatkan hash SHA-512 dari kata sandi asin Anda. Anda juga menghasilkan bilangan bulat acak 200. Anda kemudian menyimpan 200 byte pertama dari garam, diikuti oleh hash kata sandi asin, diikuti oleh sisa garam.
Saat mengautentikasi input kata sandi pengguna, aplikasi Anda akan melewati string, dan menganggap 1 byte pertama dari data adalah 1 byte pertama dari garam, diikuti oleh hash asin. Pass ini akan gagal. Aplikasi akan melanjutkan dengan menggunakan 2 byte pertama dari data sebagai 2 byte pertama dari garam, dan ulangi sampai hasil positif ditemukan setelah menggunakan 200 byte pertama sebagai 200 byte pertama dari garam. Jika kata sandi salah, aplikasi akan terus mencoba semua permutasi sampai tidak ada yang ditemukan.
Kelebihan dari pendekatan ini:
Keamanan yang ditingkatkan - bahkan jika logika otentikasi Anda diketahui, logika yang tepat tidak diketahui pada saat kompilasi. Praktis mustahil untuk melakukan serangan brute-force, bahkan dengan pengetahuan tentang logika yang tepat. Peningkatan panjang garam akan meningkatkan keamanan lebih lanjut.
Kontra dari pendekatan ini:
Karena logika yang tepat disimpulkan pada saat run-time, pendekatan ini sangat intensif CPU. Semakin lama panjang garam, semakin intensif pendekatan CPU ini.
Otentikasi kata sandi yang salah akan melibatkan biaya CPU tertinggi. Ini bisa menjadi kontra-produktif untuk permintaan yang sah, tetapi meningkatkan keamanan terhadap penyerang.
Pendekatan ini dapat diimplementasikan dengan berbagai cara, dan dapat dibuat lebih aman dengan menggunakan garam lebar variabel dan / atau hash kata sandi asin.