T: Jika saya mengenkripsi file .class saya dan menggunakan classloader khusus untuk memuat dan mendekripsinya dengan cepat, apakah ini akan mencegah dekompilasi?
J: Masalah dalam mencegah dekompilasi kode byte Java hampir sama tuanya dengan bahasanya itu sendiri. Meskipun berbagai alat kebingungan tersedia di pasaran, programmer Java pemula terus memikirkan cara baru dan cerdas untuk melindungi kekayaan intelektual mereka. Dalam angsuran Tanya Jawab Java ini, saya menghilangkan beberapa mitos seputar ide yang sering diulang di forum diskusi.
Sangat mudahnya file .class Java dapat direkonstruksi menjadi sumber Java yang sangat mirip dengan aslinya sangat berkaitan dengan tujuan dan trade-off desain kode byte Java. Antara lain, kode byte Java dirancang untuk kekompakan, kemandirian platform, mobilitas jaringan, dan kemudahan analisis oleh juru bahasa kode-byte dan kompiler dinamis JIT (just-in-time) / HotSpot. Bisa dibilang, file .class yang dikompilasi mengekspresikan maksud pemrogram dengan sangat jelas sehingga lebih mudah dianalisis daripada kode sumber aslinya.
Beberapa hal bisa dilakukan, jika tidak untuk mencegah pembusukan sepenuhnya, setidaknya membuatnya lebih sulit. Misalnya, sebagai langkah pasca-kompilasi, Anda dapat memijat data .class untuk membuat kode byte lebih sulit dibaca saat didekompilasi atau lebih sulit untuk didekompilasi menjadi kode Java yang valid (atau keduanya). Teknik seperti melakukan overloading nama metode ekstrim bekerja dengan baik untuk yang pertama, dan memanipulasi aliran kontrol untuk membuat struktur kontrol yang tidak mungkin untuk direpresentasikan melalui sintaks Java bekerja dengan baik untuk yang terakhir. Obfuscator komersial yang lebih sukses menggunakan campuran teknik ini dan lainnya.
Sayangnya, kedua pendekatan tersebut harus benar-benar mengubah kode yang akan dijalankan JVM, dan banyak pengguna takut (memang seharusnya demikian) bahwa transformasi ini dapat menambahkan bug baru ke aplikasi mereka. Selanjutnya, metode dan penggantian nama bidang dapat menyebabkan panggilan refleksi berhenti bekerja. Mengubah nama kelas dan paket sebenarnya dapat merusak beberapa Java API lainnya (JNDI (Penamaan Java dan Antarmuka Direktori), penyedia URL, dll.). Selain nama yang diubah, jika asosiasi antara offset kode byte kelas dan nomor baris sumber diubah, memulihkan jejak tumpukan pengecualian asli bisa menjadi sulit.
Lalu ada opsi untuk mengaburkan kode sumber Java asli. Tetapi pada dasarnya hal ini menyebabkan serangkaian masalah serupa. Enkripsi, bukan obfuscate?
Mungkin hal di atas telah membuat Anda berpikir, "Bagaimana jika alih-alih memanipulasi kode byte saya mengenkripsi semua kelas saya setelah kompilasi dan mendekripsinya dengan cepat di dalam JVM (yang dapat dilakukan dengan classloader khusus)? Kemudian JVM menjalankan kode byte asli dan tidak ada yang perlu didekompilasi atau direkayasa balik, bukan? "
Sayangnya, Anda salah, baik dalam berpikir bahwa Anda adalah orang pertama yang mengemukakan ide ini dan berpikir bahwa ide itu benar-benar berhasil. Dan alasannya tidak ada hubungannya dengan kekuatan skema enkripsi Anda.