最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

jar包加密方案分享

 更新時(shí)間:2021年06月15日 11:55:11   作者:H.U.C-王子  
如何對jar包進(jìn)行加密呢?其實(shí)沒有想象中的那么困難,有一款開源工具已經(jīng)提供了較為完善的加密方案,這款開源工具的名字叫做xjar。接下來我們就看一下使用xjar工具給jar包加密有多么的容易。

前言

jar包相信大家都很熟悉,是通過打包java工程而獲得的產(chǎn)物,但是jar包是有一個(gè)致命的缺點(diǎn)的,那就是很容易被反編譯,只需要使用jd-gui就可以很容易的獲取到j(luò)ava源碼。

如果你想要防止別人反編譯做逆向工程,那么對jar包進(jìn)行一次加密就是一項(xiàng)很重要的工作了。

開源jar加密分為兩種一種代碼混淆,一種字節(jié)碼轉(zhuǎn)換。

字節(jié)碼混淆,主要思路就是的對類名,變量名和方法名,局部參數(shù)名進(jìn)行替換,讓其命名變得無意義,很難讀懂,但不影響其邏輯,但對于有耐心的人,還是能看明白!具體實(shí)現(xiàn)是在編譯前做的混淆,還是編譯后做的混淆,這個(gè)沒用過不太清楚。

字節(jié)碼轉(zhuǎn)換,分為兩塊,一塊是加密,對編譯后class文件進(jìn)行字節(jié)碼轉(zhuǎn)換(可以采用加密算法,字節(jié)碼異或運(yùn)算或自己定義規(guī)則);一塊是解密,就是在類加載的時(shí)候?qū)用艿淖止?jié)碼進(jìn)行解密。加密這塊因?yàn)樵诒镜貙lass文件字節(jié)碼轉(zhuǎn)換,比較簡單,方式也隨意;解密這塊主要圍繞類加載器來做文章,又可分為java版實(shí)現(xiàn)和C/C++版實(shí)現(xiàn),java版主要基于-agentJava:xxx.jar,通過Premain-Class,向Instrumentation注入ClassFileTransformer實(shí)現(xiàn),自己在ClassFileTransformer中對需要解密的class文件進(jìn)行解密;C/C++主要使用-agentpath:xxx.so,基于JVMTI通過C/C++實(shí)現(xiàn),對類加載過程進(jìn)行操作。

總體來說:代碼混淆和字節(jié)碼轉(zhuǎn)換可以結(jié)合,例如,先代碼混淆后,再對字節(jié)碼加密,運(yùn)行時(shí)對字節(jié)碼解密。代碼混淆,上手最簡單,加密級別比較低,也容易破解。字節(jié)碼轉(zhuǎn)換,java版本對于java熟練人員上手很快,加密級別一般,個(gè)人理解該方式一個(gè)缺陷就是對于想加密的內(nèi)容加密了,但解密方式暴露了,如果能夠隱藏好解密方式,加密安全系數(shù)還是蠻高;C/C++版加密級別最高,但需要對java和C/C++都很熟練,而且需要研究JVMTI相關(guān)知識,如果真的實(shí)現(xiàn)了基本無破解風(fēng)險(xiǎn),不過對于SpringBoot等框架,其內(nèi)部會直接分析class文件,有些坑需要解決。

另外一個(gè)問題就是,使用jar加密這塊,需要確定好是對運(yùn)行的主程序jar包加密,還是第三方j(luò)ar加密,其還是有部分差異的。

基礎(chǔ)環(huán)境準(zhǔn)備

現(xiàn)在假設(shè)你的項(xiàng)目是一個(gè)maven項(xiàng)目(目前不使用maven的項(xiàng)目已經(jīng)不多了),那么加密起來特別的容易,

首先就是要在你的pom文件中增加插件倉庫地址,如下:

    <pluginRepositories>
        <pluginRepository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </pluginRepository>
    </pluginRepositories>

然后在pom文件中增加如下插件:

<plugin>
                <groupId>com.github.core-lib</groupId>
                <artifactId>xjar-maven-plugin</artifactId>
                <version>4.0.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <phase>install</phase>

                        <configuration>
                            <includes>
                                <include>/com/huc/**/*.class</include>
                                <include>/mapper/**/*Mapper.xml</include>
                                <include>/*.yml</include>
                            </includes>
                            <excludes>
                                <exclude>/templates/**.*</exclude>
                                <exclude>/static/**.*</exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

這樣,我們的準(zhǔn)備工作就做完了,需要注意的是,includes代表我們想要加密的內(nèi)容,采用的是Ant表達(dá)式,excludes代表的是不需要加密的內(nèi)容,同樣使用的Ant表達(dá)式。

一般情況下我們建議這兩處內(nèi)容必填,如果不填寫,會加密整個(gè)jar包中的所有文件,這樣其實(shí)是沒有必要的,而且全部加密后啟動的時(shí)候也可能產(chǎn)生意料之外的錯(cuò)誤。

另外要說明的是,加密后的jar包是需要通過golang環(huán)境運(yùn)行的,所以我們需要提前把golang的運(yùn)行環(huán)境安裝好,安裝過程請自行百度。

開始加密

現(xiàn)在我們就開始正式的加密工作了,加密過程非常簡單,只需要使用maven的install命令即可自動打包,命令如下:

mvn clean install -Dxjar.password=password  -Dmaven.test.skip=true

這里的password可以自行指定密碼,是必填項(xiàng)。

執(zhí)行后就會得到兩個(gè)文件:一個(gè)是xjar.go的go源文件,一個(gè)是你項(xiàng)目的xjar包,也就是加密后的jar包。

運(yùn)行加密后的jar包

運(yùn)行加密后的jar包是需要先編譯xjar.go源文件生成jar包啟動器的。編譯方式如下:

go build ./xjar.go

編譯后會生成xjar.exe啟動器(王子使用的是window系統(tǒng),如果是linux系統(tǒng)就不是exe后綴了)。

之后使用如下命令即可運(yùn)行加密后的jar包:

./xjar.exe java -jar ./**.xjar

可以看出,只是在使用java -jar的前邊加上啟動器即可,還是很方便的。

后記

防止反編譯只能防止jar包被逆向破解,如果想要限制用戶的使用時(shí)間,按時(shí)間付費(fèi)需要怎么做呢?

這就要說到license加密技術(shù)了,我們下篇文章就來說說如何在你的項(xiàng)目中增加license,限制用戶的使用。

其他的加密方案參考:

ClassFinal:Mr.K/ClassFinal

基于字節(jié)碼轉(zhuǎn)換java版,國人實(shí)現(xiàn)的,蠻不錯(cuò)的,對SpringBoot支持也好,其邏輯就是基于-agentJava:xxx.jar這一套原理,加密時(shí)對class文件做了兩次處理,一次是對class文件的字節(jié)碼完全加密,一次是對class文件混淆,這個(gè)混淆是保留成員和方法,對方法內(nèi)部實(shí)現(xiàn)進(jìn)行隱藏;解密時(shí),判斷如果該類是自己加密過的,找到完全加密的字節(jié)碼進(jìn)行解密,如果不是自己加密的就跳過。其對class文件混淆,就是方便類似SpringBoot等三方框架直接分析class文件。好處就是,如果你是個(gè)工具包,加密后給其它人,其他人編程時(shí)引用或者編譯都不影響,但是運(yùn)行時(shí)需要加密方支持,給出秘鑰之類的。比較靈活和好用,也存在該方式的統(tǒng)一缺陷,不過其支持主程序jar加密,也支持單獨(dú)的第三方工具jar加密。

JarEncrypt:https://github.com/zhikun0704/api-zxv-jvmit

基于字節(jié)碼轉(zhuǎn)換C/C++版,基于JVMIT個(gè)人實(shí)現(xiàn)的,稍微研究了下,其支持對部分class加密,對應(yīng)一般java應(yīng)用問題不大,但對于SpringBoot項(xiàng)目支持可能有些問題。因本人C++水平有限,沒有深層次研究,希望有C/C++和java都熟悉的大神有空搞一套完整的。

以上就是jar包加密方案分享的詳細(xì)內(nèi)容,更多關(guān)于jar包加密的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Spring中Bean后置處理器(BeanPostProcessor)的使用

    詳解Spring中Bean后置處理器(BeanPostProcessor)的使用

    BeanPostProcessor 接口也被稱為Bean后置處理器,通過該接口可以自定義調(diào)用初始化前后執(zhí)行的操作方法。本文將詳細(xì)講講它的使用,需要的可以參考一下
    2022-06-06
  • JDK8并行流及串行流區(qū)別原理詳解

    JDK8并行流及串行流區(qū)別原理詳解

    這篇文章主要介紹了JDK8并行流及串行流區(qū)別原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • ssm項(xiàng)目session使用及其作用域問題

    ssm項(xiàng)目session使用及其作用域問題

    這篇文章主要介紹了ssm項(xiàng)目session使用及其作用域問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Java ArrayList的底層實(shí)現(xiàn)方法

    Java ArrayList的底層實(shí)現(xiàn)方法

    今天小編就為大家分享一篇Java ArrayList的底層實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 一文簡單了解C#?中的DataSet類

    一文簡單了解C#?中的DataSet類

    這篇文章主要介紹了一文簡單了解C#?中的DataSet類,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • JavaWeb入門:HttpResponse和HttpRequest詳解

    JavaWeb入門:HttpResponse和HttpRequest詳解

    這篇文章主要介紹了Django的HttpRequest和HttpResponse對象,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Jmeter JDBC請求常見問題解決方案

    Jmeter JDBC請求常見問題解決方案

    這篇文章主要介紹了Jmeter JDBC請求常見問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java實(shí)現(xiàn)JWT登錄認(rèn)證的示例代碼

    Java實(shí)現(xiàn)JWT登錄認(rèn)證的示例代碼

    Java中我們可以使用諸如JJWT這樣的庫來生成和驗(yàn)證JWT,本文主要介紹了Java實(shí)現(xiàn)JWT登錄認(rèn)證的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Springboot?yml?Map?List讀取方式

    Springboot?yml?Map?List讀取方式

    這篇文章主要介紹了Springboot?yml?Map?List讀取方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Spring注解 TX聲明式事務(wù)實(shí)現(xiàn)過程解析

    Spring注解 TX聲明式事務(wù)實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Spring注解 - TX 聲明式事務(wù)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評論

惠来县| 新平| 涞水县| 阿拉善盟| 都兰县| 双鸭山市| 深泽县| 启东市| 察隅县| 乌兰县| 仁怀市| 刚察县| 西峡县| 噶尔县| 日照市| 平和县| 阜平县| 河南省| 盐城市| 大埔县| 称多县| 夏河县| 广德县| 镇江市| 绩溪县| 大丰市| 全州县| 铜山县| 丰县| 循化| 乌鲁木齐市| 扶风县| 武安市| 正镶白旗| 利津县| 蒙山县| 鄂伦春自治旗| 阿勒泰市| 淮安市| 华亭县| 兴安盟|