Situs yang benar tidak tahu kata sandimu. Bukan tak mau: memang tak bisa.
Kedengarannya seperti akal-akalan, karena setiap kali kamu mengetiknya sistem mempersilakan kamu masuk, dan untuk mempersilakan masuk ia harus memeriksa sesuatu. Tapi memeriksa bukan mengetahui. Server menyimpan sidik jari yang dihitung dari kata sandimu; saat kamu mengetik, ia menghitung ulang sidik jari itu lalu membandingkan. Kalau cocok, silakan lewat. Tak sekali pun kata sandinya perlu tertulis di mana pun.
Dari sana lahir tanda paling jelas untuk membedakan layanan yang serius dari yang tidak: kalau saat lupa kata sandi mereka mengirimkannya kembali lewat surel, berarti mereka menyimpannya. Dan apa yang disimpan, cepat atau lambat, akan berakhir di tangan orang lain.
1979 gagasan untuk tidak menyimpannya — dan gagasan untuk melakukannya dengan lambat
Pada 1979, Robert Morris dan Ken Thompson menerbitkan di Communications of the ACM artikel “Password Security: A Case History”, yang menceritakan apa yang mereka kerjakan di Unix. Itu laporan tentang apa yang mereka pelajari, dan di dalamnya tertanam dua gagasan yang hari ini kita anggap sudah jelas dengan sendirinya.
Yang pertama bukan temuan mereka — menyimpan hash alih-alih kata sandi sudah dilakukan sebelumnya — tapi mereka menjelaskannya lebih baik dari siapa pun: jangan simpan kata sandinya, simpan hash-nya. Sebuah fungsi yang mengubah kata sandimu menjadi nilai yang tampak sembarang dan yang tak bisa dijalankan mundur: dari hash orang tidak kembali ke kata sandi.
Yang kedua memang milik mereka: garam. Sebuah nilai acak yang berbeda untuk setiap pengguna, dicampurkan ke kata sandi sebelum hash dihitung. Tanpa garam, dua orang dengan kata sandi sama punya hash sama — berkas yang dicuri berubah menjadi permainan mencari yang kembar — dan, lebih buruk lagi, seseorang bisa menghitung satu tabel raksasa sekali saja lalu memakainya melawan semua basis data di dunia. Garam tidak membuat kata sandimu lebih sulit ditebak: garam membuat tebakan itu tak berguna bagi orang lain.
Tapi di artikel yang sama ada gagasan ketiga, jauh lebih jarang dikutip, dan justru itulah yang penting di sini: mereka membuat fungsinya lambat dengan sengaja. Bukan karena lalai. Memang disengaja. Meng-enkripsi sebuah kata sandi memakan biaya jauh lebih besar daripada yang secara teknis diperlukan, karena orang yang masuk sekali setiap pagi tidak peduli, sedangkan orang yang mencoba jutaan kandidat sangat peduli.
Seluruh persoalannya sudah ada di sana, dalam satu kalimat dari hampir lima puluh tahun lalu.
Mengapa kelambatan adalah satu-satunya pertahanan yang jujur
Hampir semua pertahanan di dunia komputer bersifat asimetris: murah bagi yang bertahan, mahal bagi yang menyerang. Mengenkripsi itu murah; mendekripsi tanpa kunci itu mustahil. Yang bertahan main dengan keunggulan bawaan.
Penyimpanan kata sandi tidak begitu. Di sini yang bertahan dan yang menyerang menjalankan fungsi yang persis sama. Kamu menghitung hash untuk memeriksa apakah kamu benar; dia menghitungnya untuk memeriksa apakah dia benar. Inilah satu-satunya lomba dalam keamanan di mana keduanya berlari dengan kaki yang sama.
Kalau kamu tak bisa lari lebih cepat dari lawanmu, tinggal satu langkah: membuat lintasannya mahal untuk kalian berdua. Kamu membayar ongkos itu sekali per masuk. Dia, sekali per percobaan. Karena dia butuh percobaan yang berlipat-lipat orde besaran dibanding kamu, tagihan yang sama menghantam kalian dengan cara yang tak sebanding. Itulah yang dilakukan sebuah hash kata sandi.
Karena itu fungsi-fungsi cepat yang luar biasa bagus untuk hal lain — SHA-256, misalnya — adalah pilihan yang payah di sini. Mereka cepat. Cepat justru persis yang tidak kita inginkan.
1999 bcrypt, dan biaya sebagai bagian yang bisa disetel
Masalah dari fungsi yang lambat adalah perangkat keras tidak diam di tempat. Yang pada 1979 lambat, kemudian menjadi seketika. Pertahanan yang dikalibrasi terhadap komputer satu dekade menua sendiri, tanpa ada yang menyentuhnya.
Pada 1999, Niels Provos dan David Mazières memperkenalkan bcrypt di USENIX Annual Technical Conference, dengan judul yang sudah mengatakan segalanya: A Future-Adaptable Password Scheme.
Gagasannya: biayanya jangan ada di dalam fungsi, tapi di sebuah parameter. bcrypt membawa faktor biaya yang kamu tentukan sendiri dan yang disimpan bersama hash-nya. Kalau perangkat keras jadi jauh lebih cepat, kamu naikkan angkanya dan kata sandi baru kembali memakan biaya sebagaimana mestinya, tanpa ganti algoritma.
Ini rancangan yang mengakui keusangannya sendiri dan bersiap untuk itu. Sangat sedikit perangkat lunak yang melakukan hal semacam itu.
2009 scrypt, dan penemuan bahwa waktu saja tidak cukup
bcrypt membuat waktu komputasi jadi mahal, dan itu berhasil. Sampai penyerang berhenti memakai jenis mesin yang sama dengan yang bertahan.
Sebuah server punya beberapa inti yang cepat dan serbaguna. Sebuah GPU punya inti kecil dalam jumlah gila-gilaan yang mengerjakan hal yang sama secara paralel, dan sebuah ASIC melangkah lebih jauh: silikon yang dibuat untuk menjalankan satu operasi saja. Kalau pertahananmu berbunyi “operasi ini memakan biaya X”, seseorang bisa membangun perangkat keras yang mengerjakan banyak X sekaligus. Yang bertahan tetap dengan servernya.
Pada 2009, Colin Percival memperkenalkan scrypt dengan argumen lain: Stronger Key Derivation via Sequential Memory-Hard Functions. Kalau biayanya hanya ada di komputasi, ia bisa diparalelkan. Tapi memori tidak dibagikan gratis. Paksa fungsinya memakai banyak RAM dan menjelajahinya dengan cara yang tak bisa dipintas, dan tiba-tiba penyerang tak bisa lagi melipatgandakan inti: setiap inti akan butuh memorinya sendiri. Dan inti-inti sebuah GPU punya tenaga besar tapi RAM yang sangat sedikit untuk masing-masing.
Percival tidak membuat operasinya mahal. Ia membuat perangkat keras yang diperlukan untuk mengulanginya secara massal jadi mahal. Itu perpindahan tingkat: yang diserang adalah anggaran penyerang, bukan jam tangannya.
2015 Argon2, dan berakhirnya perdebatan
Adanya beberapa pilihan yang masuk akal tidak membantu siapa pun untuk memilih. Maka komunitas kriptografi melakukan apa yang biasa mereka lakukan saat ingin menuntaskan sesuatu: sayembara terbuka. Password Hashing Competition menerima para kandidat, menundukkan mereka pada analisis terbuka selama bertahun-tahun, dan pada 2015 menobatkan Argon2 sebagai pemenang.
Argon2 mewarisi dua pelajaran itu: biaya dalam waktu dan biaya dalam memori, keduanya bisa disetel secara terpisah, ditambah jumlah utas. Ini bukan sihir. Ini rangkuman yang rapi dari 1979, 1999 dan 2009, ditelaah oleh orang-orang yang pekerjaannya adalah mencoba mematahkannya.
Apa artinya ini untukmu
Nyaris tak ada dari semua ini yang ada di tanganmu, dan itu perlu dikatakan: hash-nya dipilih oleh situsnya, bukan olehmu. Kamu bisa punya kata sandi terbaik sedunia dan mereka tetap menyimpannya sebagai teks biasa di sebuah berkas Excel.
Tapi sisi lain dari persamaan itu memang bergantung padamu. Seluruh bangunan ini — garam, biaya, memori — gunanya adalah membuat setiap percobaan penyerang jadi mahal. Yang menentukan berapa banyak percobaan yang ia butuhkan adalah kata sandimu. Kalau kata sandimu ada di kamus, tak ada fungsi lambat yang menyelamatkanmu: ia akan jatuh di antara yang pertama. Kalau panjang dan tak mirip apa pun, harga per percobaan itu dikalikan dengan jumlah percobaan yang tak muat dalam waktu yang tersedia.
Karena itulah generator kami mengukur bit entropi dan bukan persentase, dan karena itu pemeriksa mencari kata sandimu di kamus dulu sebelum menghitung simbol. Mereka menetapkan harga per percobaan; kamu menetapkan jumlah percobaannya. Tak satu pun dari kedua paruh itu bekerja tanpa yang lain.
Dan ya: pertanyaannya masih sama seperti dulu. Hanya saja sekarang, dari sisi seberang, ada yang mencoba menjawabnya berkali-kali setiap detik, dan sejak 1979 kita berusaha agar setiap kali itu ada harganya.
Sumber: R. Morris dan K. Thompson, “Password Security: A Case History”, Communications of the ACM, 1979 · N. Provos dan D. Mazières, “A Future-Adaptable Password Scheme”, USENIX Annual Technical Conference, 1999 (bcrypt) · C. Percival, “Stronger Key Derivation via Sequential Memory-Hard Functions”, 2009 (scrypt) · Password Hashing Competition, pemenang Argon2, 2015.