Java 開發(fā)語言以其安全性高厨姚、代碼優(yōu)化、跨平臺等特性键菱,迅速取代了很多傳統(tǒng)高級語言谬墙,受到廣大編程人員和企業(yè)家的青睞。不過隨之產(chǎn)生的安全問題也越來越受到大家的關(guān)注经备,Java 最突出的跨平臺優(yōu)勢使其要以中間代碼的形式運(yùn)行在虛擬機(jī)環(huán)境中拭抬,因此 Java 代碼反編譯要比其他開發(fā)語言更容易實現(xiàn),并且反編譯的代碼經(jīng)過優(yōu)化后幾乎可與源代碼相媲美侵蒙。為了避免出現(xiàn)這種情況造虎,保護(hù)軟件知識產(chǎn)權(quán),我們需要采用加密技術(shù)對代碼進(jìn)行加密纷闺。
本文介紹使用xjar加密技術(shù)對jar包進(jìn)行加密算凿,主要針對maven構(gòu)建的項目,同時需要安裝go環(huán)境急但,通過在pom.xml中添加項目依賴澎媒,生成加密后的jar包以及go啟動器,再對go啟動器進(jìn)行編譯波桩,獲取到go執(zhí)行器戒努,最終以go執(zhí)行器啟動jar包來運(yùn)行項目。
一、Maven項目在pom.xml中添加項目依賴
<!-- 設(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打包后储玫,自動構(gòu)建出加密的jar包侍筛,生成加密jar的同時,目錄下還會生成go啟動器文件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驗證go是否配置正確:
3凡桥、配置好go的環(huán)境之后蟀伸,對啟動器文件xjar.go進(jìn)行編譯
當(dāng)前目錄下進(jìn)入cmd執(zhí)行:go build xjar.go,生成對應(yīng)的go執(zhí)行器(得到xjar.exe)
4缅刽、以go執(zhí)行器xjar.exe啟動jar包
執(zhí)行命令:xjar.exe java -jar afcApp.jar
測試服務(wù)調(diào)用是否正常:
6啊掏、填坑注意事項
打包時maven使用的是jdk8,本地是jdk11衰猛,啟動時一直報錯迟蜜。
查詢資料,部分人反饋:用jdk1.8編譯的jar被xjar加密后啡省,用jdk11是無法運(yùn)行小泉。此結(jié)論待進(jìn)一步驗證,目前將本地的jdk改成jdk8冕杠,可以正常運(yùn)行微姊。進(jìn)一步將maven中的jdk和本地jdk都改成11,不能正常啟動分预。測試結(jié)果:
ps:如何查看jar包的jdk版本:
原因:JDK-9及以上版本由于模塊化導(dǎo)致XJar無法使用 jdk.internal.loader 包的問題解決方案兢交。
解決方法:在啟動時添加參數(shù):--add-opens java.base/jdk.internal.loader=ALL-UNNAMED
添加參數(shù)之前啟動方式:xjar.exe java -jar afcApp.jar
添加參數(shù)之后啟動方式: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)版本號,則表示Go環(huán)境安裝成功
2救赐、配置好go的環(huán)境之后涧团,對xjar.go進(jìn)行編譯
執(zhí)行命令:go build xjar.go,生成對應(yīng)的go執(zhí)行器(得到xjar,這一點(diǎn)與windows系統(tǒng)不同泌绣。Windows系統(tǒng)得到的是xjar.exe)
3钮追、以go執(zhí)行器xjar啟動jar包
執(zhí)行命令:nohup ./xjar java -jar afcApp.jar&
帶參數(shù)啟動方式:
nohup ./xjar java --add-opens java.base/jdk.internal.loader=ALL-UNNAMED -jar afcApp.jar&