it-swarm-id.com

Mengapa menggunakan garam lebih aman?

Menyimpan hash kata sandi pengguna, mis. dalam database, tidak aman karena kata sandi manusia rentan terhadap serangan kamus. Semua orang menyarankan bahwa ini dikurangi melalui penggunaan garam, tetapi garamnya dianggap tidak sensitif dan tidak perlu dilindungi.

Jika penyerang memiliki masalah, bagaimana serangan kamusnya menjadi lebih sulit dari sebelumnya? Apakah tidak memiliki akses ke garam, secara efektif, menghilangkan kegunaannya?

51
Jim

Salt tidak melindungi Anda dari penyerang tunggal yang hanya mengejar satu kata sandi. Seorang penyerang yang hanya ingin menghancurkan satu kata sandi akan menghitung hash(salt + guess) bukannya hash(guess) (jika skema kata sandinya hash(salt+password) ).

Salt membantu jika penyerang ingin memecahkan banyak kata sandi. Ini biasanya terjadi. Terkadang penyerang menyerang situs dan ingin membobol akun di situs itu, akun apa pun. Tanpa garam, sebagian besar pekerjaan penyerang dapat digunakan untuk semua akun, sehingga ia dapat menguji setiap upayanya terhadap semua akun sekaligus. Dengan garam yang dipilih dengan benar (mis. Jika tidak ada dua akun yang memiliki garam yang sama), penyerang harus memulai dari awal untuk setiap kata sandi hash.

Lebih jauh, dalam arti tertentu, semua upaya pemecahan kata sandi berusaha untuk memecahkan semua kata sandi akun sekaligus. Itu karena hash dapat dihitung; yang diperlukan hanyalah seseorang untuk menghasilkan tabel hash - atau lebih efisien, tabel Rainbow - dan pekerjaan awal itu dapat didistribusikan ke banyak penyerang yang dapat menggunakannya pada setiap basis data akun yang menggunakan yang sama algoritma hashing kata sandi. Sekali lagi, garam membuat perhitungan ini tidak berguna.

Serangan kata sandi brute-force dapat diringkas seperti ini:

  1. Buatlah perhitungan apa pun yang dianggap penyerang berguna, seperti membangun tabel Rainbow (yang merupakan cara yang efisien untuk mewakili hash pemetaan pemetaan ke kata sandi umum).
  2. Untuk setiap akun n yang diinginkan penyerang untuk menerobos masuk, dan untuk setiap akun p kata sandi menebak bahwa penyerang termasuk dalam kamusnya, menguji apakah hash(guess[i]) = hashed_password[j].

Dalam pendekatan naif, langkah kedua membutuhkan n × p perhitungan hash untuk mencoba semua tebakan terhadap semua akun. Namun, jika langkah pertama sudah menghitung semua hash yang mungkin, maka langkah kedua tidak memerlukan perhitungan hash sama sekali, hanya menguji apakah masing-masing hashed_password ada dalam database yang dikomputasi, jadi serangan itu membutuhkan pencarian tabel just n (ini bahkan dapat dipercepat, tetapi kami sudah beralih dari n x p perhitungan lambat¹ ke n pencarian tabel).

Jika setiap kata sandi memiliki garam yang berbeda, maka untuk membantu, perhitungan harus memasukkan entri untuk setiap kemungkinan nilai garam. Jika garamnya cukup besar, pra-perhitungan tidak layak. Jika pra-perhitungan tidak memperhitungkan garam, tidak akan berguna untuk mempercepat langkah kedua, karena fungsi hash kriptografi apa pun “ mencampur ”inputnya: mengetahui hash UIOQWHHXpassword tidak membantu menghitung hash NUIASZNApassword. Bahkan untuk menyerang satu akun, penyerang perlu melakukan p perhitungan hash untuk mencoba semua tebakan, sudah merupakan peningkatan pada pencarian tabel tunggal yang akan cukup jika penyerang memiliki kamus yang dikomputasi.

¹ Kata sandi tidak boleh disimpan sebagai hash seperti SHA-1, tetapi menggunakan fungsi hash yang lebih lambat seperti bcrypt atau scrypt atau PBKDF2 .

Saya akan menjelaskan setiap tingkat keamanan untuk basis data yang tersimpan kata sandi, mungkin ini akan membantu memperjelas pentingnya garam.

Level 1 : Kata sandi disimpan dengan jelas dalam database.

Ini hanya kebodohan murni . Tetapi kadang-kadang, perusahaan besar membuat database mereka dikompromikan dan, oh, mengejutkan, semua kata sandi disimpan dengan jelas. Sayang sekali!

Level 2 : Kata sandi disimpan menggunakan algoritma hashing.

Ini adalah langkah menuju keamanan yang lebih. Jika penyerang mendapatkan kata sandi hash, ia masih tidak bisa masuk menggunakan kredensial ini ke layanan. Pertama-tama ia harus "melepaskan" kata sandi menggunakan Rainbow Table atau dengan brute forcing it . Itu berarti penyerang perlu bekerja lebih banyak, tetapi masih mungkin untuk mengambil kata sandi yang asli.

Level 3 : Kata sandi disimpan menggunakan algoritma hashing dengan garam.

Ini mulai menarik. Seperti yang kita lihat pada Level 2, penyerang yang memiliki akses ke kata sandi hash dapat dengan kasar memaksanya atau menggunakan tabel Rainbow. Menambahkan garam ke kata sandi asli membuat tabel pelangi sama sekali tidak berguna karena mereka tidak mempertimbangkan garam. Masih mungkin untuk mendapatkan string asli menggunakan tabel Rainbow, tetapi itu berarti bahwa dalam tabel Rainbow, kata sandi + garam ada. Karena garam pada umumnya sangat panjang, keanehan yang memiliki nilai string (40+) hampir tidak mungkin. Satu-satunya solusi yang tersisa adalah kekerasan.

Level 4 : Kata sandi disimpan menggunakan algoritma hashing dengan garam dan peper.

Ini sangat menarik (itu alasan mengapa saya memposting jawaban saya karena yang sebenarnya sudah menarik).

Saya menyarankan Anda untuk menggunakan algoritma hashing seperti BCrypt, SCrypt atau PBKDF2 karena mereka tidak rusak sejauh ini, dan sangat lambat untuk diretas, menambah waktu untuk memecahkannya, dan kemudian database password yang lengkap.

Perbedaan antara garam dan merica adalah lokasinya. Garam umumnya disimpan dalam database tetapi lada berada dalam kode. Ini mungkin tampak aneh tetapi ide awalnya adalah bahwa sebuah database dapat dikompromikan, tetapi bukan kode, meninggalkan penyerang garam dan daftar kata sandi hash yang tidak berguna. Selain itu, ini menambah kompleksitas pada kata sandi hash, membuat Tabel pelangi sama sekali tidak berguna (jika kita mengira mereka masih sedikit berguna dengan garam!) .

Jika hanya database yang dikompromikan, bahkan kekuatan brute tidak berguna karena penyerang tidak mencari satu nilai (kata sandi asli) tetapi untuk dua nilai (kata sandi asli DAN lada).

16
Cyril N.

Jika hash Anda tidak tawar, saya dapat menghasilkan seluruh kamus hash dan menyimpannya dalam database (jenis khusus yang disebut tabel Rainbow, itu lebih efisien untuk sejumlah besar hash), maka semua yang perlu saya lakukan adalah mencarinya. Pada dasarnya satu memori raksasa vs optimasi waktu CPU. Juga, jika saya melihat dua pengguna dengan hash yang sama, saya tahu mereka menggunakan kata sandi yang sama.

Garam membuat setiap kata sandi pengguna hash unik, dan jika Anda melakukannya dengan benar, kemungkinan besar akan unik bahkan jika mereka menggunakan kata sandi yang sama di beberapa situs lain (tidak jarang), jadi saya benar-benar harus mengambil kata, menerapkan garam dan Hash itu, ulangi untuk entri berikutnya dalam kamus.

8
ewanm89

Hash yang tidak tawar rentan terhadap serangan pencarian. Ada database yang tersedia secara bebas berisi jutaan hash kata sandi (terutama MD5 dan SHA1) yang dapat digunakan untuk mencari plaintext hash. Ini mungkin didasarkan pada database relasional standar, atau pada format database khusus seperti tabel Rainbow.

Jadi, ini sebuah contoh:
7c6a61c68ef8b9b6b061b28c348bc1ed7921cb53 (tanpa garam)
2d67062d67b4d0eaca31a768e901d04982de7352 (asin dengan awalan "RxB6aE")

Pencarian cepat pada hash pertama akan mengungkapkan plaintext menjadi "passw0rd". Namun, yang terakhir sangat tidak mungkin ditemukan. Dalam kasus di mana garam tidak diketahui oleh penyerang, itu membuat kamus dan serangan bruteforce menjadi sulit.

Jika Anda ingin mengamankan kata sandi dalam database, Anda harus menggunakan sesuatu seperti bcrypt. Ini menggunakan sejumlah besar iterasi dari algoritma hash untuk membuat setiap perhitungan lambat. Dengan demikian, serangan bruteforce, serangan kamus dan pembangunan tabel Rainbow sangat tidak mungkin dilakukan.

6
Polynomial