Kembali ke jurnalCATATAN FAJAR
Cryptography7 menit baca

[Crypto: age] Berapa Lama Serangan Passphrase Berlangsung?

Hitung waktu serangan passphrase age, pahami asumsinya, dan lihat kenapa pemilihan acak lebih penting daripada panjang password aja.

BAGIAN 6 DARI 6Crypto: age
  1. 01[Crypto: age] Dari Password ke Ciphertext
  2. 02[Crypto: age] Membaca Header
  3. 03[Crypto: age] scrypt, Dari Password ke Key
  4. 04[Crypto: age] ChaCha20-Poly1305, Menyegel Isi File
  5. 05[Crypto: age] Passphrase atau Key Pair
  6. 06[Crypto: age] Berapa Lama Serangan Passphrase Berlangsung?Kamu di sini
Di artikel ini 7 bagian

Penyerang yang punya salinan file age bisa mencoba passphrase di komputernya sendiri. Nggak ada server yang membatasi jumlah percobaan. Waktunya tergantung pada laju percobaan dan seberapa awal penyerang mencoba passphrase yang benar.

Post scrypt memberikan biaya satu kalkulasi. Post terakhir ini memakai hasil pengukuran yang tercatat untuk menghitung contoh waktu serangan. Kalkulasi-kalkulasi ini adalah estimasi dengan asumsi yang disebutkan, bukan tanggal kedaluwarsa password.

Apa yang dilakukan satu percobaan

Di seri ini, tebakan artinya satu kandidat passphrase. Brute force attack mencoba setiap kandidat di sebuah kumpulan yang terdefinisi. Dictionary attack mencoba kandidat yang paling mungkin, misalnya password yang umum, lebih dulu.

Penyerang bisa memakai prosedur ini untuk file age dengan passphrase:

  1. Baca salt dan work factor dari header.
  2. Turunkan wrapping key dengan scrypt dan sebuah kandidat passphrase.
  3. Coba dekripsi file key dengan wrapping key itu.
  4. Uji authentication tag pada file key terenkripsi.

Kandidat yang salah gagal di file key. Penyerang nggak perlu mendekripsi seluruh payload untuk setiap percobaan. Post cipher menunjukkan pengecekan autentikasi ini.

Benchmark scrypt yang generik mengukur bagian yang mahal dari percobaan itu. Benchmark itu nggak mengukur proses dekripsi age secara lengkap. Dukungan untuk format age di tool serangan tertentu adalah pertanyaan yang terpisah.

Hasil pengukuran yang tercatat di laptop

Pengukuran awal memakai Apple M5 dengan 10 core dan work factor 18. Core adalah unit prosesor yang mengeksekusi instruksi program. Tes paralel menjalankan beberapa operasi dalam waktu bersamaan.

Laju yang tercatat adalah:

MetodeLaju tercatat per detik
Command age, percobaan dekripsi satu per satu2,6 percobaan
Kalkulasi scrypt, satu core2,7 kalkulasi
Kalkulasi scrypt, semua 10 core secara paralel8,2 kalkulasi

Ini adalah hasil pengukuran yang tercatat untuk artikel awal. Seri ini menyertakan kode untuk pengukuran scrypt sekuensial. Seri ini nggak menyertakan program tes paralel awal atau catatan timing mentahnya.

Tabel di bawah memakai 8,2 percobaan per detik sebagai contoh laju berdasarkan hasil scrypt paralel. Tabel-tabel itu nggak menetapkan performa implementasi serangan yang dioptimasi.

Laju paralelnya sekitar tiga kali laju sekuensial di hasil-hasil itu. Observasi itu sendiri nggak membuktikan adanya batasan memory bandwidth. Scheduling, akses memory, dan detail implementasi bisa memengaruhi hasilnya.

Apa yang ditunjukkan oleh kebutuhan memory

Dengan parameter contoh, area memory utama scrypt sekitar 256 MiB untuk setiap percobaan. Sepuluh kalkulasi dalam waktu bersamaan memakai sekitar 2,5 GiB, ditambah memory program lain.

Graphics processing unit, atau GPU, bisa melakukan banyak kalkulasi secara paralel. Memory yang tersedia di GPU tetap membatasi berapa banyak kalkulasi scrypt yang muat sekaligus.

Untuk sebuah perangkat hipotetis dengan memory 24 GiB yang bisa dipakai:

text
24 GiB = 24576 MiB
24576 MiB / 256 MiB per calculation = 96 calculations

Kapasitas memory ini memberikan maksimal 96 kalkulasi dalam waktu bersamaan, sebelum alokasi memory lain. Ini bukan laju 96 percobaan per detik. Waktu untuk setiap kalkulasi juga dibutuhkan untuk menghitung laju.

Hasil pengukuran yang tercatat nggak mencakup benchmark GPU. Kalkulasi memory ini nggak membuktikan bahwa GPU nggak memberikan keuntungan. Implementasi yang lebih cepat, hardware yang lebih banyak, atau tradeoff memory yang berbeda bisa mengubah hasilnya.

Exhaustive search mencoba semua kombinasi di sebuah kumpulan. Untuk string acak dengan panjang tetap, jumlah kombinasinya adalah:

text
combinations = alphabet size raised to the power of string length
full search time = combinations / attempts per second

Sebagai contoh, alfabet dengan 26 huruf kecil dan panjang 6 menghasilkan 308.915.776 kombinasi. Dengan 8,2 percobaan per detik, pencarian penuh butuh sekitar 1,2 tahun.

Tabel-tabel ini memakai asumsi berikut:

  • Setiap karakter berasal dari pemilihan acak yang independen.
  • Setiap karakter di alfabet yang disebutkan punya probabilitas yang sama.
  • Penyerang tahu alfabet dan panjang pastinya.
  • Laju serangan tetap konstan, tanpa kandidat yang diulang.
  • Satu tahun adalah 365,25 hari.

Setiap sel memberikan waktu untuk seluruh kumpulan. Dengan asumsi ini, rata-rata waktu untuk mencapai kandidat yang benar kira-kira setengah dari nilai itu. Percobaan pertama yang berhasil tetap mungkin terjadi.

Dengan contoh laju 8,2 percobaan per detik:

Alfabet6 karakter8 karakter10 karakter12 karakter
26 huruf kecil1,2 tahun807 tahun545.526 tahun369 juta tahun
26 huruf kecil dan 10 digit8,4 tahun10.902 tahun14,1 juta tahun18,3 miliar tahun
52 huruf besar dan kecil serta 10 digit219 tahun843.754 tahun3,24 miliar tahun12,5 triliun tahun

Tabel kedua memakai laju hipotetis 1.000 percobaan per detik. Laju ini sekitar 122 kali lebih cepat. Ini asumsi, bukan benchmark age yang diukur.

Alfabet6 karakter8 karakter10 karakter12 karakter
26 huruf kecil3,6 hari6,6 tahun4.473 tahun3,02 juta tahun
26 huruf kecil dan 10 digit25,2 hari89,4 tahun115.857 tahun150 juta tahun
52 huruf besar dan kecil serta 10 digit1,8 tahun6.919 tahun26,6 juta tahun102 miliar tahun

Kode Python ini mereproduksi kalkulasinya sebelum pembulatan. Kode ini juga menghitung contoh kata acak di bagian berikutnya.

python
seconds_per_year = 365.25 * 24 * 60 * 60

for rate in (8.2, 1000):
    print(f"\nAttempts per second: {rate}")
    for alphabet_size in (26, 36, 62):
        for length in (6, 8, 10, 12):
            combinations = alphabet_size ** length
            seconds = combinations / rate
            years = seconds / seconds_per_year
            print(alphabet_size, length, f"{years:.3g} years")

for word_count in (4, 5, 6):
    combinations = 7776 ** word_count
    years = combinations / 8.2 / seconds_per_year
    print(word_count, f"{combinations:.3g} combinations", f"{years:.3g} years")

Kenapa password yang umum nggak cocok dengan tabel-tabel itu

Orang sering memilih nama, tanggal, atau kata yang familier. Penyerang bisa mencoba pilihan-pilihan itu sebelum string lain yang nggak berhubungan dengan panjang yang sama. Jadi, kumpulan karakter penuh adalah model yang salah untuk password itu.

Dengan 8,2 percobaan per detik, daftar berisi satu juta kandidat butuh sekitar 33,9 jam untuk selesai. Kalau kandidat yang benar ada di dekat awal daftar, serangannya selesai jauh lebih cepat.

Password seperti password1 dan summer2026 mengikuti pola yang familier. Panjangnya nggak membenarkan estimasi string acak di atas. scrypt menambahkan biaya ke setiap percobaan, tapi nggak mengubah urutan penyerang mencoba kandidat.

Kata acak menambah jumlah kombinasi

Passphrase bisa memakai kata-kata dari sebuah daftar. Untuk kalkulasi di bawah, daftarnya berisi 7.776 kata. Setiap kata harus berasal dari pemilihan acak yang independen, dengan probabilitas yang sama untuk setiap kata.

Empat kata seperti itu menghasilkan 7776^4 kombinasi, atau sekitar 3,66 kuadriliun. Estimasi ini berasumsi penyerang tahu daftarnya, jumlah katanya, dan separator-nya.

Jumlah kata acakKombinasiPencarian penuh dengan 8,2 percobaan per detik
4Sekitar 3,66 kuadriliunSekitar 14,1 juta tahun
5Sekitar 2,84 × 10^19Sekitar 110 miliar tahun
6Sekitar 2,21 × 10^23Sekitar 854 triliun tahun

Dalam notasi ilmiah, 2.84 × 10^19 artinya 2,84 dikali 10 pangkat 19. Notasi ini bikin angka yang sangat besar tetap mudah dibaca.

Kata-kata yang membentuk kutipan favorit atau kalimat yang kamu karang sendiri nggak memenuhi asumsi pemilihan acak. Menambah kata cuma membantu sesuai jumlah pilihan yang ditambahkan oleh kata-kata itu. Passphrase yang pendek nggak otomatis lebih kuat daripada password yang panjang.

Metode dadu EFF memberikan prosedur untuk pemilihan kata acak dan merekomendasikan enam kata. Baris empat kata di atas adalah contoh kalkulasi, bukan rekomendasi itu.

Pilih metode yang bisa kamu jaga keamanannya

Post key pair menunjukkan enkripsi tanpa passphrase buatan manusia. Di jalur itu, recipient harus menjaga secret key tetap privat dan tersedia untuk dekripsi.

Untuk enkripsi passphrase, age bisa meng-generate passphrase acak di prompt-nya. Password manager bisa menyimpannya. Pembaca nggak perlu menghafal frasa yang mudah ditebak supaya dekripsi jadi praktis.

mermaid
graph TD
    A["Who must encrypt the file?"] --> B{"A script or another person?"}
    B -->|Yes| C["Consider a public key recipient"]
    C --> D["Keep a secure backup of the secret key"]
    B -->|No| E["A random passphrase is an option"]
    E --> F["Store the passphrase securely"]

Saya lebih percaya pada passphrase yang bisa saya ukur daripada passphrase yang saya harap kuat. Ukuran yang berguna adalah cara passphrase itu dipilih, bersama dengan model serangan yang eksplisit. Tabel-tabel itu nggak bisa memprediksi umur satu password tertentu.

TOPIK

MAKASIH UDAH BACA

Gimana menurutmu?

Reaksi atau obrolan, dua-duanya selalu ditunggu.

Memuat reaksi…

Bagikan

Memuat komentar...

LANJUT JELAJAH

Satu pikiran bawa ke pikiran lain.

Semua tulisan
Kembali ke semua tulisanSatu catatan, pelan-pelan.