spring&maven项目代码混淆的经验分享

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 

在项目中需要对代码进行混淆加密,使用的是proguard工具,由于项目是使用了spring框架和maven插件,被spring管理的java代码混淆会有很多坑, 在实际项目混淆时得出以下经验(让尽量多的java类可以混淆)。

一、

1. 由spring管理的java类尽量使用注解,而且注解一定要指定bean id名或引用的bean id名。

比如:


@Service("demoWorker")    // 不能是 @Service
public class DemoWorker extends BaseWorker{


    @Resource(name = "cacheService")     // 不能是 @Autowired 或 @Resource
    private CacheService cacheService;
    
    @Resource(name = "demoConfig")
    private DemoConfig   demoConfig;

@PostConstruct
	public void init() {

        }

    public void doSome(){

           
   }

}

这样被混淆后变为如下,这样spring中对应的bean id没变

@Service("demoWorker")  
public class a extends b{

    @Resource(name = "cacheService")     
    private c d;
    
    @Resource(name = "demoConfig")
    private f   d;

      @PostConstruct
       public void k() {

        }

    public void g(){

           
   }

}

当然用了注解要在spring xml配置中加上对注解类的扫描。









 

2. 对外暴露的接口类的方法名以及相关参数类不能混淆,但这个接口的实现类可以混淆(当然这个实现类的接口方法不会变化,但类名、属性名可以混淆变化)

 

3. 被反射引用的类(包括模版引用)需要注意,可以对被引用的部分方法、属性不进行混淆,其他也都混淆。

4. 日志打印的Logger名建议用字符串直接取名,而不用调用它的class类全路径,不然日志打印时会不知道是从哪个类中打印出来,当然日志打印格式定的很规范可以忽略。

比如

private static final Logger logger = LoggerFactory.getLogger(Demo.class);

改为

private static final Logger logger = LoggerFactory.getLogger("demo");

 

二、 在maven项目中直接打包就混淆步骤

 

1. pom配置加上:

放在

        
            
                com.github.wvengen
                proguard-maven-plugin
                2.0.11
                
                    
                        package
                        
                            proguard
                        
                    
                
                
                          
                    false
                    
                        ${java.home}/lib/rt.jar
                    
                

  		  

 

2. 在 项目根目录下放上proguard混淆配置 proguard.conf

已解决过部分坑的配置例子如下:


-dontshrink
-keeppackagenames

#  解决 spring找不到能够匹配的Service实例问题
-keepdirectories

-optimizations !code/allocation/variable

# 不优化
-dontoptimize
# 混淆的变量唯一
#-useuniqueclassmembernames


#保留 异常 反射 泛型 注解 等
-keepattributes Exceptions, InnerClasses, Signature, Deprecated, SourceFile, LineNumberTable, *Annotation*, Synthetic, EnclosingMethod
-keepparameternames

# 跳过org.w3c.dom.Node这个误报
-dontwarn org.w3c.dom.Node

# 保留Serializable序列化的类不被混淆
-keepclassmembers class * extends java.io.Serializable {
  static final long serialVersionUID;
  private static final java.io.ObjectStreamField[] serialPersistentFields;
  private void writeObject(java.io.ObjectOutputStream);
  private void readObject(java.io.ObjectInputStream);
  java.lang.Object writeReplace();
  java.lang.Object readResolve();
}


-keep class cn.testxxx.* {
  ;
  ;
}

-keep class cn.testxddd {
  ;
}

 

3. 不断测试,将不能混淆的类或方法 加入到 proguard.conf 里

 

 

转载于:https://my.oschina.net/passerman/blog/1822421

你可能感兴趣的:(java,测试,开发工具)