Mengeksternalkan Kunci Enkoding Array Bytecode
Sediakan kunci enkripsi bytecode VM Anda sendiri dengan vmBytecodeArrayEncodingKey dan serahkan kembali saat runtime melalui sebuah key getter - disimpan di luar bundle, dibaca dari penyimpanan klien, atau diambil dari backend Anda.
Apa yang dilakukan opsi-opsi ini
vmBytecodeArrayEncoding mengenkripsi array bytecode VM agar tidak berada di
output sebagai teks polos. Secara bawaan, kunci enkripsi diturunkan dari lingkungan dan direkonstruksi di sisi klien,
sehingga Anda tidak pernah menanganinya. Itu praktis, tetapi materi kunci tetap tersimpan di dalam bundle.
Dua opsi memungkinkan Anda mengeluarkan kunci dari bundle dan mengendalikannya sendiri:
vmBytecodeArrayEncodingKey- kunci yang Anda sediakan saat kompilasi. Ketika diset, kunci ini digunakan sebagai pengganti kunci bawaan yang diturunkan dari lingkungan, dan tidak disematkan ke dalam output terobfuskasi.vmBytecodeArrayEncodingKeyGetter- sebuah ekspresi JavaScript yang mengembalikan kunci yang sama saat runtime. Ekspresi ini disematkan secara verbatim dan dievaluasi di peramban saat kode terobfuskasi dimuat.
Intinya adalah pemisahan: karena kunci tidak berada di dalam kode, pemindaian statis murni atas bundle tidak dapat memulihkannya. Kunci tetap harus hadir saat runtime agar kode dapat berjalan, jadi ia tidak benar-benar rahasia - tetapi Anda yang menentukan dari mana asalnya dan siapa yang boleh melihatnya.
Kedua opsi ini adalah satu pasangan. vmBytecodeArrayEncodingKey tanpa getter membuat kode terobfuskasi tidak
memiliki cara untuk memperoleh kunci saat runtime, dan getter tanpa kunci saat-kompilasi yang cocok tidak punya apa
pun untuk disepakati. Setel keduanya, bersama dengan vmBytecodeArrayEncoding: true.
Bagaimana kedua kunci digabungkan
Kunci Anda tidak pernah digunakan sendirian - di kedua sisi ia dicampur dengan kunci internal yang dikendalikan oleh obfuscator:
- Saat kompilasi.
vmBytecodeArrayEncodingKeydigabungkan dengan kunci internal yang diturunkan oleh obfuscator, dan array bytecode dienkode dengan kunci campuran yang dihasilkan. - Saat runtime. Nilai yang di-resolve oleh
vmBytecodeArrayEncodingKeyGetterAnda digabungkan dengan kunci internal yang sama, yang direkonstruksi di sisi klien dari berbagai faktor runtime, untuk mendekode bytecode.
Karena kedua sisi mencampur kunci Anda dengan kunci internal, getter harus di-resolve menjadi string yang persis
sama dengan yang Anda berikan sebagai vmBytecodeArrayEncodingKey. Tidak ada satu bagian pun yang cukup sendirian:
kunci Anda tanpa kunci internal tidak dapat mendekode bytecode, dan kunci internal tidak berguna tanpa kunci Anda -
itulah sebabnya mengendalikan siapa yang menerima kunci Anda-lah yang sebenarnya melindungi kode.
Menyediakan kunci saat runtime
Secara bawaan getter bersifat sinkron: ekspresi harus mengembalikan kunci seketika saat kode terobfuskasi dimuat.
Baca dari sumber apa pun yang sudah ada di sisi klien - sebuah cookie, localStorage, sebuah variabel global, atau
sebuah elemen DOM yang diinjeksikan server.
Kunci harus sudah ada sebelum kode terobfuskasi berjalan:
Sumber sinkron lainnya bekerja dengan cara yang sama - pilih yang mana pun yang sudah diisi oleh aplikasi Anda:
Jauhkan kunci dari berkas atau skrip yang sama dengan kode terobfuskasi. Menyisipkannya di situ meniadakan seluruh
tujuannya - pemindaian statis atas bundle akan memulihkan baik kode maupun kuncinya. Simpan di sumber terpisah, dan
injeksikan vmBytecodeArrayEncodingKey saat-kompilasi dari sebuah variabel lingkungan atau secret alih-alih
meng-commit-nya.
Mengambil kunci dari backend Anda (async)
Membutuhkan vmAsyncExecutor · v7.3.0+Getter sinkron hanya dapat membaca apa yang sudah ada di klien. Untuk mengambil kunci dari server Anda - sehingga
Anda dapat membatasinya di balik autentikasi dan mencabutnya - getter harus asinkron, dan itu membutuhkan
vmAsyncExecutor. Dengan async executor diaktifkan, getter boleh mengembalikan
sebuah Promise, dan VM menunggunya sebelum berjalan.
Getter yang mengembalikan Promise membutuhkan vmAsyncExecutor. Ini tidak dapat diperiksa saat build, sehingga
getter Promise dengan vmAsyncExecutor nonaktif akan gagal saat runtime - dekoder menerima objek Promise
alih-alih string kunci.
Otorisasi pengiriman kunci dengan sesi tervalidasi dan pemeriksaan lisensi yang diperlukan. Origin atau Referer saja tidak mengautentikasi pemanggil; permintaan GET same-origin mungkin tidak menyertakan Origin. Nonaktifkan cache respons. Kaitkan kunci dengan versi build yang benar dan deploy bersama bundel. Klien penerima dapat memeriksa kunci saat runtime.
Ketika kunci tidak cocok
Kode terobfuskasi hanya bekerja ketika getter mengembalikan persis kunci yang sama dengan yang digunakan selama
obfuskasi. Jika kunci berbeda - atau getter mengembalikan undefined, null, atau string kosong - dekripsi
menghasilkan keystream yang salah dan kode gagal saat runtime dengan output sampah atau kesalahan runtime biasa.
Secara sengaja tidak ada pesan kesalahan yang khas dan spesifik-kunci: kunci yang gagal tidak dapat dibedakan dari kesalahan runtime lainnya. Jadi ketika bundle yang dilindungi VM melempar hanya begitu opsi ini aktif, periksa jalur kunci terlebih dahulu - bahwa getter di-resolve di halaman, mengembalikan string yang tidak kosong, dan mengembalikan nilai yang sama dengan yang Anda gunakan saat build.
