一般公司開發的專案上線前都會做安全審核,為了保護一些私密**和一些敏感資訊,均需要加密處理,比如各種密碼、license處理的等,就用到jar包混淆。
jar包混淆工具挺多的,實現原理不盡相同,這裡使用的classfinal,
classfinal是一款j**a class檔案安全加密工具,支援直接加密jar包或war包,無需修改任何專案**,相容spring-framework;可避免原始碼洩漏或位元組碼被反編譯。
gitee:
jdk 1.8 +
執行以下命令
j**a -jar classfinal-fatjar.jar -file yourproject.jar -libjars a.jar,b.jar -packages com.yourpackage,com.yourpackage2 -exclude com.yourpackage.main -pwd123456 -y
引數說明
-file 加密的jar/war完整路徑
-packages 加密的包名(可為空,多個用","
分割)-libjars jar/war包lib下要加密jar檔名(可為空,多個用","
分割)-cfgfiles 需要加密的配置檔案,一般是classes目錄下的yml或properties檔案(可為空,多個用","
分割)-exclude 排除的類名(可為空,多個用","
分割)-classpath 外部依賴的jar目錄,例如/tomcat/lib(可為空,多個用","
分割)-pwd
加密密碼,如果是#號,則使用無密碼模式加密
-code 機器碼,在繫結的機器生成,加密後只可在此機器上執行
-y 無需確認,不加此引數會提示確認以上資訊
結果: 生成 yourpaoject-encrypted.jar,這個就是加密後的jar檔案;加密後的檔案不可直接執行,需要配置j**aagent。
注: 以上示例是直接用引數執行,也可以直接執行 j**a -jar classfinal-fatjar.jar按照步驟提示輸入資訊完成加密。在要加密的專案pom.xml中加入以下外掛程式配置,目前最新版本是:1.2.1。
<plugin
>
<
groupid
>net.roseboy
groupid
>
<
artifactid
>classfinal-m**en-plugin
artifactid
>
<
version
>$
version
>
<
configuration
>
<
password
>000000
password
>
<
packages
>com.yourpackage,com.yourpackage2
packages
>
<
cfgfiles
cfgfiles
>
<
excludes
>org.spring
excludes
>
<
libjars
>a.jar,b.jar
libjars
>
configuration
>
<
executions
>
<
execution
>
<
phase
>package
phase
>
<
goals
>
<
goal
>classfinal
goal
>
goals
>
execution
>
executions
>
plugin
>
執行mvn package時會在target下自動加密生成yourpaoject-encrypted.jar。
m**en外掛程式的引數名稱與直接執行的引數相同,請參考上節的引數說明。
加密時-pwd引數設為#,啟動時可不用輸入密碼; 如果是war包,啟動時指定引數 -nopwd,跳過輸密碼過程。
機器繫結只允許加密的專案在特定的機器上執行;
在需要繫結的機器上執行以下命令,生成機器碼
j**a -jar classfinal-fatjar.jar -c
加密時用-code指定機器碼。機器繫結可同時支援機器碼+密碼的方式加密。
加密後的專案需要設定j**aagent來啟動,專案在啟動過程中解密class,完全記憶體解密,不留下任何解密後的檔案。
解密功能已經自動加入到 yourpaoject-encrypted.jar中,所以啟動時-j**aagent與-jar相同,不需要額外的jar包。
啟動jar專案執行以下命令:
j**a -j**aagent:yourproject-encrypted.jar='-pwd 0000000
' -jar yourproject-encrypted.jar
//引數說明
//-pwd 加密專案的密碼
//-pwdname 環境變數中密碼的名字
j**a -j**aagent:yourpaoject-encrypted.jar -jar yourproject-encrypted.jar
使用nohup命令啟動時,如果系統支援gui,會彈出輸入密碼的介面,如果是純命令列下,不支援gui,則需要在同級目錄下的classfinal.txt或yourpaoject-encrypted.classfinal.txt中寫入密碼,專案讀取到密碼後會清空此檔案。
密碼讀取順序已經改為:引數獲取密碼||環境變數獲取密碼||密碼檔案獲取密碼||控制台輸入密碼||gui輸入密碼||退出
//linux下 catalina.sh
catalina_opts="
$catalina_opts -j**aagent:classfinal-fatjar.jar='-pwd 0000000'";
export catalina_opts;
//win下catalina.bat
set j**a_opts="
-j**aagent:classfinal-fatjar.jar='-pwd 000000'"//
引數說明
//-pwd 加密專案的密碼
//-nopwd 無密碼加密時啟動加上此引數,跳過輸密碼過程
//-pwdname 環境變數中密碼的名字
本工具使用aes演算法加密class檔案,密碼是保證不被破解的關鍵,請儲存好密碼,請勿洩漏。
密碼一旦忘記,專案不可啟動且無法恢復,請牢記密碼。
本工具加密後,原始的class檔案並不會完全被加密,只是方法體被清空,保留方法引數、註解等資訊,這是為了相容spring,swagger等掃瞄註解的框架; 方法體被清空後,反編譯者只能看到方法名和註解,看不到方法的具體內容;當class被classloader載入時,真正的方法體會被解密注入。
為了保證專案在執行時的安全,啟動jvm時**引數: -xx:+disableattachmechanism 。
jar包公升級,jar包衝突
事件 需要將clientlibrary 1.0.jar公升級為clientlibrary 1.1.jar,對jar包版本進行公升級 檢查原因 檢查備份系統可正常訪問,公升級jar包後出現同樣問題,確定jar的問題,getbean name 引用的spring.jar中的org.springframe...
Android 混淆打包不混淆第三方jar包
專案由於要公布,所以要混淆打包。混淆打包流程 1.在proguard project.txt檔案裡加入不須要混淆的類和第三方的jar包 這個是保持自己包中不須要混淆的類,假設有些類呼叫了jni也不須要混淆,不然會出錯。還有假設專案中有其它專案作為library引入,那這些專案的一些類也不能混淆。這個...
前端加密辦法之混淆js加密
每個頁面都是有資料和頁面結構以及樣式組成,對於單頁面的作者來說這中分離的感覺會明顯一點,那當我們通過ajax請求拿到資料之後我們一般就是把資料渲染到頁面,但是資料介面又不想那麼明顯是乙個json字串,資料加密一半採用混淆的js的做法,比如如果你使用的是react的話,react更新資料的是this....