java混淆了吗

最近在项目中碰到个一个场景,我们需要把自己的java项目jar包部署到一个第三方的服务器上,虽然双方互相信任,但是综合考虑,避免别人拿到jar包后可以很快的编译出源码,我们决定给代码加一层混淆,虽然此方法不能从根源上解决问题,但是做了一层混淆,也可以增加阅读源码的难度,总结了一下,写下这篇文章。

如何反编译java代码

我用的是mac电脑,从官网: http://java-decompiler.github.io/#jd-gui-download 下载JD-GUI,官网有很多版本,下载后安装打开即可,导入你想反编译的jar,我这里随便找了个jar包做演示

何为java混淆

细心的小伙伴肯定发现了,上面的截图有的包名是a,b,c这样命名的,但凡有点节操的程序员都不会这样命名的,这就是被混淆后的代码,让人不会一眼看出来代码里面的逻辑,效果会像下面这样

可以看到类名,包名都被修改了

进行java混淆

我们以之前springboot项目为例,进行service层的代码的混淆,呼啸前效果如下:

接下来我们只需要在pom里面加入如下插件

  
    org.apache.maven.plugins
    maven-compiler-plugin
    3.1
    
        1.7
        1.7
        UTF-8
    


    com.github.wvengen
    proguard-maven-plugin
    2.0.14
    
        
            package
            
                proguard
            
        
    
    
        6.1.0beta2
        ${project.build.finalName}.jar
        ${project.build.finalName}.jar
        true
        
            -dontshrink
            -dontoptimize
            
            -adaptclassstrings
            -keepdirectories
            
            -keepattributes
                Exceptions,
                InnerClasses,
                Signature,
                Deprecated,
                SourceFile,
                LineNumberTable,
                *Annotation*,
                EnclosingMethod
            
            
            -keepnames interface **
            
            -keepparameternames
            
            -dontusemixedcaseclassnames
            
            -keep
                class com.stone.zplxjj.Application {
                public static void main(java.lang.String[]);
                }
            
            
            -keep class com.stone.zplxjj.autoconfiguration.** { *; }
            -keep class com.stone.zplxjj.config.** { *; }
            -keep class com.stone.zplxjj.controller.** { *; }
            -keep class com.stone.zplxjj.dao.** { *; }
            -keep class com.stone.zplxjj.entity.** { *; }
            -keep class com.stone.zplxjj.event.** { *; }
            -keep class com.stone.zplxjj.interceptor.** { *; }
            -keep class com.stone.zplxjj.listener.** { *; }
            -keep class com.stone.zplxjj.properties.** { *; }
            -keep class com.stone.zplxjj.filter.** { *; }
            
            -ignorewarnings
            
            <!---keep class com.slm.proguard.example.spring.boot.service { *; }-->
            
            -keep interface * extends * { *; }
            
            -keepclassmembers class * {
                @org.springframework.beans.factory.annotation.Autowired *;
                @org.springframework.beans.factory.annotation.Value *;
                }
            
        
        true
        
            
            ${java.home}/lib/rt.jar
        
    
    
        
            net.sf.proguard
            proguard-base
            6.1.0beta2
        
    


    org.springframework.boot
    spring-boot-maven-plugin

执行打包命令:mvn package,会看到生成如下

我们看到了生成了不只一个jar包,还有一些别的文件,这个我们放后面介绍,我们先看下划红线的jar反编译后的效果

可以看到我们针对service包下面的类混淆成功了