برنامههاي نوشته شده در جاوا بهدليل استفاده از واسط زمان اجراي Java Runtime Environment يا بهطور اختصار JRE براي مهيا کردن بستري مناسب براي جلوگيري از کامپايل مجدد کد منبع و همچنين حفظ قابليت جابهجايي و استفاده در پلتفرمهاي مختلف، پس از کامپايل بهجاي تبديل شدن به زبان ماشين يا همان «صفر» و «يک» به قالب خاصي از دادهها بهنام Byte Code تبديل ميشود که اين خروجي همان قالب قابل فهم و اجرا براي JRE است.
همين موضوع باعث ميشود کد برنامههاي نوشته شده به زبان جاوا را با استفاده از متدهاي مهندسي معکوس تا حدود زيادي بازيابي کرد. اين مشکل بهحدي جدي است که شرکت توسعهدهنده زبان جاوا يعني سانميكروسيستمز، اقدام به ارائه ابزاري بهنام Obfuscator براي مبهمسازي کد منبع نوشته شده از طريق تزريق کدهاي اضافي بهزبان جاوا کرده تا پس از انجام عمليات ديكامپايل، کاربران نتوانند بهراحتي قطعات مختلف کد حاصل را درك و تفسير کنند.
اجراي اين برنامه بهگونهاي است كه در بدنه توابع و کلاسها در نتيجه نهايي و خروجي اصلي برنامه تغييري را در پي نخواهد داشت. البته استفاده از اين متد که بهصورت توكار (يا درونساخت Built-in) هم در کتابخانههاي جاوا و هم توسط IDE پيشفرض شرکت سان، يعني Netbeans نيز پشتيباني ميشود، نميتواند تمام آنچه که برنامهنويسان براي ايجاد امنيت بيشتر به آن نياز دارند را تامين کند. گذشته از اين، استفاده از روش مذکور سبب افزايش حجم فايل اجرايي پس از کامپايل، کندي در بارگذاري و اجراي برنامه، سختتر شدن انجام عمليات اشكالزدايي (ديباگ)، بالا بردن ميزان استفاده از حافظه اصلي و تحميل بار مضاعف بر دوش پردازنده بهدليل استفاده مکرر از حلقههاي تکرار و تصميمگيري ميشود.
در اين ميان روشي کاملا ابتکاري توسط برخي برنامهنويسان براي هر چه بالاتر بردن ضريب امنيت در کدهاي جاوا يا حتي ديگر زبانهاي برنامهنويسي که از يک قالب همسان با فريمورك جاوا بهره ميبرند، ارائه شده است. اين روش که به متد رمزگذاري (Encryption) معروف است، هماكنون بهعنوان يکي از بهترين و موثرترين راهحلهاي مطرحشده براي حفاظت از کدهاي جاوا شناخته ميشود. تفاوت عمده اين روش با ديگر متدها در اين است که روش رمزگذاري از آغاز تا پايان بايد توسط برنامهنويس و گروه توسعهدهنده پروژه پيادهسازي شود؛ برخلاف روش Obfuscator که براي مبهم کردن کد منبع از الگوهاي محدود و تکراري استفاده ميکند.
شايد اين موضوع در نگاه اول کمي دشوار بهنظر برسد اما کارايي واقعي روش رمزگذاري به اين موضوع وابسته است که منطق رمزنگاري در برنامه شما ميتواند کاملا متفاوت با تصور ديگران يا بهعبارت ديگر کاملا ابتکاري و شخصي باشد.
رفتار متد رمزگذاري
در اين روش فرض بر اين است که تمام يا تعدادي از کلاسهاي نوشته شده، بهجز کلاس اصلي پروژه و کلاسي که قرار است عمليات كدبرداري ديگر کلاسها را انجام دهد، با استفاده از يک برنامه واسط و يک کليد اصلي به مجموعهاي از کاراکترهاي غيرقابل فهم و نامفهوم تبديل شده است. سپس کلاسهاي کدشده در مسير مناسب به پروژه افزوده ميشوند.
کلاس اصلي پروژه بايد بتواند با استفاده از توابعي که براي رمزگشايي کلاسهاي کدشده توسط برنامهنويس طراحي شدهاند، کلاسهاي مذکور را در حافظه ديكد و بازسازي کند تا در محل و زمان مناسب فراخواني و استفاده شوند. به اين ترتيب حتي بعد از ديكامپايل شدن برنامه نيز کاربران با انبوهي از کلاسهاي رمزگذاري شده و کاراکترهاي غيرقابل فهم روبهرو خواهند شد.
نحوه پيادهسازي
پيش از هر چيز بايد گفت که بهترين حالت ممکن براي پيادهسازي روش رمزگذاري، زماني است که تمام برنامهنويسيهاي مربوط به کلاسها و متدهايشان بهصورت کامل انجام شده و پروژه آماده کامپايل شدن نهايي باشد. همانطور که پيشتر نيز گفته شد، براي پيادهسازي اين متد ما نياز به يک برنامه واسط براي رمزنگاري کلاسهاي مورد نظرمان با استفاده از يک کليد اصلي و بر اساس الگويي که برنامهنويس مشخص کرده است داريم. براي نمونه، برنامه سادهاي بنويسيد که تمام کاراکترهاي يک فايل از نوع کلاس جاوا را بهعنوان ورودي دريافت کرده و با يک مقدار بهعنوان کليد اصلي XOR کند. سپس بايد کلاس يا تابع مستقلي براي كدبرداري کلاسهاي رمزگذاريشده با استفاده از همان کليد اصلي نوشته شود تا در هنگام اجراي برنامه بتوانيم با فراخواني آن، کلاسهاي کد شده را در حافظه رمزگشايي و دوبارهسازي کنيم و سرانجام برنامه بدون هيچ مشکلي بتواند اجرا شود. توجه داشته باشيد که کليد اصلي بهعنوان يک عنصر حياتي براي حفظ امنيت و حتي ضامن اجراي صحيح برنامه، ميتواند براي هر کلاس بهصورت متفاوت توليد شود يا از مجموعه چند عمليات پيچيده رياضي روي مقادير گوناگون بهدست آمده باشد، يا حتي روي يک قفل سختافزاري ذخيره شود تا برنامه بدون وجود آن اصلا اجرا هم نشود.
براي پنهان ماندن الگوريتم كدبرداري کلاسها نيز ميتوانيد از فايلهاي کتابخانهاي پويا و استاندارد (براي ويندوز پسوند dll و براي گنولينوکس پسوند so) نوشتهشده با زبان C استفاده کنيد. البته در اين حالت پيادهسازي الگوريتم رمزگشايي بايد در همين کتابخانهها انجام شود و همينطور براي حفظ قابليت اجرا و انتقال روي ساير پلتفرمها نيز بايد کتابخانههاي مورد نياز و قابل استفاده روي ساير پلتفرمها را هم ايجاد کرده و همراه با ديگر منابع به پروژه بيفزاييد تا بتوانيد با توجه به نوع سيستمعامل، فايل کتابخانه مورد نظر را بارگذاري کرده و توابع مورد نياز براي رمزگشايي را از داخل اين فايلها فراخواني کنيد.
نتيجهگيري
روش يا متد رمزگذاري راهحل مناسبي براي حفظ امنيت کد برنامههاي نوشته شده به زبان جاواست که بر خلاف ديگر روشهاي معمول در روند عادي اجراي برنامه خللي وارد نميکند و در صورتي که بهدرستي پيادهسازي شود حتي ميتوان با اتکا به آن از فريمورك جاوا، بدون ترس از ديكامپايل شدن برنامه در پروژههاي تجاري بزرگ و مستقل از سکو نيز استفاده کرد و با خيال راحت از مواهب بسيار زياد جاوا برخوردار شد.