Java Class 加密工具 ClassFinal詳解
Jar包加密工具 ClassFinal
介紹
- ClassFinal 是一款 java class 文件安全加密工具,支持直接加密jar包或war包,無(wú)需修改任何項(xiàng)目代碼,兼容spring-framework;可避免源碼泄漏或字節(jié)碼被反編譯。
- 加密后,原始的class文件中方法體被清空,當(dāng)class被classloader加載時(shí),真正的方法體會(huì)被解密注入。
- 為兼容spring,swagger等掃描注解的框架,故而保留了方法參數(shù)、注解等信息;反編譯者只能看到方法名和注解;
- 注意:為了保證項(xiàng)目在運(yùn)行時(shí)的安全,啟動(dòng)jvm時(shí)請(qǐng)加參數(shù): -XX:+DisableAttachMechanism 。
此參數(shù)的含義是禁用JVM的附加機(jī)制。在JVM中,有一個(gè)附加機(jī)制可以讓外部進(jìn)程通過(guò)Java Debug Wire Protocol(JDWP)協(xié)議附加到正在運(yùn)行的Java進(jìn)程上,從而獲得進(jìn)程的調(diào)試信息。這個(gè)機(jī)制在調(diào)試和診斷Java應(yīng)用程序時(shí)非常有用。
然而,在某些情況下,禁用這個(gè)機(jī)制可以提高Java應(yīng)用程序的安全性。例如,如果您希望限制外部進(jìn)程對(duì)正在運(yùn)行的Java進(jìn)程的訪問(wèn),或者想要確保Java進(jìn)程不會(huì)被未經(jīng)授權(quán)的用戶附加和調(diào)試,您可以使用這個(gè)參數(shù)來(lái)禁用JVM的附加機(jī)制。當(dāng)使用這個(gè)參數(shù)時(shí),JVM將不再響應(yīng)任何附加請(qǐng)求,從而防止外部進(jìn)程通過(guò)JDWP協(xié)議附加到正在運(yùn)行的Java進(jìn)程上。
例:java -XX:+DisableAttachMechanism -jar MyApp.jar
環(huán)境依賴
JDK 1.8 +
使用說(shuō)明
下載
加密 命令行
執(zhí)行以下命令
java -jar classfinal-fatjar.jar -file jerry.jar -libjars a.jar,b.jar -packages com.jerry1,com.jerry2 -exclude com.jerry.Main -pwd 123456 -Y
參數(shù)說(shuō)明
-file 加密的jar/war完整路徑
-packages 加密的包名(可為空,多個(gè)用","分割)
-libjars jar/war包lib下要加密jar文件名(可為空,多個(gè)用","分割)
-cfgfiles 需要加密的配置文件,一般是classes目錄下的yml或properties文件(可為空,多個(gè)用","分割)
-exclude 排除的類名(可為空,多個(gè)用","分割)
-classpath 外部依賴的jar目錄,例如/tomcat/lib(可為空,多個(gè)用","分割)
-pwd 加密密碼,如果是#號(hào),則使用無(wú)密碼模式加密
-code 機(jī)器碼,在綁定的機(jī)器生成,加密后只可在此機(jī)器上運(yùn)行
-Y 無(wú)需確認(rèn),不加此參數(shù)會(huì)提示確認(rèn)以上信息
結(jié)果: 生成加密后的jar文件 jerry-encrypted.jar
。執(zhí)行時(shí)需帶 javaagent
參數(shù)。
注: 也可以直接執(zhí)行 java -jar classfinal-fatjar.jar 以交互式操作。
示例
我的jar包:jerry.jar
,密碼123456
java -jar classfinal-fatjar-1.2.1.jar -file jerry.jar -packages com.jerry -pwd 123456 -Y ========================================================= = = = Java Class Encryption Tool v1.2.1 by Mr.K = = = ========================================================= 加密信息如下: ------------------------- 1. jar/war路徑: jerry.jar 2. lib下的jar: 3. 包名前綴: com.jerry 4. 排除的類名: 5. 加密配置文件: 6. ClassPath: 7. 密碼: 123456 8. 機(jī)器碼: ------------------------- 處理中... 加密完成,請(qǐng)牢記密碼! ==>jerry-encrypted.jar
maven插件方式
在要加密的項(xiàng)目pom.xml中加入以下插件配置,目前最新版本是:1.2.1。
<build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <!-- https://gitee.com/roseboy/classfinal --> <groupId>net.roseboy</groupId> <artifactId>classfinal-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <!-- 加密打包之后pom.xml會(huì)被刪除,不用擔(dān)心在jar包里找到此密碼--> <password>jerry</password> <!-- 需要加密的包。多個(gè)以逗號(hào),分割 --> <packages>com.classfinal</packages> <!-- 需要加密的配置文件。多個(gè)以逗號(hào),分割 --> <cfgfiles>bootstrap.yml,application.yml</cfgfiles> <!-- 不想要加密的jar包。多個(gè)以逗號(hào),分割 --> <excludes>org.spring</excludes> <!-- 加密依賴的第三方j(luò)ar包。多個(gè)以逗號(hào),分割 --> <libjars>jerry-common-core-0.0.1.jar,jerry-common-redis-0.0.1.jar</libjars> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>classFinal</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
運(yùn)行mvn package
時(shí)會(huì)在target
下自動(dòng)加密生成yourpaoject-encrypted.jar
。
maven 插件的參數(shù)名稱與直接運(yùn)行的參數(shù)相同,請(qǐng)參考上節(jié)的參數(shù)說(shuō)明。
無(wú)密碼模式
- 加密時(shí)
-pwd
參數(shù)設(shè)為#
,啟動(dòng)時(shí)可不用輸入密碼; - 如果是war包,啟動(dòng)時(shí)指定參數(shù)
-nopwd
,跳過(guò)輸密碼過(guò)程。
機(jī)器綁定
機(jī)器綁定只允許加密的項(xiàng)目在特定的機(jī)器上運(yùn)行;
加密時(shí)用 -code
指定機(jī)器碼。機(jī)器綁定可同時(shí)支持機(jī)器碼
+密碼
的方式加密。
在需要綁定的機(jī)器上執(zhí)行以下命令,生成機(jī)器碼
java -jar classfinal-fatjar.jar -C
啟動(dòng)加密后的jar
加密后的項(xiàng)目需要設(shè)置 javaagent
來(lái)啟動(dòng),項(xiàng)目在啟動(dòng)過(guò)程中解密class,完全內(nèi)存解密,不留下任何解密后的文件。
解密功能已經(jīng)自動(dòng)加入到 yourpaoject-encrypted.jar
中,所以啟動(dòng)時(shí) -javaagent
與 -jar
相同,不需要額外的jar包。
密碼讀取順序:參數(shù)獲取
>> 環(huán)境變量獲取
>> 密碼文件獲取
>> 控制臺(tái)輸入
>> GUI輸入
>> 退出
啟動(dòng)參數(shù)給密碼
啟動(dòng)jar項(xiàng)目執(zhí)行以下命令:注意:如果是win系統(tǒng) "-pwd 0000000"
這里要用雙引號(hào)。
java -javaagent:jerry-encrypted.jar="-pwd 0000000" -jar jerry-encrypted.jar //參數(shù)說(shuō)明 // -pwd 加密項(xiàng)目的密碼 // -pwdname 環(huán)境變量中密碼的名字
不加密碼參數(shù)直接啟動(dòng)
1. 密碼文件獲取
java -javaagent:yourpaoject-encrypted.jar -jar yourpaoject-encrypted.jar
不加 pwd
參數(shù)直接啟動(dòng),優(yōu)先從密碼文件
讀取。
在同級(jí)目錄下的classfinal.txt
或jerry-encrypted.classfinal.txt
中寫入密碼。
直接給密碼:classfinal.txt
123456
參數(shù)化配置啟動(dòng)后刪除:classfinal.txt
--pwd 123456 --del yes
這里的del
只要不給false
或no
都會(huì)刪除。
項(xiàng)目讀取到密碼后會(huì)清空此文件。
2. 交互輸入
沒(méi)有找到 密碼文件
就會(huì)進(jìn)入交互輸入模式:先控制臺(tái)輸入
還是沒(méi)給密碼就會(huì)進(jìn)入 GUI輸入
模式,都不給密碼,就報(bào)錯(cuò)退出了。
控制臺(tái)輸入
GUI輸入
參考資料
Gitee: https://gitee.com/roseboy/classfinal
到此這篇關(guān)于Java Class 加密工具 ClassFinal的文章就介紹到這了,更多相關(guān)java加密class內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中使用Cookie實(shí)現(xiàn)記住登錄的示例代碼
這篇文章主要介紹了SpringBoot中使用Cookie實(shí)現(xiàn)記住登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07SpringBoot整合ZXing實(shí)現(xiàn)二維碼和條形碼的創(chuàng)建
如今我們?cè)絹?lái)越多的東西需要用到二維碼或者條形碼,商品的條形碼,付款的二維碼等等,所以本文小編給大家介紹了SpringBoot整合ZXing實(shí)現(xiàn)二維碼和條形碼的創(chuàng)建,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Java如何通過(guò)枚舉實(shí)現(xiàn)有限狀態(tài)機(jī)
這篇文章主要介紹了Java如何通過(guò)枚舉實(shí)現(xiàn)有限狀態(tài)機(jī),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Java微信公眾平臺(tái)開(kāi)發(fā)(4) 回復(fù)消息的分類及實(shí)體的創(chuàng)建
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開(kāi)發(fā)第四步,回復(fù)消息的分類及實(shí)體的創(chuàng)建,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04springMVC中@RequestParam和@RequestPart的區(qū)別
本文主要介紹了springMVC中@RequestParam和@RequestPart的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06