Alat pembangun · UUID penjana
Mengapa crypto.randomUUID() Gagal pada Halaman HTTP: Konteks Selamat Dijelaskan
· Bagaimana ia berfungsi
uuid kriptografi pelayar-apis
crypto.randomUUID berfungsi pada localhost dan pada HTTPS, kemudian hilang pada hos pementasan biasa-HTTP. Siaran ini menerangkan peraturan konteks selamat di sebalik tingkah laku itu dan cara menjana UUID dengan selamat di mana ia terpakai.
TypeError pada pementasan, baik di tempat lain — gejala dan perbezaan persekitaran yang menyebabkannya
Pembangun menyemak kerja mereka pada localhost:3000 dan penjana UUID berfungsi dengan sempurna. Mereka digunakan untuk pementasan di http://staging. dalaman. contoh. com (biasa HTTP pada syarikat LAN) dan kod itu membuang TypeError: crypto.randomUUID bukan fungsi. Kod yang sama dalam pengeluaran pada https://example. com berfungsi dengan baik. Ketidakkonsistenan itu membingungkan sehingga mereka membaca dokumen MDN: crypto.randomUUID dihadkan kepada konteks selamat. Konteks selamat ialah sama ada HTTPS atau localhost; asalan biasa-HTTP pada LAN tidak selamat oleh peraturan pelayar, walaupun rangkaian itu tertutup. Penyelesaiannya ialah menggunakan crypto.getRandomValues dengan operasi bit manual atau untuk menaik taraf pelayan pementasan kepada HTTPS. Peraturan konteks selamat diperkenalkan untuk mengelakkan API sensitif daripada bocor kepada sambungan yang tidak disulitkan.
Apakah konteks yang selamat — peraturan pelayar yang menyimpan API tertentu untuk asal HTTPS dan untuk localhost
Halaman di atas HTTP biasa boleh dipintas oleh penyerang rangkaian; mendedahkan API kriptografi kepada halaman sedemikian akan membolehkan penyerang menjana pengecam menggunakan API yang terjejas. HTTPS menyulitkan halaman dan semua API komunikasi supaya penyerang pada rangkaian tidak boleh memintas atau mengubah suai kod. Localhost dianggap sebagai selamat kerana ia sahaja wujud pada mesin tempatan dan tidak boleh dipintas melalui rangkaian. Mana-mana asal HTTP lain (alamat LAN, domain awam tanpa HTTPS, proksi terbalik yang memajukan ke HTTP) tidak selamat mengikut definisi. Web Crypto API dibahagikan kepada dua fungsi: crypto.randomUUID, terhad kepada konteks selamat dan crypto.getRandomValues, tersedia dalam konteks selamat dan tidak selamat. Kedua-duanya menggunakan sistem pengendalian yang sama CSPRNG.
Bahagian Web Crypto yang manakah berpagar — crypto.randomUUID dan crypto.subtle memerlukan konteks selamat manakala crypto.getRandomValues tidak
Perbezaannya ialah getRandomValues tidak menyembunyikan fakta bahawa anda menggunakan kriptografi; halaman yang menggunakannya mestilah secara eksplisit meminta bait rawak. Fungsi rawakUUID ialah kemudahan yang turut menguatkuasakan konteks selamat. Jika aplikasi anda perlu menjana UUID pada halaman yang tidak selamat, anda mesti menggunakan getRandomValues dan menetapkan versi dan bit varian secara manual. RFC 9562 menentukan operasi bit: tetapkan bait 6 kepada (bait6 & 0x0f) | 0x40 untuk versi 4 dan bait 8 hingga (bait8 & 0x3f) | 0x80 untuk RFC varian. Pustaka ToolAcre melakukan ini sebagai sandaran apabila rawakUUID tidak tersedia. Menghasilkan semula kegagalan: sediakan halaman ringkas dari asal HTTP biasa yang tidak dianggap sebagai berpotensi boleh dipercayai. Semak sama ada rawakUUID terdedah, kemudian bandingkan getRandomValues, yang dibenarkan oleh rujukan Web Crypto dalam konteks yang tidak selamat.
Membina v4 UUID daripada getRandomValues — sandaran penopengan dan pemformatan yang memastikan anda berada di CSPRNG apabila rawakUUID tiada
Kod yang sama dalam fail yang disampaikan melalui HTTPS boleh mendedahkan rawakUUID. Jika pengeluaran melaporkan "randomUUID bukan fungsi," mula-mula periksa sama ada asal ialah konteks yang selamat, kemudian sahkan sokongan pelayar dan sama ada skrip lain menggantikan objek crypto. Ubat itu mungkin HTTPS atau pelaksanaan getRandomValues yang menetapkan bit UUID secara eksplisit. Polifill Math.random bukanlah sandaran yang setara: ia menghasilkan semula bentuk sambil menggugurkan kontrak sumber kriptografi. Ujian yang menegaskan sahaja sempang dan digit versi akan terlepas penggantian itu, jadi semak laluan sumber serta rentetan yang terhasil.
Contoh yang berjaya — menghasilkan semula kegagalan pada asal http:// dan mengesahkan pembetulan
Tetapi pengecam kini boleh diramal. Penyerang yang menangkap beberapa UUID daripada sistem anda boleh meramalkan yang seterusnya. Jika aplikasi tersilap menganggap pengecam sedemikian sebagai bukti kelayakan pembawa, kebolehramalan menjadi kegagalan kebenaran dan bukannya kecacatan kosmetik. Strategi yang betul adalah untuk menaik taraf pelayan kepada HTTPS (sentiasa bergerak yang betul untuk mana-mana halaman dengan pengesahan atau data sensitif) atau menggunakan getRandomValues dengan operasi bit eksplisit (yang memerlukan lebih banyak kod tetapi kukuh dari segi kriptografi). Konteks selamat dikuatkuasakan oleh pelayar; anda tidak boleh mengatasinya dengan pembolehubah konfigurasi atau persekitaran. Penjana ToolAcre digunakan di atas HTTPS, jadi crypto.randomUUID tersedia. Apabila anda menjana UUID dalam alat, ia menggunakan sama ada rawakUUID (jika semakan konteks selamat berlalu) atau getRandomValues dengan operasi bit (jika anda berada di HTTP biasa, walaupun ini jarang berlaku).
Mengapa anda tidak sepatutnya mengisi poli dengan Math.random — pintasan yang menarik dan kos keselamatan yang ditanggungnya
Kedua-dua laluan tidak kembali ke Math.random. Jika anda sedang membina penjana UUID anda sendiri dan menyasarkan asal tidak selamat, gunakan getRandomValues dan lakukan operasi bit itu sendiri. Uji pada kedua-dua HTTPS dan localhost untuk mengesahkan randomUUID berfungsi, kemudian uji pada http:// asal untuk mengesahkan getRandomValues fallback anda adalah betul. Memahami sekatan konteks selamat membantu anda mereka bentuk strategi penggunaan. Jika aplikasi anda mesti dijalankan pada LAN peribadi tanpa HTTPS (infrastruktur lama, sistem terbenam), getRandomValues fallback ialah laluan anda ke hadapan. Jika anda mempunyai pilihan, tingkatkan kepada HTTPS di mana-mana sahaja; ia adalah percuma dengan Let's Encrypt, dan pelaburan membayar balik dalam keselamatan di seluruh aplikasi. Pembangunan pada localhost tidak mempunyai sekatan, jadi uji penjana UUID anda pada localhost dan pada HTTPS pementasan sebelum digunakan untuk pengeluaran. Pengeluaran hendaklah sentiasa HTTPS.
Perkara ini tidak meliputi — masa jalan pelayan seperti Node.js dan Deno, yang mendedahkan API tanpa peraturan konteks selamat
Sekatan itu bukan pepijat atau gangguan; ia adalah ciri keselamatan yang menghalang kemalangan dan memaksa anda berfikir tentang penyulitan. Corak yang lebih luas ialah API kriptografi web dikawal oleh konteks selamat. crypto.getRandomValues, crypto. halus. menyulitkan, kripto. halus. generateKey, dan semua operasi sensitif lain memerlukan HTTPS atau localhost. Tiada pengecualian, tiada penggantian, tiada cara untuk melumpuhkan cek. Satu halaman yang tidak selamat melanggar jaminan keselamatan untuk pengguna anda. Walaupun anda berhati-hati menggunakan API kripto sahaja pada halaman tertentu, kesilapan (atau kebergantungan yang termasuk penjana UUID) boleh membocorkan penjanaan rawak ke halaman yang tidak disulitkan. Penjana ToolAcre menguatkuasakan perkara ini pada peringkat kod: jika rawakUUID tidak tersedia (konteks tidak selamat), ia menggunakan getRandomValues, yang tersedia tetapi memaklumkan mana-mana penyemak kod bahawa sesuatu yang luar biasa sedang berlaku.
Bawa pulang: betulkan asal, bukan penjana — ToolAcre dihidangkan melalui HTTPS, jadi penjananya berjalan dalam konteks selamat mengikut reka bentuk
Lebih baik lagi, ia enggan menjana pengecam jika konteks selamat benar-benar tidak tersedia (dalam persekitaran yang getRandomValues juga tidak tersedia, yang jarang berlaku tetapi mungkin dalam sistem yang lebih lama atau terbenam). Memindahkan sistem sedia ada kepada HTTPS untuk menyokong API kriptografi selamat ialah projek biasa. Mulakan dengan asal tempat UUID dijana (pelayan pengesahan anda, hujung belakang API atau perkhidmatan aplikasi utama). Dapatkan sijil TLS (Let's Encrypt memberikannya secara percuma). Konfigurasikan pelayan web anda untuk menyediakan HTTPS secara lalai dan ubah hala HTTP permintaan ke HTTPS. Uji dengan berbilang pelayar dan API pelanggan untuk memastikan semuanya berfungsi. Kemudian audit kod anda untuk sebarang API kripto yang tinggal yang mungkin dipanggil pada halaman yang tidak disulitkan dan betulkan ia. Penjana ToolAcre menganggap HTTPS; jika anda menggunakannya, anda sudah pun menjadi sebahagian daripada perjalanan ke sana.