प्रश्न: अगर मैं अपनी .class फ़ाइलों को एन्क्रिप्ट करता हूं और उन्हें उड़ने पर लोड और डिक्रिप्ट करने के लिए एक कस्टम क्लास लोडर का उपयोग करता हूं, तो क्या यह विघटन को रोक देगा?
A: जावा बाइट-कोड के अपघटन को रोकने की समस्या लगभग उतनी ही पुरानी है जितनी भाषा। बाजार पर उपलब्ध कई औज़ारों के औज़ार के बावजूद, नौसिखिए जावा प्रोग्रामर अपनी बौद्धिक संपदा की रक्षा के लिए नए और चतुर तरीके सोचते रहते हैं। इस जावा Q & A किस्त में, मैं चर्चा के मंचों पर अक्सर एक विचार के आसपास कुछ मिथकों को दूर करता हूं।
चरम आसानी जिसके साथ जावा .class फ़ाइलों को जावा स्रोतों में समेटा जा सकता है, जो मूल रूप से मिलते जुलते हैं, का जावा बाइट-कोड डिज़ाइन लक्ष्यों और ट्रेड-ऑफ़ के साथ बहुत कुछ है। अन्य बातों के अलावा, जावा बाइट कोड को कॉम्पैक्टनेस, प्लेटफ़ॉर्म इंडिपेंडेंस, नेटवर्क मोबिलिटी और बाइट-कोड दुभाषियों और जेआईटी (जस्ट-इन-टाइम) / हॉटस्पॉट डायनामिक कंपाइलर्स द्वारा विश्लेषण में आसानी के लिए डिज़ाइन किया गया था। यकीनन, संकलित .class फाइलें प्रोग्रामर के इरादे को स्पष्ट रूप से व्यक्त करती हैं ताकि वे मूल स्रोत कोड की तुलना में विश्लेषण करना आसान हो सकें।
कई चीजें की जा सकती हैं, अगर पूरी तरह से विघटन को रोकने के लिए नहीं, तो कम से कम इसे और अधिक कठिन बनाने के लिए। उदाहरण के लिए, एक पोस्ट-संकलन कदम के रूप में, आप बाइट कोड को या तो पढ़ने के लिए .class डेटा की मालिश कर सकते हैं या तो पढ़ने के लिए जब विघटित या कठिन हो तो वैध जावा कोड (या दोनों) में विघटित हो सकता है। पूर्व के लिए चरम विधि नाम ओवरलोडिंग कार्य अच्छी तरह से करने की तकनीक, और नियंत्रण संरचनाओं को बनाने के लिए नियंत्रण प्रवाह में हेरफेर करना जावा सिंटैक्स काम के माध्यम से प्रतिनिधित्व करना संभव नहीं है। अधिक सफल वाणिज्यिक पर्यवेक्षक इन और अन्य तकनीकों के मिश्रण का उपयोग करते हैं।
दुर्भाग्य से, दोनों दृष्टिकोणों को वास्तव में उस कोड को बदलना होगा जो जेवीएम चलाएगा, और कई उपयोगकर्ता डरते हैं (ठीक है इसलिए) कि यह परिवर्तन उनके अनुप्रयोगों में नए बग जोड़ सकता है। इसके अलावा, विधि और क्षेत्र का नाम बदलने से काम करना बंद हो सकता है। वास्तविक वर्ग और पैकेज के नाम बदलने से कई अन्य जावा एपीआई (JNDI (जावा नामकरण और निर्देशिका इंटरफ़ेस), URL प्रदाता, आदि) टूट सकते हैं। परिवर्तित नामों के अतिरिक्त, यदि क्लास बाइट-कोड ऑफ़सेट्स और सोर्स लाइन नंबरों के बीच संबंध को बदल दिया जाता है, तो मूल अपवाद स्टैक निशान को पुनर्प्राप्त करना मुश्किल हो सकता है।
फिर मूल जावा स्रोत कोड को बाधित करने का विकल्प है। लेकिन मूल रूप से यह समस्याओं के समान सेट का कारण बनता है। एन्क्रिप्ट, नहीं obfuscate?
शायद ऊपर आपने यह सोच लिया है, "ठीक है, क्या होगा यदि बाइट कोड में हेरफेर करने के बजाय मैं संकलन के बाद अपनी सभी कक्षाओं को एन्क्रिप्ट करता हूं और उन्हें जेवीएम (जो एक कस्टम क्लास लोडर के साथ किया जा सकता है) के अंदर मक्खी पर डिक्रिप्ट करता है? फिर जेवीएम मेरे द्वारा निष्पादित करता है मूल बाइट कोड और अभी तक डिकम्पाइल या रिवर्स इंजीनियर के लिए कुछ भी नहीं है, है ना? "
दुर्भाग्य से, आप गलत होंगे, यह सोचकर कि आप इस विचार के साथ आने वाले पहले व्यक्ति हैं और यह सोचकर कि यह वास्तव में काम करता है। और इसका कारण आपकी एन्क्रिप्शन योजना की ताकत से कोई लेना-देना नहीं है।