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:
- Baca salt dan work factor dari header.
- Turunkan wrapping key dengan scrypt dan sebuah kandidat passphrase.
- Coba dekripsi file key dengan wrapping key itu.
- 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:
| Metode | Laju tercatat per detik |
|---|---|
| Command age, percobaan dekripsi satu per satu | 2,6 percobaan |
| Kalkulasi scrypt, satu core | 2,7 kalkulasi |
| Kalkulasi scrypt, semua 10 core secara paralel | 8,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:
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.
Menghitung waktu exhaustive search
Exhaustive search mencoba semua kombinasi di sebuah kumpulan. Untuk string acak dengan panjang tetap, jumlah kombinasinya adalah:
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:
| Alfabet | 6 karakter | 8 karakter | 10 karakter | 12 karakter |
|---|---|---|---|---|
| 26 huruf kecil | 1,2 tahun | 807 tahun | 545.526 tahun | 369 juta tahun |
| 26 huruf kecil dan 10 digit | 8,4 tahun | 10.902 tahun | 14,1 juta tahun | 18,3 miliar tahun |
| 52 huruf besar dan kecil serta 10 digit | 219 tahun | 843.754 tahun | 3,24 miliar tahun | 12,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.
| Alfabet | 6 karakter | 8 karakter | 10 karakter | 12 karakter |
|---|---|---|---|---|
| 26 huruf kecil | 3,6 hari | 6,6 tahun | 4.473 tahun | 3,02 juta tahun |
| 26 huruf kecil dan 10 digit | 25,2 hari | 89,4 tahun | 115.857 tahun | 150 juta tahun |
| 52 huruf besar dan kecil serta 10 digit | 1,8 tahun | 6.919 tahun | 26,6 juta tahun | 102 miliar tahun |
Kode Python ini mereproduksi kalkulasinya sebelum pembulatan. Kode ini juga menghitung contoh kata acak di bagian berikutnya.
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 acak | Kombinasi | Pencarian penuh dengan 8,2 percobaan per detik |
|---|---|---|
| 4 | Sekitar 3,66 kuadriliun | Sekitar 14,1 juta tahun |
| 5 | Sekitar 2,84 × 10^19 | Sekitar 110 miliar tahun |
| 6 | Sekitar 2,21 × 10^23 | Sekitar 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.
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.

Memuat komentar...