Dokumentasi
/
Resep
/

Kunci Bytecode Array Encoding

Kunci Bytecode Array Encoding

Pro

Berikan kunci enkripsi bytecode VM Anda sendiri dengan vmBytecodeArrayEncodingKey dan serahkan kembali saat runtime melalui key getter - disimpan di luar bundel, dibaca dari penyimpanan klien, atau diambil dari backend Anda.

Tonton

Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization

Tonton di YouTube

Obfuscator.io Custom Bytecode Key: Compile-Time Key and Runtime Key Getter (Cookie, Fetch, Decoy Key)

Tonton di YouTube

Fungsi opsi-opsi ini

vmBytecodeArrayEncoding mengenkripsi array bytecode VM sehingga array tersebut tidak berada di keluaran sebagai teks biasa. Secara bawaan, kunci enkripsi diturunkan dari lingkungan dan direkonstruksi di klien, sehingga Anda tidak pernah perlu menanganinya. Cara ini praktis, tetapi materi kuncinya tetap berada di dalam bundel.

Dua opsi memungkinkan Anda mengeluarkan kunci dari bundel dan mengendalikannya sendiri:

  • vmBytecodeArrayEncodingKey - kunci yang Anda berikan saat kompilasi. Jika disetel, kunci ini dipakai sebagai pengganti kunci bawaan yang diturunkan dari lingkungan, dan kunci ini tidak disematkan ke dalam keluaran hasil obfuskasi.
  • vmBytecodeArrayEncodingKeyGetter - ekspresi JavaScript yang mengembalikan kunci yang sama saat runtime. Ekspresi ini disematkan apa adanya dan dievaluasi di peramban ketika kode hasil obfuskasi dimuat.

Intinya adalah pemisahan: karena kunci tidak ada di dalam kode, pemindaian bundel yang murni statis tidak dapat memulihkannya. Kunci tetap harus tersedia saat runtime agar kode dapat berjalan, jadi kunci ini tidak benar-benar rahasia - tetapi Anda yang menentukan dari mana kunci itu berasal dan siapa yang boleh melihatnya.

Kedua opsi ini adalah pasangan, dan obfuscator mewajibkannya: menyetel salah satunya tanpa yang lain merupakan error validasi saat build (vmBytecodeArrayEncodingKey saja tidak punya cara untuk memperoleh kunci saat runtime; getter saja tidak punya kunci kompilasi untuk disepakati). Keduanya juga tidak berpengaruh kecuali array bytecode benar-benar dienkripsi, sehingga vmBytecodeArrayEncoding: true juga harus aktif - atau vmSelfDefending: true, yang secara internal memaksa vmBytecodeArrayEncoding aktif. Setel kedua kunci bersama salah satu dari opsi tersebut.

Cara kedua kunci digabungkan

Kunci Anda tidak pernah dipakai sendirian - di kedua sisi, kunci itu dicampur dengan kunci internal yang dikendalikan obfuscator:

  • Saat kompilasi. vmBytecodeArrayEncodingKey digabungkan dengan kunci internal yang diturunkan obfuscator, dan array bytecode dienkode dengan kunci campuran yang dihasilkan.
  • Saat runtime. Nilai yang dihasilkan vmBytecodeArrayEncodingKeyGetter Anda digabungkan dengan kunci internal yang sama, yang direkonstruksi di klien dari berbagai faktor runtime, untuk mendekode bytecode.

Karena kedua sisi mencampur kunci Anda dengan kunci internal, getter harus menghasilkan string yang persis sama dengan yang Anda berikan sebagai vmBytecodeArrayEncodingKey. Tidak ada bagian 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 adalah hal yang benar-benar melindungi kode.

Menyediakan kunci saat runtime

Secara bawaan getter bersifat sinkron: ekspresinya harus langsung mengembalikan kunci ketika kode hasil obfuskasi dimuat. Bacalah kunci dari sumber apa pun yang sudah ada di klien - cookie, localStorage, variabel global, atau elemen DOM yang disisipkan oleh server.

JavaScript

Kunci harus sudah ada sebelum kode hasil obfuskasi berjalan:

JavaScript

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

JavaScript

Jangan letakkan kunci di berkas atau skrip yang sama dengan kode hasil obfuskasi. Menyisipkannya di sana menggagalkan seluruh tujuannya - pemindaian statis terhadap bundel akan memulihkan kode sekaligus kuncinya. Simpan kunci di sumber terpisah, dan sisipkan vmBytecodeArrayEncodingKey saat kompilasi dari variabel lingkungan atau penyimpanan rahasia alih-alih menyimpannya di repositori.

Mengambil kunci dari backend Anda (async)

Memerlukan vmAsyncExecutor · v7.3.0+

Getter sinkron hanya dapat membaca apa yang sudah ada di klien. Untuk mengambil kunci dari server Anda - agar Anda dapat melindunginya di balik autentikasi dan mencabutnya - getter harus asinkron, dan itu memerlukan vmAsyncExecutor. Dengan async executor aktif, getter boleh mengembalikan Promise, dan VM menunggunya sebelum berjalan.

Mengaktifkan vmAsyncExecutor juga mempersempit apa yang divirtualisasi: dalam mode ini hanya fungsi async terluar yang dikompilasi ke dalam VM, dan kode sinkron tidak divirtualisasi (obfuskasi lainnya tetap diterapkan). Jika program Anda sebagian besar sinkron, bungkus kode yang ingin dilindungi dalam fungsi async agar tetap tercakup - lihat vmAsyncExecutor untuk aturan lengkapnya.

JavaScript

Getter yang mengembalikan Promise memerlukan vmAsyncExecutor. Hal ini tidak dapat diperiksa saat build, sehingga getter Promise dengan vmAsyncExecutor nonaktif akan gagal saat runtime.

Di server, tentukan kunci mana yang dikembalikan berdasarkan apa pun yang dipercaya aplikasi Anda - sesi yang tervalidasi, pemeriksaan lisensi, dan sebagainya. Origin atau Referer saja tidak mengautentikasi pemanggil, dan permintaan GET same-origin bisa saja tidak menyertakan Origin. Triknya: alih-alih menolak pemanggil yang tidak tepercaya, kembalikan kunci yang salah (VM_DECOY_KEY di bawah). Kode yang dilindungi kemudian gagal dengan sendirinya (error, hasil yang salah, atau halaman yang berhenti merespons), yang lebih tersamar daripada 401 yang jelas-jelas memberi tahu penyerang apa yang harus dilewati.

Nonaktifkan cache respons, agar kunci milik satu pemanggil tidak pernah disajikan ke pemanggil lain. Ikat kunci ke versi build yang benar dan terapkan kunci serta bundel ke produksi secara bersamaan. Klien yang menerima kunci asli tetap dapat memeriksanya saat runtime.

JavaScript

Sajikan string yang persis sama dari endpoint ini dengan yang Anda berikan sebagai vmBytecodeArrayEncodingKey saat build. Getter di atas mengambil URL relatif (/api/vm-key), sehingga salinan bundel yang dihosting di origin lain meminta /api/vm-key dari origin tersebut, sehingga tidak pernah menerima kunci Anda; kunci umpan adalah yang diterima pemanggil ketika ia berhasil menjangkau endpoint Anda tetapi tanpa sesi tepercaya (permintaan tanpa autentikasi, bundel curian yang diteruskan melalui proxy di origin Anda). Bagaimanapun juga, kunci asli tidak pernah sampai dan kode yang dilindungi tidak berjalan.

Apa yang dianggap "valid" sepenuhnya bergantung pada aplikasi: sesi yang terautentikasi, lisensi yang ditandatangani, atau kombinasi apa pun. Apa pun yang menghasilkan kunci, bungkus dalam Promise dan async executor akan menunggunya sebelum menjalankan VM.

Ketika kunci tidak cocok

Kode hasil obfuskasi hanya berfungsi ketika getter mengembalikan kunci yang persis sama dengan yang dipakai saat obfuskasi. Jika kuncinya berbeda - atau getter mengembalikan undefined, null, atau string kosong - kode gagal saat runtime: kode menghasilkan hasil yang salah, melempar error runtime biasa, atau berhenti merespons.

Sengaja tidak ada pesan error khusus untuk kunci: kunci yang gagal tidak dapat dibedakan dari error runtime lainnya. Jadi, ketika bundel yang dilindungi VM baru melempar error, mengembalikan hasil yang salah, atau macet setelah opsi ini dipakai, periksa jalur kunci terlebih dahulu - bahwa getter menghasilkan nilai di halaman, mengembalikan string yang tidak kosong, dan mengembalikan nilai yang sama dengan yang Anda pakai saat build.