Saya selalu menggunakan string garam per entri yang tepat saat hashing passwords untuk penyimpanan database. Untuk kebutuhan saya, menyimpan garam di DB di sebelah kata sandi hash selalu berfungsi dengan baik.
Namun, beberapa orang merekomendasikan agar garam disimpan secara terpisah dari database. Argumen mereka adalah bahwa jika database dikompromikan, penyerang masih dapat membangun tabel pelangi dengan mempertimbangkan string garam tertentu untuk memecahkan satu akun pada suatu waktu. Jika akun ini memiliki hak admin, maka ia bahkan mungkin tidak perlu memecahkan yang lain.
Dari sudut pandang keamanan, apakah layak menyimpan garam di tempat yang berbeda? Pertimbangkan aplikasi web dengan kode server dan DB pada mesin yang sama. Jika garam disimpan dalam file flat di mesin itu, kemungkinan adalah bahwa jika database dikompromikan, file garam juga akan.
Apakah ada solusi yang disarankan untuk ini?
sumber
Jawaban:
Maksud dari tabel pelangi adalah bahwa mereka dibuat terlebih dahulu dan didistribusikan secara massal untuk menghemat waktu perhitungan bagi orang lain - dibutuhkan waktu yang lama untuk menghasilkan tabel pelangi dengan cepat seperti halnya untuk memecahkan kata sandi + kombinasi garam secara langsung (karena efektif apa yang dilakukan ketika membuat tabel pelangi adalah pra-menjalankan perhitungan untuk memaksa hash), sehingga argumen bahwa dengan mengetahui garam seseorang dapat "menghasilkan tabel pelangi" adalah palsu.
Tidak ada gunanya menyimpan garam dalam file terpisah selama itu berdasarkan per pengguna - titik dari garam hanyalah membuatnya sehingga satu tabel pelangi tidak dapat memecahkan setiap kata sandi dalam DB.
sumber
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.
sumber
Seringkali, mereka diawali dengan hash dan disimpan di bidang yang sama.
Tidak perlu menyimpannya secara terpisah - intinya adalah menggunakan garam acak untuk setiap kata sandi sehingga tabel pelangi tunggal tidak dapat digunakan terhadap seluruh rangkaian hash kata sandi Anda. Dengan garam acak, penyerang harus memaksa setiap hash secara terpisah (atau menghitung tabel pelangi untuk semua kemungkinan garam - jauh lebih banyak pekerjaan).
Jika Anda memiliki lokasi penyimpanan yang lebih aman, masuk akal untuk menyimpan hash di sana.
sumber
Berdasarkan buku Aplikasi Aplikasi Web ASP.NET MVC 4 karya William Penberthy:
sumber
Maksud sebuah garam adalah membuat semua tabel pelangi tidak berguna dan membutuhkan set baru untuk dibuat. Hanya butuh waktu lama untuk menebak seutas tali untuk membuat meja pelangi. Misalnya hash SHA-256 "password" adalah
5e88 4898 da28 0471 51d0 e56f 8dc6 2927 7360 3d0d 6aab bdd6 2a11 ef72 1d15 42d8
. Setelah garam ditambahkan, seperti "badpassword" string baru yang akan di-hash adalah "passwordbadpassword" yang, karena efek longsoran, secara dramatis mengubah output, menjadi457b f8b5 37f1 802e f9c8 2e46 b8d3 f8b5 721b 7cbb d485 f0bb e523 bfbe 73e6 58d6
.Biasanya, garam hanya disimpan dalam basis data yang sama dengan kata sandi, juga karena jika satu basis data diretas, kemungkinan yang lain juga.
sumber