Alat pengembang · generator UUID
Math.random vs crypto.getRandomValues: Cara Kerja Setiap Generator
· Cara kerjanya
uuid kriptografi browser-apis
Keduanya mengembalikan nomor yang terlihat acak, namun yang satu merupakan mesin negara deterministik kecil dan yang lainnya diumpankan oleh sistem operasi. Inilah yang masing-masing lakukan dan mengapa UUID harus menggunakan yang kedua.
Cuplikan forum yang membuat UUID dari Math.random — mengapa cuplikan tersebut terlihat baik-baik saja dan lulus setiap pengujian biasa
Jawaban forum menawarkan pabrik UUID cepat dalam delapan baris: gulung nilai dari Math.random dan format ke dalam tata letak 8-4-4-4-12. Kode terlihat baik-baik saja dan lulus setiap pengujian biasa. Setiap pengidentifikasi tampak berbeda, dan sampel singkat tidak menunjukkan pola visual yang jelas. Itu bukan properti yang dibutuhkan oleh pengidentifikasi yang sensitif terhadap keamanan. JavaScript menetapkan Math.random sebagai sumber pseudo-acak tetapi tidak memerlukan ketahanan kriptografi terhadap prediksi. Pekerjaan yang sesuai meliputi simulasi, permainan, dan pengacakan. Ketika pengidentifikasi dapat memengaruhi akses, penemuan objek, atau keputusan permusuhan lainnya, penampilan tidak lagi menjadi bukti. Kontrak generator yang terdokumentasi lebih penting daripada satu halaman keluaran yang tampak masuk akal.
Di dalam Math.random — algoritme pseudo-acak unggulan dengan status internal tetap, dirancang untuk kecepatan dan penyebaran statistik, bukan kerahasiaan
Karena Math.random tidak ditentukan sebagai generator kriptografi, keluarannya tidak boleh dianggap sebagai bukti bahwa nilai masa depan disembunyikan dari pengamat. crypto.getRandomValues memiliki kontrak platform yang berbeda: ia mengisi array bertipe bilangan bulat dengan nilai kriptografi yang kuat. Spesifikasi Web Crypto menyerahkan generator yang tepat kepada agen pengguna, sehingga kode aplikasi tidak boleh mengklaim algoritma, ukuran seed, atau perangkat entropi tertentu. ToolAcre hanya memerlukan batas yang didukung: browser menyediakan byte acak yang aman, JavaScript menerima Uint8Array yang diisi, dan kode UUID menyetel bidang versi dan varian. Pernyataan tersebut berguna dan portabel di seluruh browser yang implementasi internalnya berbeda.
Mengapa mengamati keluaran dapat mengungkap keadaan — bagaimana keadaan kecil berarti jaringan nilai dapat memungkinkan seseorang memprediksi keadaan berikutnya
Kode aplikasi menerima nilai kriptografi yang kuat dari getRandomValues daripada menerapkan atau mengekspos status JavaScript PRNG. Perbedaan keamanan muncul di sistem nyata. Pengidentifikasi yang dibuat dari Math.random tidak cocok di mana pun prediksi mempunyai konsekuensi karena penyerang dengan kemampuan membaca jaringan (atau sistem apa pun di mana UUID sebelumnya terlihat) dapat memprediksi yang berikutnya. UUID v4 dari crypto.getRandomValues dengan sendirinya bukan merupakan token autentikasi (Anda masih memerlukan masa berlaku, hashing, pembatasan laju), namun generator dirancang untuk menolak prediksi. ToolAcre menolak membuat pengidentifikasi jika sumber amannya tidak ada, daripada secara diam-diam menurunkan versi ke formula yang dapat diprediksi. Math.random telah dikirimkan dengan bug distribusi halus di mesin utama. Urutan keluaran mungkin terlihat bervariasi tanpa memberikan ketidakpastian yang diperlukan untuk peran pembawa rahasia.
Di dalam crypto.getRandomValues — browser menanyakan CSPRNG sistem operasi, yang menggabungkan entropi perangkat keras dan sistem dan dirancang agar tidak dapat diprediksi
Algoritme khusus mesin dan perilaku statistiknya dapat berubah; baik inspeksi visual maupun uji distribusi biasa tidak meningkatkan Math.random menjadi sumber kriptografi. Perhitungan tumbukan juga mengasumsikan keluaran independen dari ruang yang ditentukan. Jika generator mengulangi keadaan, salah diunggulkan, atau diganti dengan perlengkapan deterministik, asumsi tersebut gagal dan rumus tidak lagi menjelaskan implementasinya. Kedua API dapat menghasilkan string yang terlihat tidak beraturan. Model ancaman memisahkan keduanya: nilai yang harus menolak prediksi menggunakan crypto.getRandomValues, sedangkan simulasi dan pengacakan non-adversarial dapat menggunakan Math.random. Pilihannya didasarkan pada konsekuensi prediksi, bukan berdasarkan tanda baca atau variasi nyata dalam suatu sampel.
Contoh praktis - menghasilkan jumlah pengidentifikasi yang sama dengan setiap metode dan membandingkan apa yang dapat disimpulkan oleh pengamat
Generator ToolAcre UUID menggunakan crypto.getRandomValues secara eksklusif; ia tidak pernah menggunakan Math.random karena biaya UUID yang dapat diprediksi selalu lebih tinggi daripada biaya generator yang sedikit lebih lambat. Perbedaan kriptografi dapat diukur melalui model ancaman. Penyerang yang ingin memalsukan UUID harus menebak pengidentifikasi secara langsung atau merusak generator nomor acak. Menebak secara langsung bukanlah perbandingan yang diukur dalam artikel ini; kesimpulan yang didukung adalah bahwa Web Crypto ditujukan untuk keacakan kriptografi sedangkan Math.random tidak. CSPRNG dan Math.random memaparkan kontrak yang berbeda: kontrak pertama dirancang untuk keacakan yang sensitif terhadap keamanan, sedangkan kontrak kedua tidak menjanjikan hal tersebut. Sistem yang menggunakan Math.random untuk pengidentifikasi telah kehilangan properti kriptografi; keamanannya sekarang bergantung pada menjaga kerahasiaan urutan UUID yang dihasilkan. Jika satu saja UUID bocor, seluruh generasi masa depan akan terancam.
Bug distribusi historis — pengingat bahwa mesin telah mengirimkan implementasi Math.random dengan output yang terlihat tidak merata, dijelaskan secara kualitatif
Jika aplikasi menyimpan UUID dalam log, database, atau riwayat kontrol versi, kebocoran hampir tidak dapat dihindari. Pustaka ToolAcre memberlakukan penggunaan crypto.getRandomValues dan menolak membuat UUID jika konteks aman (HTTPS atau localhost) tidak tersedia. Keputusan desain ini mencegah kemunduran diam-diam ke Math.random yang mengganggu banyak implementasi manual. Di Node.js, perpustakaan menggunakan modul crypto; di browser, ia menggunakan Web Crypto API. Kedua jalur yang didukung meminta keacakan kriptografi yang kuat dari platform. Implementasinya tidak menimbulkan klaim kinerja karena mesin, perangkat, dan beban kerja menentukan waktu; kontrak keamanan adalah properti penentu untuk pengidentifikasi. Alasan standar industri ditetapkan pada crypto.getRandomValues adalah sejarah singkat penyalahgunaan UUID. Sistem awal menggunakan waktu sistem, antarmuka jaringan, dan jam perangkat keras untuk menghasilkan pengidentifikasi.
Apa yang tidak tercakup dalam hal ini — kualitas statistik dari salah satu generator untuk simulasi, yang merupakan pertanyaan yang berbeda dari ketidakpastian
Versi UUID berbasis waktu, berbasis node, dan acak memecahkan masalah alokasi yang berbeda; seseorang tidak boleh disajikan sebagai perbaikan linier untuk setiap desain sebelumnya. Untuk versi 4, RFC 9562 mendefinisikan bidang acak dan secara terpisah membahas ketidakmampuan untuk menebak. Oleh karena itu, migrasi keluar dari Math.random mengubah kualitas nilai yang baru dihasilkan tanpa mengubah bentuk tekstual UUID. Pengidentifikasi yang ada tetap menjadi kunci basis data; meregenerasinya akan merusak referensi. Nilai-nilai baru dapat segera menggunakan Web Crypto, sementara otorisasi harus terus memperlakukan setiap UUID lama atau baru sebagai pengidentifikasi dan bukan bukti izin. Dokumentasikan penghentian tersebut sehingga petugas tanggap darurat mengetahui generator mana yang menghasilkan setiap populasi.
Kesimpulan: pilih generator berdasarkan ancaman, bukan berdasarkan penampilan — generator ToolAcre UUID menggunakan CSPRNG secara eksklusif, tidak pernah Math.random()
Validasi harus membedakan antara ID lama (tidak sesuai untuk kerahasiaan) dan ID baru (yang didukung CSPRNG). Dokumentasi harus mencatat transisi tersebut. Generator ToolAcre hanya menghasilkan crypto.getRandomValues UUID; itu tidak mencoba memvalidasi atau membuat ulang pengidentifikasi dari sumber lain. Generator ToolAcre menunjukkan praktik terbaik dengan menolak menurunkan versi ke sumber acak yang lebih lemah. Jika crypto.getRandomValues tidak tersedia, alat akan melaporkan kesalahan alih-alih menggunakan Math.random secara diam-diam. Prinsip desain ini berlaku untuk semua sistem yang kritis terhadap keamanan: gagal secara besar-besaran daripada berhasil secara diam-diam dengan jaminan keamanan yang lemah. Pengembang yang melihat "pembuatan UUID gagal: kripto API tidak tersedia" harus mengatasi masalah mendasar (tingkatkan ke HTTPS, perbaiki konteks aman, atau berikan penggantian yang tepat). Pengembang yang secara diam-diam menerima UUID yang dibuat dari Math.random tidak memiliki indikasi bahwa sistemnya telah disusupi. Perpustakaan ToolAcre mengutamakan kejujuran daripada kenyamanan.