在maven项目中 使用proguard插件混淆部分代码

第一种方法 仅做参考,因为没有实现出来
大体方式是通过一个main工具来做 但是要自己扣到jar包才能执行。
而且执行好像不太成功 所以选择放弃 仅做参考

参考网址:
Java代码加密与反编译(一):利用混淆器工具proGuard对jar包加密
https://www.cnblogs.com/DianaCody/p/5425676.html

Proguard使用最新,最全教程,亲自试验    2015年04月29日
https://blog.csdn.net/zhangdaiscott/article/details/45368261

Proguard使用教程     posted on 2014-04-08
https://www.cnblogs.com/duanxz/p/3651418.html

第二种方法 
目前这种方法加工是OK的 虽然混淆范围不够广袤但是成功了
参考网址:
简书:Maven WEB项目使用ProGuard进行混淆
https://www.jianshu.com/p/8a32a3f2ad17

Maven WEB 项目使用ProGuard进行混淆,最佳解决方案    2018年
https://blog.csdn.net/wltj920/article/details/48970869

Maven WEB 项目使用ProGuard进行混淆,最佳解决方案&详解   (这个比较清晰)  2018年
https://blog.csdn.net/sinat_35100573/article/details/51833294

Proguard混淆与Maven集成        2014年
https://blog.csdn.net/baidu_21259973/article/details/39552021

混淆配置  (较详细) 2017年03月22日
https://blog.csdn.net/sunquan1992/article/details/64918727

以下为proguard插件在pom.xml中的具体配置
<!-- ProGuard混淆插件 -->
<plugin>
    <groupId>com.github.wvengen</groupId>
    <artifactId>proguard-maven-plugin</artifactId>

    <version>2.0.14</version>

    <executions>
        <execution>
            <!-- 混淆时刻,这里是打包的时候混淆 -->
            <phase>package</phase>
            <goals>
                <!-- 使用插件的什么功能,当然是混淆 -->
                <goal>proguard</goal>
            </goals>
        </execution>
    </executions>

    <configuration>
        <!-- 是否将生成的PG文件安装部署 -->
        <attach>true</attach>
        <!-- 是否混淆 -->
        <obfuscate>true</obfuscate>
        <!-- 指定生成文件分类 -->
        <attachArtifactClassifier>pg</attachArtifactClassifier>
        <options>
            <!-- JDK目标版本1.8 -->
            <option>-target 1.8</option>
            <!-- 不做压缩(删除注释、未被引用代码) -->
            <option>-dontshrink</option>
            <!-- 不做优化(变更代码实现逻辑) -->
            <option>-dontoptimize</option>
            <!-- 不跳过非公用类文件及成员 -->
            <option>-dontskipnonpubliclibraryclasses</option>
            <option>-dontskipnonpubliclibraryclassmembers</option>
            <!-- 优化时允许访问并修改有修饰符的类和类的成员 -->
            <option>-allowaccessmodification</option>
            <!-- 使用独特的混淆类的成员名称来增加混淆 -->
            <option>-useuniqueclassmembernames</option>
            <!-- 不混淆所有包名,本人测试混淆后WEB项目问题实在太多,毕竟Spring配置中有大量固定写法的包名 -->
            <option>-keeppackagenames</option>
            <!-- 不混淆所有特殊的类 -->
            <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>
            <!-- 不混淆所有的set/get方法,毕竟项目中使用的部分第三方框架(例如Shiro)会用到大量的set/get映射 -->
            <!-- 测试发现很多写在service或者controller里面的get和set方法都没有混淆 所以在这里就不加了 -->
            <!-- <option>-keepclassmembers public class * {void set*(***);*** get*();}</option> -->
            <!-- 不混淆测试包下的所有类名,且类中的方法也不混淆,但是属性混淆 -->
            <option>-keep class lte-g-pms.src.test.** { &lt;methods&gt;; }</option>
            <!-- 这里以为可以不让所有的类名被混淆 但是发现这个没卵用 -->
            <!-- <option>-keep class lte-g-pms.src.main.** {}</option> -->
            <!-- 以下因为大部分是Spring管理的Bean,不对包类的类名进行混淆,但对类中的属性和方法混淆 -->
            <!-- 目前就是混淆比较逻辑的部分 controller service.impl 和 dao.impl 但是不混淆类名 把启动的时候导致同名报错 -->
            <option>-keep class lte.controller.** </option>
            <option>-keep class lte.service.impl.**</option>
            <option>-keep class lte.dao.impl.**</option>
            <!-- 属于系统配置的包 好像混淆了不容易被识别 所以这里就不混淆类名 启动的时候会查找不到导致启动报错 -->
            <option>-keep class lte.sys.LoginHandler</option>
            <option>-keep class lte.sys.MultipartListenerResolver</option>
            <option>-keep class lte.sys.CsrfSecurityRequestMatcher</option>
            <option>-keep class lte.sys.EncoderHandler</option>
            <option>-keep class lte.sys.FileUploadInterceptor</option>
            <option>-keep class lte.sys.HibernateAwareObjectMapper</option>
            <!-- 不混淆model包中的所有类以及类的属性及方法,实体包,混淆了会导致ORM框架及前端无法识别 -->
            <option>-keep class lte.model.** {*;}</option>
            <option>-keep class lte.viewobject.** {*;}</option>
            <option>-keep class lte.dao.** {*;}</option>
        </options>
        <outjar>${project.build.finalName}-pg.jar</outjar>
        <!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 -->
        <libs>
            <lib>${java.home}/lib/rt.jar</lib>
        </libs>
        <!-- 对什么东西进行加载,这里仅有classes,毕竟你也不可能对配置文件及JSP混淆吧 -->
        <injar>classes</injar>
        <!-- 输出目录 -->
        <outputDirectory>${project.build.directory}</outputDirectory>
    </configuration>
</plugin>  

注意事项
1.需要混淆的类 不过最好不要混淆类名
 controller, service.impl, dao.impl, 
2.不需要混的类 也是可以混淆的 不过只有类名被混淆了
 service层和dao层
3.不能混淆的类
 
 config层 容易启动的时候无法识别而报错
 model层 不能被混淆 view层会被调用到 混淆了页面会出错 还可能应自动工程生成新的表
 modelview 单纯存数据用的 同上 不能被混淆 在页面会被调用

以上基本就可以使用了
1.运行maven-install就可以target目录下面获得混淆后的jar包。
2.用反编译工具解析混淆好的jar包就可以查询是否混淆成功
3.将混淆后的jar包解压出来替换到之前tomcat的目录下面的原项目的WEB-INF\classes下面 运行tomcat测试
4.没问题可以将这个项目打包发布

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页