??? 我們做java開發(fā)的一般都會(huì)遇到如何保護(hù)我們開發(fā)的代碼問題。java語言由于是基于jvm上面,所以反編譯class文件很很容易。假如我們做了一個(gè)web程序,并把這個(gè)web程序發(fā)布給客戶。實(shí)際上,客戶是很容易反編譯出我們的源代碼出來,包括所有的src文件和jsp文件等等。
???那么,如何保護(hù)我們的源代碼,實(shí)際上,應(yīng)該有幾種方法可以使用:1、使用代碼混淆器? 2、重載應(yīng)用服務(wù)器的classloader
???對于第一種方法來說,現(xiàn)在外面有很多開源工具可以使用,個(gè)人認(rèn)為最好用的當(dāng)屬proguard莫屬。proguard主要是易用易學(xué)。而且提供的功能也挺多。下面是個(gè)人一點(diǎn)使用心得
???(1)、從網(wǎng)上download proguard工具,proguard工具主要包含是幾個(gè)jar文件和一些example,下載地址http://proguard.sourceforge.net/
???(2)、將里面的幾個(gè)jar文件添加到類路徑下面。當(dāng)然,也可以不添加,但是下面在做混淆的時(shí)候,必須指定classpath,使在做混淆的過程中,能否訪問該類
???(3)、編寫一個(gè)配置文件,主要是混淆器的一些參數(shù)。比如,下面是一個(gè)例子
-injars?????? platform.jar
-outjars????? platform_out.jar
-libraryjars? <java.home>/lib/rt.jar
-libraryjars ibatis-common-2.jar
-libraryjars ibatis-dao-2.jar
-libraryjars ibatis-sqlmap-2.jar
-libraryjars junit-3.8.1.jar
-libraryjars d:/j2ee.jar
-libraryjars struts.jar
-libraryjars commons-lang.jar
-libraryjars D:/0working/coreproject/byislib/jasperreports-0.6.1.jar
-libraryjars? commons-beanutils.jar
-printmapping proguard.map
-overloadaggressively
-defaultpackage ''
-allowaccessmodification
-dontoptimize
-keep public class *
{
?public protected *;
}
-keep public class org.**
-keep public class it.**
各個(gè)參數(shù)的含義參考proguard文檔,該文檔非常詳細(xì),上手很容易
OK,到此就完成了代碼混淆,打開產(chǎn)生的jar包可以看到,多了好多a、b、c之類的類文件。說明混淆結(jié)果已經(jīng)成功。將原jar刪除、運(yùn)行產(chǎn)生的混淆jar包,一切正常!
常見問題:使用過程中個(gè)人遇到了幾個(gè)問題,開始也是找了很久才解決
???a. 內(nèi)存溢出異常: 主要是proguard在做混淆的時(shí)候,吃了很多內(nèi)存,因此,在運(yùn)行混淆器的時(shí)候,可以增加內(nèi)存,比如 java -mx512m .....
? b.棧溢出異常: 主要是proguard在做混淆的時(shí)候,會(huì)對一些代碼進(jìn)行優(yōu)化,若遇到一些相對復(fù)雜的方法時(shí),可能會(huì)拋出此異常。對付的辦法是增加配置參數(shù)-dontoptimize,如上面的配置例子所示
對于第二種方法,重載服務(wù)器的classloader的原理是這樣。 首先我們通過一定算法把class文件加密; 然后寫我們自己的classloader,替換服務(wù)器的classloader。 這樣,我們可以讀取class文件,通過我們自己的算法反加密成正確的class,然后再次進(jìn)行l(wèi)oad。這個(gè)方式還沒應(yīng)用起來,這幾天個(gè)人正在研究,有什么新成果會(huì)在此做一些總結(jié)。