javarun

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            0 Posts :: 1 Stories :: 1 Comments :: 0 Trackbacks

          在java代碼中往往包含著一 些非常敏感的信息,有些關(guān)系到開發(fā)者的利益,有些可能因?yàn)槭褂铆h(huán)境不同而關(guān)系到軟件用戶的利益,于是,java程序是赤膊上陣還是全副武裝這個(gè)現(xiàn)實(shí)問題就 擺在了java開發(fā)人員的面前,所以在這種情況下,從開發(fā)商和用戶兩方面角度考慮,都非常有必要對java程序進(jìn)行保護(hù)。以下從技術(shù)角度就常見的保護(hù)措施 和常用工具來看看如何有效保護(hù)java代碼:

          1. 將java包裝成exe

            特點(diǎn):將jar包裝成可執(zhí)行文件,便于使用,但對java程序沒有任何保護(hù)。

            不要以為生成了exe就和普通可執(zhí)行文件效果一樣了。這些包裝成exe的程序運(yùn)行時(shí)都會(huì)將jar文件釋放到臨時(shí)目錄,很容易獲取。

            常用的工具有exe4j、jsmooth、NativeJ等等。jsmooth生成的exe運(yùn)行時(shí)臨時(shí)目錄在exe所在目錄中或是用戶臨時(shí)目錄 中;exe4j生成的exe運(yùn)行時(shí)臨時(shí)目錄在用戶臨時(shí)目錄中;NativeJ生成的exe直接用winrar打開,然后用zip格式修復(fù)成一個(gè)jar文 件,就得到了原文件。如果只是為了使用和發(fā)布方便,不需要保護(hù)java代碼,使用這些工具是很好的選擇。

          2. java混淆器

            特點(diǎn):使用一種或多種處理方式將class文件、java源代碼進(jìn)行混淆處理后生成新的class,使混淆后的代碼不易被反編譯,而反編譯后的代碼難以閱 讀和理解。

            這類混淆器工具很多,而且也很有成效。

            缺點(diǎn):雖然混淆的代碼反編譯后不易讀懂,但對于有經(jīng)驗(yàn)的人或是多花些時(shí)間,還是能找到或計(jì)算出你代碼中隱藏的敏感內(nèi)容,而且在很多應(yīng)用中不是全部代碼都能 混淆的,往往一些關(guān)鍵的庫、類名、方法名、變量名等因使用要求的限制反而還不能混淆。

          3. 隔離java程序到服務(wù)端

            特點(diǎn):把java程序放到服務(wù)端,讓用戶不能訪問到class文件和相關(guān)配套文件,客戶端只通過接口訪問。

            這種方式在客戶/服務(wù)模式的應(yīng)用中能較好地保護(hù)java代碼。

            缺點(diǎn)是:必須是客戶/服務(wù)模式,這種特點(diǎn)限制了此種方式的使用范圍;客戶端因?yàn)檫壿嫷谋┞妒冀K是較為薄弱的環(huán)節(jié),所以訪問接口時(shí)一般都需要安全性認(rèn)證。

          4. java加密保護(hù)

            特點(diǎn):自定義ClassLoader,將class文件和相關(guān)文件加密,運(yùn)行時(shí)由此ClassLoader解密相關(guān)文件并裝載類,要起到保護(hù)作用必須自定 義本地代碼執(zhí)行器將自定義ClassLoader和加密解密的相關(guān)類和配套文件也保護(hù)起來。

            此種方式能很有效地保護(hù)java代碼。

            缺點(diǎn):可以通過替換JRE包中與類裝載相關(guān)的java類或虛擬機(jī)動(dòng)態(tài)庫截獲java字節(jié)碼。

            jar2exe屬于這類工具。

          5. 提前編譯技術(shù)(AOT)

            特點(diǎn):將java代碼靜態(tài)編譯成本地機(jī)器碼,脫離通用JRE。

            此種方式能夠非常有效地保護(hù)java代碼,且程序啟動(dòng)比通用JVM快一點(diǎn)。

            具有代表性的是GNU的gcj,可以做到對java代碼完全提前編譯,但gcj存在諸多局限性,如:對JRE 5不能完整支持、不支持JRE 6及以后的版本。

            由于java平臺(tái)的復(fù)雜性,做到能及時(shí)支持最新java版本和JRE的完全提前編譯是非常困難的,所以這類工具往往采取靈活方式,該用即時(shí)編譯的地方還是 要用,成為提前編譯和即時(shí)編譯的混合體。

            缺點(diǎn):由于與通用JRE的差異和java運(yùn)用中的復(fù)雜性,并非java程序中的所有jar都能得到完全的保護(hù);只能使用此種工具提供的一個(gè)運(yùn)行環(huán)境,如果 工具更新滯后或你需要特定版本的JRE,有可能得不到此種工具的支持。

            Excelsior JET屬于這類工具。

          6. 使用jni方式保護(hù)

            特點(diǎn):將敏感的方法和數(shù)據(jù)通過jni方式處理。

            此種方式和“隔離java程序到服務(wù)端”有些類似,可以看作把需要保護(hù)的代碼和數(shù)據(jù)“隔離”到動(dòng)態(tài)庫中,不同的是可以在單機(jī)程序中運(yùn)用。

            缺點(diǎn)和上述“隔離java程序到服務(wù)端”類似。

          7. 不脫離JRE的綜合方式保護(hù)

            特點(diǎn):非提前編譯,不脫離JRE,采用多種軟保護(hù)方式,從多方面防止java程序被竊取。

            此種方式由于采取了多種保護(hù)措施,比如自定義執(zhí)行器和裝載器、加密、JNI、安全性檢測、生成可執(zhí)行文件等等,使保護(hù)力度大大增強(qiáng),同樣能夠非常有效地保 護(hù)java代碼。

            缺點(diǎn):由于jar文件存在方式的改變和java運(yùn)用中的復(fù)雜性,并非java程序中的所有jar都能得到完全的保護(hù);很有可能并不支持所有的JRE版本。

            JXMaker屬于此類工具。

          8. 用加密鎖硬件保護(hù)

            特點(diǎn):使用與硬件相關(guān)的專用程序?qū)ava虛擬機(jī)啟動(dòng)程序加殼,將虛擬機(jī)配套文件和java程序加密,啟動(dòng)的是加殼程序,由加殼程序建立一個(gè)與硬件相關(guān)的 受保護(hù)的運(yùn)行環(huán)境,為了加強(qiáng)安全性可以和加密鎖內(nèi)植入的程序互動(dòng)。

            此種方式與以上“不脫離JRE的綜合方式保護(hù)”相似,只是使用了專用硬件設(shè)備,也能很好地保護(hù)java代碼。

            缺點(diǎn):有人認(rèn)為加密鎖用戶使用上不太方便,且每個(gè)安裝需要附帶一個(gè)。

          從以上描述中我們可以看出:

          1. 各種保護(hù)方式都有其優(yōu)缺點(diǎn),應(yīng)根據(jù)實(shí)際選用
          2. 要更好地保護(hù)java代碼應(yīng)該使用綜合的保護(hù)措施
          3. 單機(jī)環(huán)境中要真正有效保護(hù)java代碼,必須要有本地代碼程序配合

          當(dāng)然,安全都是相對的,一方面看你的保護(hù)措施和使用的工具能達(dá)到的程度,一方面看黑客的意愿和能力,不能只從技術(shù)上保護(hù)知識(shí)產(chǎn)權(quán)。總之,在java 代碼保護(hù)方面可以采取各種可能的方式,不可拘泥于那些條條框框。

          posted on 2010-07-09 14:00 javarun 閱讀(1783) 評(píng)論(1)  編輯  收藏

          Feedback

          # re: 從常見的幾種方式看保護(hù)java代碼 2010-07-10 16:24 特立獨(dú)行
          多謝lz的分享 學(xué)習(xí)了 第一次接觸這方面的只是  回復(fù)  更多評(píng)論
            


          只有注冊用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 山丹县| 碌曲县| 大石桥市| 伊金霍洛旗| 镇赉县| 修武县| 镶黄旗| 招远市| 肇庆市| 古蔺县| 武鸣县| 沂南县| 漳浦县| 依安县| 屯留县| 三都| 六盘水市| 仪征市| 华池县| 河津市| 桐梓县| 万安县| 镇雄县| 峡江县| 余庆县| 东辽县| 牡丹江市| 兴业县| 镇远县| 紫阳县| 闻喜县| 铜山县| 莱阳市| 罗源县| 周口市| 宣城市| 虹口区| 囊谦县| 申扎县| 贵定县| 浦县|