Let’s say an attacker manages to retrieve a database from a Web application and extracts from it the couple .
LoginPasswordadminazertytotomatrixbillyyep59f$4txwrrtatamatrixtitifreepassattackertesPwndPasswordDalam hal ini, penyerang secara langsung memiliki kata sandi semua pengguna dalam teks biasa. Bahkan Billy yang memiliki password yang kuat pun tidak terlindungi
Menyimpan kata sandi dalam teks biasa BUKAN solusi yang aman. Tidak seorang pun, termasuk administrator situs web/database, harus memiliki akses ke kata sandi teks biasa pengguna
Kata sandi terenkripsi
Dalam beberapa kasus, kata sandi disimpan dalam database setelah dienkripsi oleh algoritme yang dapat dibalik (rot13, enkripsi topeng…). Karena algoritme dapat dibalik, algoritme tersebut tidak mematuhi aturan CNIL (Komisi Nasional Prancis untuk Informatika dan Kebebasan).
Memang, ini merekomendasikan agar kata sandi apa pun diubah oleh fungsi kriptografi yang tidak dapat dibalik. (sumber dalam bahasa Prancis)
Karena penyerang mengetahui kata sandinya dalam bentuk teks biasa/terenkripsi, dia dapat menebak logika enkripsi dan mencoba membalikkannya. Jika dia berhasil, semua kata sandi akan diambil secepat teks biasa, terlepas dari kerumitan algoritme
Fungsi Hash Usang
Dalam banyak kasus, kata sandi disimpan dengan fungsi kriptografi lama yang tidak dapat diubah (md5, sha1…). Misalnya, situs LinkedIn dulu menyimpan sebagian kata sandinya dengan sha1, dan setelah hash bocor pada 2012, hanya butuh tiga hari untuk memulihkan 90% kata sandi. (sumber dalam bahasa Prancis)
Mari kita ambil database berikut (kata sandinya sama dengan sebelumnya)
LoginPassword (md5)adminab4f63f9ac65152575886860dde480a1toto21b72c0b7adc5c7b4a50ffcb90d92dd6billy47ad898a379c3dad10b4812eba843601tata21b72c0b7adc5c7b4a50ffcb90d92dd6titi5b9a8069d33fe9812dc8310ebff0a315Untuk memperhatikan
- Dalam kasus kami, semua kata sandi (kecuali milik Billy) adalah kata sandi yang sangat sering digunakan dan termasuk kata sandi yang paling banyak digunakan (misalnya dalam daftar 10 juta kata sandi-top-1000). txt)
- Menarik juga untuk dicatat bahwa karena hash tidak memiliki gagasan tentang keacakan, toto dan tata berbagi hash yang sama, karena mereka memiliki kata sandi yang sama.
Pencarian sederhana dari hash admin di internet memungkinkan untuk secara langsung mengambil kata sandi mereka
Kecuali untuk pengguna Billy yang memiliki kata sandi rumit, dimungkinkan untuk mengambil semua hash secara langsung dengan kueri di mesin pencari
Jika hash tidak ditemukan langsung di mesin pencari, penyerang memiliki metode lain
Paksaan
Brute force adalah tindakan mencoba semua kemungkinan secara iteratif mengikuti aturan generasi. Ini seperti ketika kita mencoba membuka gembok dengan mendaftar semua kemungkinan dari 0000 hingga 9999 hingga gembok terbuka.
Kamus
Serangan kamus adalah serangan di mana Anda mencoba semua istilah dalam daftar kata. Beberapa jenis kamus dapat dibayangkan
- Kamus bahasa
- Peringkat kata sandi yang paling banyak digunakan
- Daftar yang disesuaikan dengan konteks tertentu
Jika kita mengambil gambar gembok, kita dapat membayangkan daftar yang dikontekstualisasikan seperti ini.
Kita tahu bahwa gembok itu milik "Tutu", bahwa dia menyukai angka 42, dan dia lahir pada tanggal 26 November 2001. Jadi kita dapat berasumsi bahwa gembok mungkin berisi angka 42, 26, 11 dan 01 dan dengan demikian menghasilkan daftar sesuai dengan kriteria ini.
Catatan. Dengan penyalahgunaan bahasa, adalah umum untuk menyebut serangan kamus sebagai serangan brute force.
Meja pelangi
Tabel pelangi adalah subjek yang layak mendapat artikel tersendiri. Dengan cepat, ini adalah struktur data yang memungkinkan pengambilan kata sandi dengan kompromi penyimpanan/waktu yang baik. Struktur ini memiliki daftar hash yang telah dihitung sebelumnya dan memungkinkan untuk mengambil hash dalam waktu yang dapat diterima.
Banyak tabel pelangi tersedia secara online
Tolok Ukur untuk Mengambil Kata Sandi Md5
Tolok ukur dilakukan pada database dengan daftar rockyou yang berisi 14.341.564 kata sandi unik. Benchmark dilakukan pada mesin virtual, yang tidak optimal untuk memecahkan kata sandi
Melihat hasilnya, kami melihat bahwa kecuali kata sandi Billy, yang tidak ada dalam daftar rockyou, ketiga kata sandi telah ditemukan dan hanya 11 detik yang diperlukan perangkat lunak untuk menghitung semua hash yang ada di rockyou
Fungsi hash yang tidak tepat
Setelah melihat contoh buruk sebelumnya, tergoda untuk menggunakan fungsi aman yang tidak dapat diubah seperti sha256, sha512, atau sha3. Namun, tujuan dari fungsi ini digunakan untuk menghitung ringkasan kriptografi untuk memeriksa integritas file, untuk membuat tanda tangan elektronik, atau untuk mengoptimalkan pencarian dan pengindeksan. Mereka tidak cocok untuk menyimpan kata sandi, karena cepat dihitung, seperti yang dibuktikan oleh tolok ukur berikut
LoginPassword (sha512)admindf6b9fb15cfdbb7527be5a8a6e39f39e572c8ddb943fbc79a943438e9d3d85ebfc2ccf9e0eccd9346026c0b6876e0e01556fe56f135582c05fbdbb505d46755atoto11a25e88658143a853d280bf77f81ff391347aaba2db54a3aab0149b265276de419880762a473fc496388bcf70566d7cfd0346c34add40652f8f7b669caf9ec0billyfe9cb9b07725fd1cc3906232405119fedf9a020436630d3c1e0f632f73909e6ed9e731c149ac22743bbe9541881f35ceebf1d2782d469eb3b42968469d55a7a4tata11a25e88658143a853d280bf77f81ff391347aaba2db54a3aab0149b265276de419880762a473fc496388bcf70566d7cfd0346c34add40652f8f7b669caf9ec0titif767036acd951f5ddaf4eed5291c677db060055806dbcae69ca35d95847559dc8abce5011fd2b50833e760eca2d84d6daf1f078200f42b4fc10b58bad3761c88Di sini sekali lagi, kecuali untuk pengguna Billy, semua kata sandi telah diambil dan hanya diperlukan 16 detik bagi hashcat untuk menyelesaikan operasinya
Meningkatkan SHA512
Meskipun telah dikatakan sebelumnya bahwa fungsi SHA512 tidak dioptimalkan untuk penyimpanan kata sandi, mungkin menarik untuk menunjukkan cara mengoptimalkannya untuk memahami kepentingan fungsi hash yang sesuai untuk kata sandi
Penggunaan Garam
Garam adalah polutan untuk data mentah (di sini kata sandinya) yang memungkinkan menghasilkan dua hash berbeda dari data yang sama. Garam itu unik untuk setiap pengguna dan terdiri dari urutan acak. Ini meningkatkan kemungkinan kata sandi unik dan karena itu kemungkinan hash tidak pernah digunakan.
Misalnya, dengan garam, toto dan tata tidak akan memiliki hash yang sama di database
Manfaat garam sangat banyak
- Hampir tidak mungkin menemukan hash langsung di internet jika diasinkan. Namun, garamnya harus cukup panjang dan acak
- Tabel pelangi tidak berfungsi dengan hash asin
- Seperti yang dikatakan sebelumnya, dua pengguna dengan kata sandi yang sama tidak akan memiliki hash yang sama jika garam digunakan. Perangkat lunak peretas kata sandi (hashcat, Johntheripper…), setelah memecahkan hash, lihat apakah itu tidak ada untuk pengguna lain. Oleh karena itu, tanpa garam, setelah ditemukan kata sandi toto, kata sandi tata langsung ditemukan. Namun, dengan garam, perangkat lunak harus dimulai lagi dari awal untuk setiap pengguna.
Patokan dengan garam
UserSaltHash sha512 with saltadminBGdd6d6^ZgvkMhKf@W3RqT7509d123bce1aa92331861cf8fd738a58205045123f0e25f0862477cb19d3ee0757cd99865c30b123ad1e7f1be1e31a6058090458cb9941031f5c36683c8446etotoHZBD^@gL*wvoExo6yJ7hVB6b28830776de6ad7ef1dd8c221e0d53fec4532c623075d0216d937ab82ab284a56a461ce5d4ec77d1783665a262a6a1eb98627b1f6260da55dbb782d7cb75bc4billywvVndjwcZJy. dwT4fBD@U^2847b2605f6a1cd88399e6c9784c0e583799be9485cb128fe5f541f43636559067ec32de33e9b3fa2c15b15eec294cf262fd7aab2395dd64d6dbd9640b4fe6fdtataQeNWm9NXqJ8m@m2^F7Kh9*165bc06b69fa2bfcd893bfde86358394406c87c7f7abba891cd10ed9fac887c54d52ed14310ad675078033e9bca80084d345fb2836933e55c60f734982430e2btitiiQUemgw9M6Gw*&v6RG%MZ#f8eded6c815c7522ab6197aa319d3ff4cddc2c7eeffa0f91c1291603f807a47f320324d2ce2fed1fb3cbfe19524fc5d9c105093f755d76a949efb212fb85c942Dengan konfigurasi ini, perangkat lunak hashcat memerlukan waktu 33 detik untuk memulihkan kata sandi. Tak satu pun dari hash dalam database diindeks oleh mesin pencari
Penggunaan Lada
Lada juga merupakan polutan, tetapi umum untuk semua pengguna. Itu tidak disimpan dalam database, tetapi dalam sumber aplikasi, dalam file konfigurasi atau dalam variabel lingkungan. Penyerang yang "baru" memahami database harus menebak lada atau mengambilnya dengan cara lain agar dapat memecahkan hash secara efektif
Meningkatkan Jumlah Iterasi
Cara lain untuk meningkatkan keamanan adalah dengan mengulang jumlah iterasi hash. Meningkatkan jumlah iterasi berarti kita akan melakukan hash kata sandi beberapa kali. Misalnya, dengan sha512 kita memiliki loop berikut
As long as iteration is greater than 0
hash = sha512(hash)
Decrement iteration
Untuk pengguna yang login, perhitungan hash akan lebih lama (masih butuh milidetik). Tetapi jika pengguna kehilangan beberapa milidetik untuk masuk, penyerang akan kehilangan lebih banyak waktu, karena penyerang akan kehilangan beberapa milidetik per percobaan, dan karena penyerang melakukan jutaan percobaan, ini akan menghasilkan jam/hari tambahan untuk mengambil kata sandi
Menggabungkan 3 Metode
Kami dapat menggabungkan tiga metode (garam, merica, dan jumlah iterasi) untuk memiliki satu metode untuk menyimpan kata sandi lebih aman daripada hash sederhana
Function calculation_hash(password,salt,pepper,iteration)
Inputs
password is the user's password in plain text
salt is the unique salt per user and is randomly generated
pepper is the common pepper for all users and is randomly generated.
iteration is the number of iterations
Output:
The password hash
Hash = sha512(salt+password+pepper)
As long as iteration is greater than 0
hash = sha512(hash)
Decrement iteration
return hash_
Kemudian, untuk memeriksa kata sandi saat masuk, panggil saja fungsi yang sama dengan kata sandi yang dimasukkan oleh pengguna dan bandingkan dengan hash di database. Jika keduanya identik, maka login berhasil
Menggunakan Fungsi Tertentu
Sebelumnya, kami berhasil membuat algoritme penghasil hash yang lebih tahan terhadap perangkat lunak pembobol kata sandi. Namun, fungsi sudah ada dan terbukti efektif dari waktu ke waktu. Oleh karena itu, tidak ada gunanya menemukan kembali roda dan berisiko menyebabkan kesalahan. Di antara berbagai fungsi ini, kita dapat menemukan. Argon2, scrypt, PBKDF2, bcrypt…
Fungsi-fungsi ini memiliki banyak kekuatan
- Lebih lambat menghitung
- Lebih intensif RAM (yang merupakan titik lemah GPU)
- Mendefinisikan jumlah iterasi dari fungsi kriptografi yang digunakan. Seperti yang terlihat sebelumnya, semakin banyak iterasi, semakin mahal perhitungannya
Bcrypt
bcrypt adalah fungsi hash yang dibuat oleh Niels Provos dan David Mazières. Ini didasarkan pada algoritma enkripsi Blowfish dan dipresentasikan di USENIX pada tahun 1999.
Di antara poin-poin positif selain yang disebutkan di atas kami menemukan implementasi dalam banyak bahasa. Selain itu, sejak algoritme ini berasal dari tahun 1999, algoritme ini telah menunjukkan ketahanannya dari waktu ke waktu, di mana beberapa algoritme seperti Argon2(i) hanya ada sejak 2015
Hash yang dihitung oleh bcrypt memiliki bentuk yang telah ditentukan sebelumnya
$2y$11$SXAXZyioy60hbnymeoJ9. ulscXwUFMhbvLaTxAt729tGusw. 5AG4C
- Algoritma. Yang ini dapat mengambil beberapa versi tergantung pada versi bcrypt ($2$, $2a$, $2x$, $2y$ dan $2b$)
- Biaya. Jumlah iterasi dalam pangkat 2. Misal disini, iterasinya adalah 11, algoritme akan melakukan 211 iterasi (2048 iterasi)
- Garam. Alih-alih menyimpan garam di kolom khusus, garam langsung disimpan di hash akhir
- Kata sandi hash
Karena bcrypt menyimpan jumlah iterasi, ini menjadikannya fungsi adaptif, karena jumlah iterasi dapat ditingkatkan dan oleh karena itu semakin lama semakin lama. Hal ini memungkinkannya, terlepas dari usianya dan evolusi daya komputasinya, untuk tetap kuat melawan serangan brute force. Tolok ukur berikut menunjukkan bahwa dibutuhkan 23 hari bagi hashcat untuk menghitung totalitas hash rockyou
Sangat menarik untuk dicatat bahwa kata sandi azerty dan matriks, kata sandi yang sangat lemah dan ada di bagian atas daftar, ditemukan dalam waktu singkat (2 jam) perangkat lunak bekerja dalam contoh
Kesimpulan
Kita telah melihat di artikel ini kegunaan fungsi hash yang kuat dan keuntungan menggunakan fungsi yang sudah ada. Selain itu, masalah penyimpanan kata sandi memiliki masalah hukum selain masalah keamanan
Akhirnya, menarik untuk dicatat bahwa dalam semua kasus kata sandi azerty dan matrix ditemukan dengan cepat, sedangkan kata sandi yep59f$4txwrr tidak pernah ditemukan. Memang, karena yang ini tidak ada dalam daftar apa pun, satu-satunya cara untuk menemukannya adalah dengan melakukan kekerasan menyeluruh pada 13 karakter, yang merupakan operasi yang sangat memakan waktu (karena banyaknya kemungkinan kata sandi). Ini juga menunjukkan betapa pentingnya bagi aplikasi web untuk memaksakan kebijakan kata sandi yang kuat.