Dokumentasi
/

Kunci Enkoding Array Bytecode

Mengeksternalkan Kunci Enkoding Array Bytecode

Pro

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. vmBytecodeArrayEncodingKey digabungkan dengan kunci internal yang diturunkan oleh obfuscator, dan array bytecode dienkode dengan kunci campuran yang dihasilkan.
  • Saat runtime. Nilai yang di-resolve oleh vmBytecodeArrayEncodingKeyGetter Anda 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.

JavaScript

Kunci harus sudah ada sebelum kode terobfuskasi berjalan:

JavaScript

Sumber sinkron lainnya bekerja dengan cara yang sama - pilih yang mana pun yang sudah diisi oleh aplikasi Anda:

JavaScript

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.

JavaScript

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.

JavaScript

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.