Teks & alat harian · Penjana Kata Laluan
crypto.getRandomValues lwn Math.random: sebab ia penting untuk kata laluan
· Bagaimana ia berfungsi
kata laluan web-crypto rawak
Menjelaskan perbezaan antara penjana nombor rawak tujuan umum pelayar dan penjana kriptografinya, sebab kebolehramalan membawa maut untuk kata laluan dan cara mengetahui alat yang digunakan.
Cukup rawak untuk permainan dadu, bukan untuk kata laluan — dua jenis rawak yang ditawarkan oleh pelayar
Pelayar boleh menawarkan lebih daripada satu sumber nilai yang kelihatan tidak teratur, tetapi gangguan visual bukanlah bukti bahawa urutan sesuai untuk kelayakan. ToolAcre melukis sempadan produk yang keras: setiap pilihan perkataan, pilihan pembatas, pilihan aksara dan swap shuffle melalui satu fungsi integer selamat yang disokong oleh `crypto.getRandomValues`. Jika API itu tidak boleh digunakan, halaman itu melumpuhkan penjanaan dan bukannya menghasilkan pengganti yang kelihatan munasabah.
Penolakan itu lebih penting daripada sama ada dua output sampel kelihatan sama bercampur aduk. Sumber yang boleh diramal masih boleh mencetak huruf, digit dan perkataan yang kelihatan meyakinkan seseorang. Oleh itu, pelaksanaan menjadikan sumber boleh diaudit dan kegagalan dapat dilihat. Ia tidak mendakwa bahawa sebarang nilai yang dijana adalah selamat untuk setiap persekitaran; pelayar atau peranti yang terjejas masih boleh membaca perkara yang dipaparkan oleh halaman tersebut.
Untuk tujuan Math.random — kerawak pseudo yang pantas dan berbiji yang outputnya boleh dibina semula daripada beberapa pemerhatian
Buku kerja menerangkan Math.random sebagai pseudo-rawak berbiji yang boleh dibina semula daripada beberapa pemerhatian, tetapi itu adalah dakwaan pelaksanaan umum repositori ini tidak ditubuhkan untuk setiap enjin JavaScript. Fakta tempatan adalah lebih mudah dan kukuh untuk produk ini: fail penjana pengeluaran tidak memanggil `Math.random`. Jalur ujian peringkat sumber menghapuskan ulasan, mengimbas kod boleh laku dan gagal jika panggilan sedemikian muncul di mana-mana dalam apl enjin atau kata laluan.
Perbezaan ini menghalang artikel daripada menukar peraturan pelaksanaan kepada kuliah sejarah pelayar universal. ToolAcre tidak perlu mencirikan setiap algoritma Math.random yang mungkin untuk menolak API untuk penjanaan kata laluan. Pakejnya menerima Web Crypto atau sumber selamat yang disuntik yang digunakan oleh ujian, dan tidak mendedahkan pilihan pengeluaran untuk benih, mod deterministik atau sandaran yang lemah.
Perkara yang dibuktikan oleh repositori ini tentang Math.random: ia tiada dalam penjanaan pengeluaran
`createWebCryptoSource` mencari `getRandomValues` yang boleh dipanggil, kemudian bungkus kaedah itu sebagai sumber rawak pakej. Aplikasi melakukan siasatan tambahan sebelum mendayakan kawalan: ia meminta objek crypto global untuk mengisi tatasusunan ditaip satu elemen di dalam blok percubaan. Itu menangkap persekitaran terhad di mana harta itu wujud tetapi membuang apabila digunakan, dan bukannya mempercayai semakan ciri cetek.
Sumber berhenti di sempadan API pelayar. Ia tidak membuktikan kumpulan sistem pengendalian, arahan perkakasan atau reka bentuk pembenihan semula yang terletak di bawah pelayar tertentu. Butiran tersebut berbeza-beza di bawah antara muka dan memerlukan dokumentasi platform. Apa yang dibuktikan oleh kod itu ialah bait tiba melalui kaedah Web Crypto yang dinamakan dan penjanaan itu tidak dicuba apabila siasatan gagal.
Perkara yang crypto.getRandomValues lakukan di sini: mengisi tatasusunan yang ditaip melalui pelayar API
Kebolehramalan adalah berbahaya kerana penjana kelayakan sepatutnya membuat pilihan baru yang tidak dapat dihasilkan oleh pemerhati daripada keluaran terdahulu. ToolAcre menyokong matlamat itu dengan menolak laluan pengeluaran yang menentukan, memusatkan setiap seri dan menguji bahawa API yang lemah tidak hadir. Ia tidak menjanjikan imuniti daripada tangkapan skrin, sambungan, perisian hasad, pancingan data, penggunaan semula kata laluan atau perkhidmatan yang salah mengendalikan bukti kelayakan selepas penyerahan.
Sempadan itu menghalang ralat kategori biasa: penjanaan menangani cara calon dipilih, bukan semua yang berlaku kepadanya kemudian. Pakej mengembalikan rentetan dan tidak log atau menyimpannya. Halaman ini menyimpan satu nilai semasa dalam ingatan dan menjadikannya sebagai teks. Storan kata laluan, penghantaran, pemulihan akaun dan dasar pengesahan kekal menjadi tanggungjawab sistem lain.
Membaca kod — cara menyemak API halaman yang digunakan dan sebab halaman yang boleh dibuka dan boleh diperiksa lebih mudah dipercayai
Membaca kod bermula pada `packages/password-generator/src/index.js`, yang kontraknya mengatakan setiap keputusan rawak mencapai `secureRandomInt`. Fail pelaksanaan kemudian menunjukkan `getRandomValues`, pensampelan penolakan dan ralat eksplisit. Akhir sekali, `no-math-random.test.js` dan suite keselamatan kata laluan yang lebih luas menjadikan jaminan negatif boleh dilaksanakan dan bukannya meninggalkan "kami tidak pernah menggunakan Math.random" sebagai ulasan yang belum diuji.
Sumber terbuka sahaja tidak menjadikan kod betul, tetapi ia memberikan jahitan konkrit pengulas untuk diperiksa. Cari sumber rawak, ikuti pemanggil melalui pilihan dan shuffle, dan periksa perkara yang berlaku apabila API tiada. Semakan yang boleh dipercayai seharusnya dapat menamakan kedua-dua laluan kejayaan dan laluan penolakan dan bukannya membuat kesimpulan keselamatan daripada penjenamaan.
Contoh yang berkesan — rutin memilih perkataan yang sama ditulis kedua-dua cara dan perkara yang boleh dilakukan oleh penyerang dengan setiap satu
Pertimbangkan permintaan untuk integer di bawah 100. `secureRandomInt` memerlukan satu bait, yang julatnya mengandungi 256 nilai. Ia sahaja menerima awalan terbesar yang boleh dibahagikan dengan 100, yang berakhir sebelum 200 dan menolak baki ekor. Ujian deterministik memberi suapan bait 200 diikuti dengan bait 7. Pelaksanaan membuang 200 dan mengembalikan 7; pintasan modulo langsung akan mengembalikan sifar daripada bait yang ditolak.
Fungsi integer selamat yang sama memilih indeks untuk perkataan dan aksara, jadi contoh ini bukan mainan yang dipisahkan daripada generasi. Bait tepat dalam pengeluaran bukanlah contoh yang boleh diulang dan tidak boleh diterbitkan sebagai bukti kelayakan. Artifak yang berguna ialah bukti aliran kawalan: Web Crypto mengisi penimbal, ekor yang tidak sekata ditolak, dan sahaja nilai yang diterima menjadi pilihan terhad.
Contoh yang berjaya: jejak satu cabutan bersempadan melalui laluan secureRandomInt yang dihantar
Repositori ini tidak melaksanakan atau membandingkan penjana sebelah pelayan, penjana nombor rawak perkakasan atau alat baris perintah sistem pengendalian. Ia juga tidak boleh mengaudit dalaman pelaksanaan kripto pelayar daripada JavaScript. Topik tersebut memerlukan bahan sumber, model ancaman dan semakan operasinya sendiri dan bukannya analogi yang ditampal pada laluan kod ToolAcre.
Halaman itu juga bukan pengurus kata laluan. Ia tidak menyimpan, menyegerakkan, menghantar atau mengisi auto apa yang dijananya. Seorang pembaca tidak seharusnya mentafsirkan "sumber rawak kriptografi" sebagai nasihat untuk menggunakan semula hasil atau memindahkannya melalui saluran yang tidak selamat. Tuntutan sahaja milik pilihan dalam tab pelayar semasa.
Bawa pulang — Penjana Kata Laluan menggunakan penjana nombor rawak kriptografi pelayar dan anda boleh mengesahkannya daripada halaman itu sendiri
Pilihan ToolAcre yang boleh disahkan ialah kripto atau tidak. Halaman tersebut memanggil pelayar API semasa pengesanan sokongan, melumpuhkan kawalan apabila ia gagal dan membenarkan enjin membuang `InsecureRandomError` jika penjanaan entah bagaimana mencapai keadaan hilang yang sama. Tiada sandaran Math.random tersembunyi di sebalik mana-mana cawangan.
Gunakan corak itu semasa menyemak penjana: kenal pasti sumber, jejak setiap cabutan terhad, periksa pengurangan dan kocok, dan paksa laluan sumber tidak tersedia. Kemudian nilai peranti dan destinasi secara berasingan. Sumber rawak bunyi diperlukan untuk tugas penjana ini, tetapi ia bukan sijil universal untuk sepanjang hayat kelayakan.