Java 開發(fā)語言以其安全性高、代碼優(yōu)化、跨平臺(tái)等特性,迅速取代了很多傳統(tǒng)高級(jí)語言,受到廣大編程人員和企業(yè)家的青睞。不過隨之產(chǎn)生的安全問題也越來越受到大家的關(guān)注,Java 最突出的跨平臺(tái)優(yōu)勢(shì)使其要以中間代碼的形式運(yùn)行在虛擬機(jī)環(huán)境中,因此 Java 代碼反編譯要比其他開發(fā)語言更容易實(shí)現(xiàn),并且反編譯的代碼經(jīng)過優(yōu)化后幾乎可與源代碼相媲美。為了避免出現(xiàn)這種情況,保護(hù)軟件知識(shí)產(chǎn)權(quán),我們需要采用加密技術(shù)對(duì)代碼進(jìn)行加密。
本文介紹使用xjar加密技術(shù)對(duì)jar包進(jìn)行加密,主要針對(duì)maven構(gòu)建的項(xiàng)目,同時(shí)需要安裝go環(huán)境,通過在pom.xml中添加項(xiàng)目依賴,生成加密后的jar包以及go啟動(dòng)器,再對(duì)go啟動(dòng)器進(jìn)行編譯,獲取到go執(zhí)行器,最終以go執(zhí)行器啟動(dòng)jar包來運(yùn)行項(xiàng)目。
一、Maven項(xiàng)目在pom.xml中添加項(xiàng)目依賴
<!-- 設(shè)置 jitpack.io 插件倉庫 -->
<pluginRepositories>
<pluginRepository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</pluginRepository>
</pluginRepositories>
<!-- 添加 XJar Maven 插件 -->
<build>
<plugin>
<groupId>com.github.core-lib</groupId>
<artifactId>xjar-maven-plugin</artifactId>
<version>4.0.2</version>
<executions>
<execution>
<goals>
<goal>build</goal>
</goals>
<phase>package</phase>
<configuration>
<password>123456</password>
<!-- 需要加密的資源路徑表達(dá)式 -->
<includes>
<include>net/hfmri/**</include>
<include>mapper/*Mapper.xml</include>
<include>conf/**</include>
</includes>
<!-- 無需加密的資源路徑表達(dá)式 -->
<excludes>
<exclude>static/**</exclude>
<exclude>META-INF/**</exclude>
</excludes>
<!-- 目標(biāo)jar存放目錄 -->
<targetDir>${project.build.directory}\xJarDir\</targetDir>
<!-- 目標(biāo)jar名稱,也可以用表達(dá)式(參考官網(wǎng)) -->
<targetJar>afcApp.jar</targetJar>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Maven使用package打包后,自動(dòng)構(gòu)建出加密的jar包,生成加密jar的同時(shí),目錄下還會(huì)生成go啟動(dòng)器文件xjar.go。
我們使用反編譯工具查看加密后的jar包是否還能看到編譯后的代碼:顯示INTERNAL ERROR 不再展示源代碼。
得到加密后的jar包之后,區(qū)分windows系統(tǒng)還是linux系統(tǒng)進(jìn)行下一步操作。
二、windows系統(tǒng)
1、安裝go環(huán)境
(1)選擇windows版本下載
(2)下載之后,一步步按照操作指引安裝。我的安裝目錄:D:\install\go\install
2、安裝完成之后配置系統(tǒng)環(huán)境變量
進(jìn)入cmd驗(yàn)證go是否配置正確:
3、配置好go的環(huán)境之后,對(duì)啟動(dòng)器文件xjar.go進(jìn)行編譯
當(dāng)前目錄下進(jìn)入cmd執(zhí)行:go build xjar.go,生成對(duì)應(yīng)的go執(zhí)行器(得到xjar.exe)
4、以go執(zhí)行器xjar.exe啟動(dòng)jar包
執(zhí)行命令:xjar.exe java -jar afcApp.jar
測(cè)試服務(wù)調(diào)用是否正常:
6、填坑注意事項(xiàng)
打包時(shí)maven使用的是jdk8,本地是jdk11,啟動(dòng)時(shí)一直報(bào)錯(cuò)。
查詢資料,部分人反饋:用jdk1.8編譯的jar被xjar加密后,用jdk11是無法運(yùn)行。此結(jié)論待進(jìn)一步驗(yàn)證,目前將本地的jdk改成jdk8,可以正常運(yùn)行。進(jìn)一步將maven中的jdk和本地jdk都改成11,不能正常啟動(dòng)。測(cè)試結(jié)果:
ps:如何查看jar包的jdk版本:
原因:JDK-9及以上版本由于模塊化導(dǎo)致XJar無法使用 jdk.internal.loader 包的問題解決方案。
解決方法:在啟動(dòng)時(shí)添加參數(shù):--add-opens java.base/jdk.internal.loader=ALL-UNNAMED
添加參數(shù)之前啟動(dòng)方式:xjar.exe java -jar afcApp.jar
添加參數(shù)之后啟動(dòng)方式:xjar.exe java --add-opens java.base/jdk.internal.loader=ALL-UNNAMED -jar afcApp.jar
三、linux系統(tǒng)
1、Linux下載安裝go環(huán)境
(1)選擇linux版本下載
或使用命令下載wget https://studygolang.com/dl/golang/go1.16.3.linux-amd64.tar.gz
(2)解壓tar.gz包:tar -zxvf go1.16.3.linux-amd64.tar.gz 到自己需要安裝的目錄下(比如/usr/loacl)
(3)添加/usr/loacl/go/bin目錄到PATH變量中。在/etc/profile文件最后一行添加兩行代碼。
vim /etc/profile
// 在最后一行后添加
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
// wq保存退出后source一下,讓配置文件生效
source /etc/profile
(4)執(zhí)行g(shù)o version,如果出現(xiàn)版本號(hào),則表示Go環(huán)境安裝成功
2、配置好go的環(huán)境之后,對(duì)xjar.go進(jìn)行編譯
執(zhí)行命令:go build xjar.go,生成對(duì)應(yīng)的go執(zhí)行器(得到xjar,這一點(diǎn)與windows系統(tǒng)不同。Windows系統(tǒng)得到的是xjar.exe)
3、以go執(zhí)行器xjar啟動(dòng)jar包
執(zhí)行命令:nohup ./xjar java -jar afcApp.jar&
帶參數(shù)啟動(dòng)方式:
nohup ./xjar java --add-opens java.base/jdk.internal.loader=ALL-UNNAMED -jar afcApp.jar&