springmaven项⽬代码混淆的经验分享
在项⽬中需要对代码进⾏混淆加密,使⽤的是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配置中加上对注解类的扫描。
如
<context:component-scan base-package="" use-default-filters="false">
<!-- 扫描符合@Service @Repository的类 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
2. 对外暴露的接⼝类的⽅法名以及相关参数类不能混淆,但这个接⼝的实现类可以混淆(当然这个实现类的接⼝⽅法不会变化,但类名、属性名可以混淆变化)
3. 被反射引⽤的类(包括模版引⽤)需要注意,可以对被引⽤的部分⽅法、属性不进⾏混淆,其他也都混淆。
4. ⽇志打印的Logger名建议⽤字符串直接取名,⽽不⽤调⽤它的class类全路径,不然⽇志打印时会不知道是从哪个类中打印出来,当然⽇志打印格式定的很规范可以忽略。
⽐如
private static final Logger logger = Logger(Demo.class);
改为
private static final Logger logger = Logger("demo");
⼆、 在maven项⽬中直接打包就混淆步骤
1. pom配置加上:
放在 <build><plugins>下
<!-- ProGuard混淆插件-->
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<version>2.0.11</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>proguard</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 为 true则不混淆,false为混淆 -->
<skip>false</skip>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
</libs>
</configuration>
</plugin>
2. 在 项⽬根⽬录下放上proguard混淆配置 f 已解决过部分坑的配置例⼦如下:
-dontshrink
-keeppackagenames
# 解决 spring不到能够匹配的Service实例问题
-keepdirectories
-optimizations !code/allocation/variable
# 不优化
java混淆工具-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 stxxx.* {
<fields>;
<methods>;
}
-keep stxddd {
<methods>;
}
3. 不断测试,将不能混淆的类或⽅法 加⼊到 f ⾥
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论