Sebuah perpustakaan penjanaan nombor rawak C++ baharu yang menampilkan penjana WELL ( Well Equidistributed Long-period Linear ) telah mencetuskan perbincangan yang hangat dalam komuniti pengaturcaraan mengenai sama ada penjana nombor rawak yang selamat secara kriptografi perlu menjadi pilihan lalai untuk semua aplikasi.
Perpustakaan ini, yang memberi tumpuan kepada penjanaan nombor pseudo-rawak berprestasi tinggi dengan ciri-ciri seperti kebolehulangan merentas platform dan algoritma pengedaran yang dioptimumkan, telah menjadi pusat perdebatan falsafah yang lebih luas mengenai keselamatan berbanding prestasi dalam pembangunan perisian.
Perbandingan Keluarga Penjana WELL
- WELL44497b berbanding WELL19937a menunjukkan keputusan "terbalik" dalam TestU01 merentasi bahasa pengaturcaraan yang berbeza
- Pengoptimuman saiz ruang keadaan bergantung terutamanya pada nilai TBit dan MASK
- Parameter tambahan (K, J) menyediakan kekangan tetapi tidak memberi kesan ketara terhadap prestasi set ujian
Hujah Mengutamakan Keselamatan Menghadapi Tentangan Kuat
Salah satu perkara yang paling kontroversial muncul apabila seorang pembangun berhujah bahawa terdapat sangat sedikit kes penggunaan untuk RNG bukan-kripto dan mencadangkan bahawa semua penjanaan nombor rawak perlu selamat secara kriptografi secara lalai. Pendirian ini, yang menyokong algoritma seperti Randen yang menyediakan jaminan keselamatan yang boleh dibuktikan, mendapat tentangan yang ketara daripada komuniti.
Pengkritik dengan pantas menunjukkan implikasi prestasi yang besar daripada pendekatan ini. Beberapa pembangun menyerlahkan bahawa banyak industri termasuk sains, rangkaian neural, simulasi, permainan, rendering, pemodelan cuaca, penyelidikan nuklear, robotik, dan pemprosesan isyarat memerlukan berbilion hingga trilion nombor rawak dengan pantas. Untuk aplikasi-aplikasi ini, overhed penjana yang selamat secara kriptografi akan menjadi penghalang.
Pertimbangan Keselamatan
- Pelaksanaan ChaCha CSPRNG mungkin mempunyai entropi benih yang tidak mencukupi (32-64 bit)
- Aliran output berulang selepas 2^32 blok, boleh dikembangkan
- Algoritma Randen menyediakan keselamatan yang boleh dibuktikan berdasarkan primitif AES
- Linux vDSO getrandom() menawarkan nombor rawak selamat secara kriptografi yang pantas (digabungkan Julai 2024)
Falsafah Reka Bentuk API Mencetuskan Perbincangan Teknikal
Perbualan itu juga menyelami prinsip-prinsip asas reka bentuk API , terutamanya mengenai mekanisme seeding. Pembangun berdebat sama ada fungsi kemudahan perlu membenarkan seeding manual atau sentiasa menggunakan sumber entropi. Perbincangan itu mendedahkan ketegangan klasik antara keserasian ke belakang dan penambahbaikan keselamatan, dengan rujukan kepada bagaimana sistem warisan seperti fungsi rand() glibc kekal terperangkap dengan algoritma yang lapuk disebabkan kontrak API .
Satu penyelesaian teknikal yang menarik yang dicadangkan melibatkan penggunaan storan thread-local untuk menyediakan kedua-dua kemudahan dan seeding yang betul, menunjukkan bagaimana ciri-ciri C++ moden boleh menangani cabaran penjanaan nombor rawak tradisional.
Dakwaan Prestasi Menimbulkan Keraguan
Penanda aras prestasi perpustakaan, yang menunjukkan beberapa penjana berjalan pada 100-105% prestasi perpustakaan standard, menimbulkan keraguan di kalangan pembangun berpengalaman. Ada yang mempersoalkan kebolehpercayaan angka-angka ini, manakala yang lain memberi tumpuan kepada kebimbangan yang lebih praktikal seperti pendekatan perpustakaan terhadap penjanaan nombor titik terapung dan konsistensi merentas platform.
Perbincangan itu juga menyentuh penyelesaian peringkat kernel yang muncul seperti vDSO getrandom() Linux , yang menyediakan akses pantas kepada nombor rawak yang selamat secara kriptografi, walaupun pembangun menyatakan ini masih jauh lebih perlahan daripada penjana pseudo-rawak khusus untuk aplikasi throughput tinggi.
Tuntutan Perbandingan Prestasi
- std::minstd_rand: 100% prestasi asas
- std::mt19937: 105% daripada prestasi asas
- Perpustakaan mendakwa taburan seragam/normal yang lebih pantas dengan konsistensi urutan merentas platform
- Taburan normal pantas menggunakan penghampiran binomial berasaskan popcount untuk aplikasi permainan/fuzzing
Keputusan: Konteks Penting
Perdebatan itu akhirnya memperkukuh prinsip utama dalam pembangunan perisian: memilih alat yang tepat untuk kerja tersebut. Walaupun penjana yang selamat secara kriptografi adalah penting untuk aplikasi yang sensitif keselamatan, majoriti penggunaan nombor rawak dalam pengkomputeran saintifik, permainan, dan kerja simulasi memerlukan kelajuan dan determinisme yang disediakan oleh penjana pseudo-rawak khusus.
Gunakan alat yang tepat untuk kerja tersebut. Luaskan pandangan anda tentang perkara yang digunakan.
Perbincangan itu menyerlahkan bagaimana domain yang berbeza mempunyai keperluan yang sangat berbeza, dan bahawa cadangan menyeluruh untuk sentiasa menggunakan penjana yang selamat secara kriptografi gagal mengambil kira keperluan pelbagai komuniti pengaturcaraan.
Rujukan: well-random