- Promosi angka acak berbasis lava lamp dari Cloudflare lebih mirip pemasaran dan sandiwara keamanan daripada memberi kontribusi praktis besar pada enkripsi internet
- Dalam kriptografi, yang penting bukanlah keacakan intrinsik suatu nilai, melainkan seberapa banyak penyerang mengetahui nilai tersebut; perbedaan pengetahuan inilah yang menentukan keamanan
- One-time pad menyembunyikan informasi plaintext jika kunci yang cukup acak dipakai hanya sekali, tetapi jika kunci yang sama dipakai ulang maka ia akan runtuh saat digabungkan dengan informasi yang sudah diamati
- Sistem modern memakai CSPRNG dan stream cipher alih-alih one-time pad, dan ChaCha20 atau AES-256-CTR memberikan keamanan praktis dengan kunci 256-bit
- True RNG fisik sulit dihilangkan biasnya dan peningkatan keamanannya kecil, sehingga desain sederhana di mana server membuat seed sendiri dan memakai fast key erasure lebih aman
Keacakan bergantung pada pengetahuan pengamat, bukan objeknya
- Cloudflare mempromosikan bahwa lava lamp membantu enkripsi internet, tetapi pendekatan ini lebih mirip pemasaran dan sandiwara keamanan daripada benar-benar memberi kontribusi besar pada keamanan
- Selain lava lamp, Cloudflare juga menggunakan perangkat ketakterdugaan fisik seperti double pendulums, wave motion, dan mobiles
- Fungsi ala XKCD yang hanya melakukan
return 4 selalu mengembalikan 4, jadi objek itu sendiri tidak acak, tetapi jika pemanggil hanya tahu informasi “konstanta yang dipilih dengan dadu yang adil” dan memanggilnya sekali, maka dalam distribusi probabilitas pengamat itu bisa diperlakukan sebagai acak
- Dalam kriptografi, pertanyaan pentingnya bukan apakah hasilnya intrinsik acak, melainkan seberapa banyak penyerang mengetahui hasil tersebut
- Bahkan untuk nilai yang sama, makna keacakan berubah tergantung siapa yang memiliki informasi apa, dan dalam sistem kriptografi perbedaan pengetahuan ini menentukan keamanan
Cara kerja dan cara rusaknya One-time pad
- Dalam analogi Russian roulette, seorang kaki tangan mengetahui posisi peluru dan hanya mengumumkan ke luar hasil penjumlahan posisi peluru dengan nilai dadu yang telah dibagikan sebelumnya kepada pemain
- Pemain dapat memulihkan posisi peluru dengan mengurangkan nilai dadu dari angka yang diteriakkan, tetapi lawan tidak tahu nilai dadu sehingga tidak bisa mengetahui posisi peluru hanya dari angka tersebut
- Jika dadu itu adil, maka probabilitas awal
P(Ci) yang dimiliki lawan dan probabilitas posterior P(Ci|S3) setelah mendengar angka tertentu S3 akan sama
- Dengan rumus Bayes,
P(Ci|S3) = P(Ci) × 1/6 ÷ 1/6 = P(Ci) sehingga lawan tidak mempelajari informasi apa pun meski mendengar angka yang diteriakkan
- Struktur inilah inti dari One-time pad: jika kunci yang cukup acak digabungkan dengan pesan hanya satu kali, ciphertext tidak mengungkapkan informasi plaintext
- Jika kunci yang sama dipakai ulang pada permainan kedua, informasi yang terungkap dari permainan pertama membuat lawan bisa mempersempit kemungkinan nilai dadu
- Jika pada permainan pertama terbukti empat ruang depan pistol kosong, lawan tahu hanya kemungkinan dadu 3 atau 4 yang tersisa, dan ketika kaki tangan meneriakkan “Four” pada permainan kedua, lawan juga mendapatkan informasi bahwa peluru ada di ruang pertama atau terakhir
- One-time pad aman hanya sekali sesuai namanya; jika kunci yang sama dipakai ulang, ciphertext yang diamati dan informasi sebelumnya bergabung lalu meruntuhkan keamanan
Panjang kunci dan keamanan praktis kriptografi modern
- Di internet, yang dikirim bukan posisi peluru melainkan bit dan byte, dan pesan satu bit “yes/no” bisa disembunyikan dengan satu lemparan koin
- Jika hasilnya kepala maka pesan dibiarkan apa adanya, dan jika ekor maka “yes” dan “no” dibalik; bagi pengamat yang tidak tahu hasil koin, plaintext tetap tersembunyi
- Tetapi jika hasil koin yang sama dipakai untuk mengenkripsi dua bit, ciphertext mengurangi empat kemungkinan plaintext menjadi dua
- “Yes yes” berarti plaintextnya adalah “yes yes” atau “no no”
- “No no” berarti plaintextnya adalah “no no” atau “yes yes”
- “Yes no” berarti plaintextnya adalah “yes no” atau “no yes”
- “No yes” berarti plaintextnya adalah “no yes” atau “yes no”
- Secara umum, saat n bit dienkripsi dengan satu lemparan koin tunggal, ruang plaintext yang mungkin menyusut dari
2^n menjadi 2 kemungkinan
- Dalam makna information-theoretic yang sempurna, untuk mengenkripsi n bit dengan benar dibutuhkan kunci n bit; untuk pesan yang lebih panjang, sebagian akan terdekripsi, dan jika pengamat sudah mengetahui lebih dari n bit informasi, biasanya seluruh pesan bisa terdekripsi
- Menerapkan one-time pad pada seluruh trafik yang diproses Cloudflare tampak membutuhkan jumlah angka acak yang sangat besar, tetapi sistem modern tidak memakai one-time pad
- Dengan menggunakan authenticated encryption dan stream cipher dengan benar, banyak data dapat dienkripsi secara praktis dengan aman menggunakan kunci 256-bit
- Jika memakai stream cipher yang tepat seperti ChaCha20 atau AES-256-CTR, pengamat pasif harus mencoba sekitar
2^255 kombinasi untuk menemukan plaintext
- Bagi orang yang tahu kuncinya, stream itu sepenuhnya dapat diprediksi, tetapi bagi pengamat setingkat peradaban Bumi yang tidak tahu kunci, ia bertindak seperti “entropi” yang sepenuhnya tak terprediksi
- Nama resminya adalah Cryptographically Secure Pseudo-Random Number Generator, disingkat CSPRNG
Pembuatan angka acak nyata dan fast key erasure
- Untuk menurunkan angka acak yang dibutuhkan dari satu master key 256-bit, master key dapat disimpan di master server atau hardware security module, lalu local key stream dihasilkan dan didistribusikan dengan aman ke seluruh perusahaan
- Setiap server atau inti CPU dapat menghasilkan byte acak sebanyak yang diperlukan menggunakan local key 256-bit dan counter
- Masalah utamanya adalah distribusi yang aman sangat sulit dilakukan
- Jika local key bocor, semua pesan yang pernah dan akan dienkripsi oleh mesin itu menjadi berisiko; jika master key bocor, dampaknya jauh lebih besar
- fast key erasure adalah prosedur untuk mengurangi kemungkinan kebocoran kunci dan membatasi dampaknya bila kebocoran terjadi
- Letakkan seed acak 32 byte di awal buffer 512 byte
- Gunakan seed itu untuk menghasilkan 512 byte lalu timpa buffer dengannya
- Keluarkan sesuai permintaan semua bagian kecuali 32 byte pertama, lalu hapus
- Saat buffer habis dipakai, kembali ke tahap pembuatan lagi
- Istilah “erasure” berasal dari fakta bahwa tahap pembuatan itu menghapus kunci lama
- Jika buffer bocor, pesan masa depan bisa berisiko, tetapi nilai masa lalu yang sudah dikeluarkan lalu dihapus tetap terlindungi
- Catatan yang lebih penting adalah jangan menggandakan buffer
- Jangan membuat dua stream dari seed yang sama
- Saat melakukan fork proses, stream harus dibagi dua dengan benar
- Jika satu stream yang sama muncul lebih dari sekali, byte acak yang identik akan berulang dan ini bisa fatal
- Karena itu RNG di user space tidak disarankan, sedangkan RNG kernel, meski tidak mudah, memiliki lebih sedikit hal yang harus diaudit
Pemilihan stream cipher dan margin keamanan
- Ukuran blok internal dari stream cipher dasar juga penting
- Blok 512-bit pada ChaCha20 cukup besar hingga tak perlu dikhawatirkan, dan blok 128-bit pada AES juga cukup besar
- Ada serangan praktis terhadap AES yang peluang suksesnya jauh lebih baik daripada brute force sederhana; AES-128 mungkin bisa dipecahkan, tetapi AES-256 dianggap aman
- Ukuran blok yang lebih kecil harus dianggap sudah pecah untuk penggunaan ini
- Pilihan yang direkomendasikan adalah ChaCha20 atau AES-256, dengan preferensi pada ChaCha20
- Stream cipher modern sangat aman, dan jika mempertimbangkan literatur akademik serta penggunaan oleh berbagai pemerintah, khususnya Amerika Serikat, kemungkinannya sangat kecil untuk dipecahkan dalam waktu dekat
- Karena CSPRNG dan enkripsi sama-sama bergantung pada cipher, jika salah satunya pecah maka seluruh sistem juga pecah
- Jika diasumsikan ada kemungkinan bermakna bahwa AES-256 atau ChaCha20 bisa pecah dalam waktu dekat, ada pilihan untuk menambah margin keamanan
- Jika CSPRNG dan enkripsi memakai cipher yang sama, penyerang tidak lagi punya pilihan untuk memecahkan AES atau ChaCha salah satunya, melainkan harus memecahkan cipher tertentu itu
- Menambah jumlah ronde membantu bukan hanya terhadap biaya brute force, tetapi juga dalam mencegah serangan yang lebih baik daripada brute force
- AES-256 memakai 14 ronde, ChaCha20 memakai 20 ronde
- Ada serangan terhadap ChaCha7 yang lebih baik daripada exhaustive search, tetapi saat ini belum ada serangan seperti itu untuk ChaCha8
- ChaCha20 memakai 20 ronde agar tetap aman meskipun tiba-tiba ditemukan serangan 12 ronde
- Pendekatan memakai banyak sistem secara paralel sangat meningkatkan kompleksitas keseluruhan, dan kompleksitas itu lebih mungkin menciptakan kerentanan fatal daripada serangan matematis terhadap salah satu komponennya
True RNG fisik dan seed awal
- Gagasan bahwa true RNG fisik secara teoretis lebih aman daripada CSPRNG yang bisa saja dipecahkan harus diperlakukan dengan hati-hati
- Output acak sering kali harus tidak memiliki bias yang dapat dideteksi demi keamanan, yang berarti distribusinya harus cukup seragam sehingga bias tidak terdeteksi bahkan setelah menganalisis
2^64 sampel
- Sulit menyesuaikan proses fisik hingga tingkat seperti itu, sehingga dalam praktiknya output sumber noise tetap harus dilewatkan melalui hash kriptografis
- Dibandingkan stream cipher dengan fast key erasure, peningkatan keamanannya kecil, sementara biaya performanya bisa besar tergantung kebutuhan
- Untuk membuat jumlah angka acak berapa pun, seed beberapa byte pertama tetap diperlukan
- Dengan merekam secara digital sumber yang tak dapat diprediksi cukup lama untuk memperoleh entropi lebih dari 256 bit, lalu meng-hash rekaman itu dengan hash 256-bit seperti SHA-256 atau BLAKE2s, kita bisa membuat master seed
- Sumber acak yang memungkinkan meliputi hardware random number generator, CPU jitter, foto pohon acak, beam splitter, penekanan tombol atau event mouse, dadu, dan lain-lain
- Distribusi angka acak antar situs tidak praktis, dan selain rumit juga bisa menjadi sumber kompromi
- Angka acak tidak hanya dibutuhkan sekali, tetapi setiap kali ada dugaan kompromi atau saat melakukan pembaruan keamanan penting
- Untuk mengurangi kerepotan dan risiko, umumnya lebih baik komputer terkait membuat sendiri random seed yang akan dipakainya daripada mengambilnya dari luar
- Server biasa memiliki CPU jitter, interaksi periferal, dan event jaringan yang umumnya sudah cukup untuk penggunaan normal
- Jika ingin keamanan tambahan, beberapa dongle hardware RNG bisa ditambahkan per rak server, tetapi cara yang lebih rumit dari itu hanyalah kompleksitas yang tidak perlu
Mengapa dinding lava lamp tidak diperlukan
- Dinding lava lamp Cloudflare tidak diperlukan, dan menghubungkannya ke server melalui jaringan lokal hanya menambah kompleksitas dan permukaan serangan
- Jika diimplementasikan dengan benar, risikonya mungkin sangat rendah, tetapi tetap saja risikonya lebih besar daripada manfaat yang didapat
- Jika Cloudflare serius soal keamanan, mereka seharusnya berhenti memakai lava lamp dan membiarkannya hanya untuk dekorasi dan pemasaran
- Akan lebih sederhana dan lebih aman jika setiap server menghasilkan angka acaknya sendiri secara langsung
- Ada kemungkinan Cloudflare sebenarnya sudah melakukannya
1 komentar
Komentar Lobste.rs
Tulisan ini tampaknya ditulis dengan beberapa kesalahpahaman dan agak terasa seperti perusak suasana. Pembangkit bilangan acak modern menggunakan beberapa sumber entropi yang independen, lalu terus mencampurkannya ke dalam pool entropi dengan hash selama komputer berjalan
Komputer bukan memiliki satu “seed acak” tunggal, melainkan terus di-seed ulang saat berjalan dengan entropi dari banyak sumber, dengan cara seperti
seed = hash(seed, new_data). Menambahkan data kamera yang merekam lampu lava sama sekali tidak menurunkan keamanan sistem. Data yang masuk ke pool entropi di-hash bersama data lain yang sudah ada di sana. Sistem dirancang agar tetap aman selama ada sedikit saja informasi yang tidak diketahui penyerang, jadi mencampur banyak data dengan tingkat keacakan yang berbeda-beda tidak merusak keamananLampu lava tidak merusak keamanan sistem, dan menurut saya pribadi merupakan karya seni yang menyenangkan sekaligus fungsional sebagai bagian dari sistem. Itu juga sedikit sekali meningkatkan kualitas angka acak, serta memperlihatkan konsep keacakan dan entropi secara visual
Benar, tetapi pembangkit bilangan acak kernel sudah menggunakan berbagai sumber keacakan perangkat keras selama lebih dari 30 tahun, dan sebaiknya jangan melebih-lebihkan seberapa “terus-menerus” atau “tanpa henti” proses reseed itu terjadi
Keacakan dari perangkat keras memang terus dikumpulkan, tetapi pembangkit bilangan acak Linux melakukan reseed secara berkala. Selama menit pertama setelah boot, itu terjadi tiap beberapa detik, lalu setelahnya melambat menjadi sekitar sekali per menit
https://zx2c4.com/projects/linux-rng-5.17-5.18/…
Saya tidak tahu dari mana muncul kesan bahwa saya mengatakan atau menyiratkan sistem yang ada tidak seperti itu. Di sini, selain bagian lampu lava, saya bukan sedang mencoba menjelaskan sistem yang ada, melainkan ingin menekankan betapa sedikitnya yang sebenarnya kita butuhkan, yaitu cukup 256 bit
Saat mengatakan bahwa menambahkan data kamera yang merekam lampu lava tidak mengurangi keamanan, yang terlintas di benak saya adalah permukaan serangan. Itu berarti menambahkan komputer embedded dan komunikasi jaringan antara komputer itu dan server. Bagi saya, risiko kecil tambahan itu tampak jauh lebih besar daripada risiko yang sangat kecil dan nyaris tak masuk akal sampai-sampai kita benar-benar membutuhkan lampu lava
Jika dibahas dengan pembedaan filosofis yang berbeda, pertanyaannya menjadi seperti ini: ada berapa banyak hasil yang mungkin, dan seberapa dapat diprediksi hasil itu
Untuk tujuan kriptografi, kita sudah mantap pada tingkat prediktabilitas 2^-256, tetapi menariknya ada proses umum yang jumlah kemungkinan hasilnya jauh lebih besar, dan kadang kita ingin semua kemungkinan hasil itu bisa benar-benar muncul, meskipun peluangnya sangat kecil. Dalam situasi seperti itu, keacakan kriptografis bisa jadi tidak cukup
Satu set kartu standar memiliki 52! kemungkinan urutan, yaitu sekitar 2^226, jadi seed yang acak secara kriptografis masih bisa menghasilkan semua urutan itu. Tetapi kalau bermain Uno atau mencampur beberapa set kartu sekaligus, pembangkit angka acak 256 bit tidak memiliki status yang cukup untuk menghasilkan semua kemungkinan urutan. Jika semua keacakan ruang pengguna sistem berasal dari kernel, dan kernel menyalurkan semua keacakan perangkat keras ke CSPRNG 256 bit, mungkin itu tidak cukup untuk mengocok kartu di Las Vegas :-)
Yang hilang dari tulisan itu adalah reseed, yang menarik karena menunjukkan bagaimana ia berinteraksi dengan penghapusan kunci cepat, serta sulitnya mendapatkan seed awal. Tulisan itu memberi kesan seolah Linux hanya memakai jitter CPU, padahal itu penyederhanaan yang berlebihan. Linux memakai banyak sumber keacakan, dan tarian jitter hanya dipakai sebagai upaya terakhir
Di dunia nyata, kita tidak akan pernah bisa mendapatkan bahkan 2^128 sampel. Sebenarnya jauh lebih sedikit, dan itulah sebabnya AES-128 masih cukup aman untuk banyak penggunaan. Saat jumlah kemungkinan hasil melebihi 2^256, “menjalankan semua kemungkinan hasil” itu sepenuhnya mustahil. Lebih baik dilupakan saja. Hal seperti itu tidak ada
Dalam blackjack, bahkan saat menggunakan 6 set kartu alih-alih satu, yang kita inginkan bukanlah proses pengocokan yang benar-benar mendistribusikan peluang secara merata ke semua urutan yang mungkin. Cukup distribusi yang sangat baik sampai-sampai kita tidak bisa membedakan perbedaannya meski mengambil sampel sebanyak mungkin. Bahkan jika jumlah urutan dibatasi pada 2^256, atau bahkan 2^128, Anda tidak akan bisa melihat bedanya
Saya sengaja tidak membahas reseed dalam tulisan itu. Reseed hanya diperlukan pada momen tertentu seperti dugaan kompromi dan beberapa pembaruan keamanan, atau saat reboot jika itu lebih sederhana atau lebih aman daripada menyimpan status pembangkit acak di memori non-volatil. Karena itu, saya lebih suka melihatnya bukan sebagai “reseed” melainkan memulai ulang dengan seed awal yang baru
Dalam operasi normal, reseed sama sekali tidak diperlukan. Menerapkannya hanya menambah kompleksitas
Saya seharusnya memeriksa kesan bahwa Linux hanya memakai jitter CPU. Setahu saya, pada saat boot itu memang satu-satunya sumber. Khususnya sebelum ada input pengguna dan input jaringan, saya kira memang begitu. Apakah ada sumber lain yang Anda tahu? Dukungan pembangkit angka acak perangkat keras tampaknya tentu sudah ada
Tidak bisa dilakukan. Namun kalau soal itu dikesampingkan, beginilah cara melakukannya dengan aman…
Dugaan saya, kartu perangkat keras pembangkit bilangan acak mungkin ada bukan hanya untuk kepadatan bit, tetapi juga untuk mendapatkan sumber keacakan paralel yang diukur dalam jumlah bit per satuan waktu
Saya tidak terlalu tidak setuju dengan klaim-klaim individualnya, tetapi argumen keseluruhannya terasa kabur. Tulisan itu dibangun di atas gagasan “kriptografi modern membutuhkan jauh lebih sedikit keacakan sejati daripada yang dibayangkan orang”, lalu mendarat pada “karena itu lampu lava lebih buruk karena memperluas permukaan serangan”
Kedua klaim itu bisa sama-sama benar, tetapi alur menuju kesimpulannya terasa kasar
LavaRand sudah melakukan hal seperti ini lebih dari 20 tahun lalu. Waktu itu memang lucu, tetapi sensor kamera saat itu jauh lebih kecil, dan karena karakteristik yang dapat diprediksi seperti lensa dan sebagainya, itu bukan sumber entropi yang baik
Saya memang suka lampu lava, tetapi konsumsi daya dinding berisi ratusan lampu itu menurut saya cukup besar untuk sesuatu yang pada dasarnya seperti mainan
Ini terasa seperti promosi diri. Dia hampir tidak pernah membagikan tautan, dan ketika membagikannya, yang dibagikan adalah tautannya sendiri. 5 dari 5 postingan terbarunya mengarah ke materinya sendiri
“Bagus jika penulis ikut berpartisipasi dalam komunitas, tetapi jangan menyalahgunakannya sebagai alat satu arah untuk mengumumkan produk atau mengarahkan trafik ke karya sendiri. Sebagai aturan praktis, promosi diri sebaiknya kurang dari seperempat dari stories dan comments Anda sendiri.”
Kalau dia punya 15 postingan dan 1399 komentar, dia jelas berpartisipasi dalam komunitas. Kecuali kalau pada setiap postingannya sendiri dia juga menambahkan lebih dari 90 komentar dari dirinya sendiri
Cloudflare menyumbangkan entropi dari lampu lava, University of Chile dari data gempa bumi, kalau saya ingat benar EPFL dari pengukuran peluruhan radioaktif, dan berbagai peserta lain menyumbangkan beragam data ke seremoni pembangkitan kunci awal jaringan drand
Apakah mereka bisa memakai CSPRNG? Tentu saja. Tapi kalau begitu, di mana serunya?