日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
這什么代碼,沒法看了...

哈嘍,大家好,我是指北君。

站在用戶的角度思考問題,與客戶深入溝通,找到中原網(wǎng)站設計與中原網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋中原地區(qū)。

今天和大家一起學習下java中的代碼混淆技術,后面你也可以讓你的代碼不再裸露在外了,讓人輕易窺視

代碼混淆技術

當需要閱讀jar文件的內容時,可能你會使用一些反編譯工具,比如jd-gui,但是否有遇到反編譯后的內容和想象的不一樣,但正常引用該jar又都是正常的?

開始的話

前段時間,使用了docx4j的庫來操作.docx文件進行一些復雜的操作,比如對多個docx文件進行合并,在網(wǎng)上找了很多的方式發(fā)現(xiàn)最終生成的文檔都有很多多余的內容, 導致原本幾兆的文件合并后有幾十兆,記得docx4j官網(wǎng)有提供商業(yè)版本的方法,準備窺探下其源碼來研究下,然而當我下載好jar后打開時,我蒙了...

簡介

我們知道,一般情況下編譯打包后的jar文件可以通過反編譯工具看到jar中的接口、類、方法都是可以被,這樣相關的代碼實現(xiàn)很容易被模仿借鑒,企業(yè)的核心代碼很可能被人盜用。特別是一些涉密較強或者商業(yè)性的行業(yè)軟件,當被拿到jar并反編譯后如同開源一般。那么通過對class文件進行字節(jié)碼級別的混淆加密,就能夠在一定程度防止技術被模仿或復用, 從而對java軟件起到很好的保護作用。

實現(xiàn)方式

  1. 對class文件進行加密,但是需要特定的Classloader在加載class時對其解密
  2. 針對class文件反編譯原理,通過花指令防止文件被反編譯
  3. 基于代碼混淆技術,對代碼中的包、類、方法等名稱進行混淆,從而提高代碼閱讀成本

示例

今天主要介紹通過第3種方法實現(xiàn)代碼混淆,這里主要使用了proguard工具對應的maven插件proguard-maven-plugin:

Proguard是一個Java類文件壓縮器、優(yōu)化器、混淆器、預校驗器。壓縮環(huán)節(jié)會檢測以及移除沒有用到的類、字段、方法以及屬性。優(yōu)化環(huán)節(jié)會分析以及優(yōu)化方法的字節(jié)碼?;煜h(huán)節(jié)會用無意義的短變量去重命名類、變量、方法。這些步驟讓代碼更精簡,更高效,也更難被逆向(破解)

比如我們基于Restful開發(fā)一個用戶服務接口

  1. 可能你的項目結構會是這樣的:
packages...
├ entity
| ├ User
├ dao
| ├ UserDao
| ├ impl
| ├ UserDaoImpl
├ service
| ├ UserService
| ├ impl
| ├ UserServiceImpl
├ web
| ├ UserController

通過命令mvn package打包后,結構是這樣的:

  1. 現(xiàn)在引入proguard:

需要在pom.xml中build標簽中加入插件,具體配置如下:



com.github.wvengen
proguard-maven-plugin
2.6.0



package


proguard





true

${project.build.finalName}.jar

${project.build.finalName}-pg.jar

true

${project.basedir}/proguard.cfg

pg


${java.home}/lib/rt.jar


!META-INF/**

${project.basedir}/target





其中配置文件proguard.cfg如下:

#指定Java的版本
-target 1.8
#proguard會對代碼進行優(yōu)化壓縮,他會刪除從未使用的類或者類成員變量等
-dontshrink
#是否關閉字節(jié)碼級別的優(yōu)化,如果不開啟則設置如下配置
-dontoptimize
#混淆時不生成大小寫混合的類名,默認是可以大小寫混合
-dontusemixedcaseclassnames
# 對于類成員的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆時不生成大小寫混合的類名,默認是可以大小寫混合
-dontusemixedcaseclassnames
#混淆類名之后,對使用Class.forName('className')之類的地方進行相應替代
-adaptclassstrings

#對異常、注解信息予以保留
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# 此選項將保存接口中的所有原始名稱(不混淆)-->
# -keepnames interface ** { *; }
# 此選項將保存所有軟件包中的所有原始接口文件(不進行混淆)
#-keep interface * extends * { *; }
#保留參數(shù)名,因為控制器,或者Mybatis等接口的參數(shù)如果混淆會導致無法接受參數(shù),xml文件找不到參數(shù)
-keepparameternames
# 保留枚舉成員及方法
-keepclassmembers enum * { *; }
# 不混淆所有類,保存原始定義的注釋-
-keepclassmembers class * {
@org.springframework.context.annotation.Bean *;
@org.springframework.beans.factory.annotation.Autowired *;
@org.springframework.beans.factory.annotation.Value *;
@org.springframework.stereotype.Service *;
@org.springframework.stereotype.Component *;
}

#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
  1. 執(zhí)行打包命令mvc package,可以看到target目錄下新增了幾個文件
  • obfuscation-pg.jar 混淆處理后的輸出jar
  • proguard_map.txt 存放混淆前后類、方法的對應關系
  • proguard_seed.txt 存放保持不變的類 可見包的名稱、類名都改成了短字母

實現(xiàn)技術

通過proguard來實現(xiàn)class內容的混淆相對比較簡單,當然還有很多其他的技術方法,比如上面說到的對class進行加密這種更安全的技術手段,感興趣的你可以繼續(xù)探究。

  • 其他技術
  • Jocky
  • retroguard
  • androidkiller
  • ClassFinal

結束語

此篇文章簡單介紹了java中的代碼混淆技術,我們可以根據(jù)具體的項目需求對編譯后的代碼進行混淆或加密處理,從而保護自己的勞動成果。開頭看到的docx4j企業(yè)級功能提供 的jar具體是怎么實現(xiàn)代碼保護的,目前還沒發(fā)現(xiàn)其具體采用了什么技術實現(xiàn),后面繼續(xù)研究。


分享題目:這什么代碼,沒法看了...
瀏覽地址:http://www.dlmjj.cn/article/dpjhjdg.html