天天看點

從技術角度保護java代碼的常見措施和常用工具

從技術角度就常見的保護措施和常用工具來看看如何有效保護java代碼:

1. 将java包裝成exe

特點:将jar包裝成可執行檔案,便于使用,但對java程式沒有任何保護。不要以為生成了exe就和普通可執行檔案效果一樣了。這些包裝成exe的程式運作時都會将jar檔案釋放到臨時目錄,很容易擷取。常用的工具有exe4j、jsmooth、NativeJ等等。jsmooth生成的exe運作時臨時目錄在exe所在目錄中或是使用者臨時目錄中;exe4j生成的exe運作時臨時目錄在使用者臨時目錄中;NativeJ生成的exe直接用winrar打開,然後用zip格式修複成一個jar檔案,就得到了原檔案。如果隻是為了使用和釋出友善,不需要保護java代碼,使用這些工具是很好的選擇。

2. java混淆器特點:

使用一種或多種處理方式将class檔案、java源代碼進行混淆處理後生成新的class,使混淆後的代碼不易被反編譯,而反編譯後的代碼難以閱讀和了解。這類混淆器工具很多,而且也很有成效。缺點:雖然混淆的代碼反編譯後不易讀懂,但對于有經驗的人或是多花些時間,還是能找到或計算出你代碼中隐藏的敏感内容,而且在很多應用中不是全部代碼都能混淆的,往往一些關鍵的庫、類名、方法名、變量名等因使用要求的限制反而還不能混淆。

3. 隔離java程式到服務端特點:

把java程式放到服務端,讓使用者不能通路到class檔案和相關配套檔案,用戶端隻通過接口通路。這種方式在客戶/服務模式的應用中能較好地保護java代碼。缺點是:必須是客戶/服務模式,這種特點限制了此種方式的使用範圍;用戶端因為邏輯的暴露始終是較為薄弱的環節,是以通路接口時一般都需要安全性認證。

4. 自定義ClassLoader保護特點:

自定義ClassLoader,将class檔案和相關檔案加密,運作時由此ClassLoader解密相關檔案并裝載類,要起到保護作用必須自定義本地代碼執行器将自定義ClassLoader和加密解密的相關類和配套檔案也保護起來。此種方式能很有效地保護java代碼。缺點:可以通過替換JRE包中與類裝載相關的java類或虛拟機動态庫截獲java位元組碼。 jar2exe屬于這類工具。

5. 提前編譯技術(AOT)

特點:将java代碼靜态編譯成本地機器碼,脫離通用JRE。此種方式能夠非常有效地保護java代碼,且程式啟動比通用JVM快一點。具有代表性的是GNU的gcj,可以做到對java代碼完全提前編譯,但gcj存在諸多局限性,如:對JRE 5不能完整支援、不支援JRE 6及以後的版本。由于java平台的複雜性,做到能及時支援最新java版本和JRE的完全提前編譯是非常困難的,是以這類工具往往采取靈活方式,該用即時編譯的地方還是要用,成為提前編譯和即時編譯的混合體。缺點:由于與通用JRE的差異和java運用中的複雜性,并非java程式中的所有jar都能得到完全的保護;隻能使用此種工具提供的一個運作環境,如果工具更新滞後或你需要特定版本的JRE,有可能得不到此種工具的支援。 Excelsior JET屬于這類工具。

6. 使用jni方式保護特點:

将敏感的方法和資料通過jni方式處理。此種方式和“隔離java程式到服務端”有些類似,可以看作把需要保護的代碼和資料“隔離”到動态庫中,不同的是可以在單機程式中運用。缺點和上述“隔離java程式到服務端”類似。

7. 不脫離JRE的綜合方式保護特點:

非提前編譯,不脫離JRE,采用多種軟保護方式,從多方面防止java程式被竊取。此種方式由于采取了多種保護措施,比如自定義執行器和裝載器、加密、JNI、安全性檢測、生成可執行檔案等等,使保護力度大大增強,同樣能夠非常有效地保護java代碼。缺點:由于jar檔案存在方式的改變和java運用中的複雜性,并非java程式中的所有jar都能得到完全的保護;很有可能并不支援所有的JRE版本。 JXMaker屬于此類工具。

8. 用加密鎖硬體保護特點:

使用與硬體相關的專用程式将java虛拟機啟動程式加殼,将虛拟機配套檔案和java程式加密,啟動的是加殼程式,由加殼程式建立一個與硬體相關的受保護的運作環境,為了加強安全性可以和加密鎖内植入的程式互動。此種方式與以上“不脫離JRE的綜合方式保護”相似,隻是使用了專用硬體裝置,也能很好地保護java代碼。缺點:有人認為加密鎖使用者使用上不太友善,且每個安裝需要附帶一個。

總結

從以上描述中我們可以看出:1.各種保護方式都有其優缺點,應根據實際選用2.要更好地保護java代碼應該使用綜合的保護措施3.單機環境中要真正有效保護java代碼,必須要有本地代碼程式配合當然,安全都是相對的,一方面看你的保護措施和使用的工具能達到的程度,一方面看黑客的意願和能力,不能隻從技術上保護知識産權。總之,在java代碼保護方面可以采取各種可能的方式,不可拘泥于那些條條框框。