Maven WEB 项目使用ProGuard进行混淆,最佳解决方案

Maven WEB 项目使用ProGuard进行混淆,最佳解决方案
近期公司的Android项目做了混淆,虽说对于保护代码并不是100%的,但混淆后的代码可以使那些不法份子难以阅读,这样也能对代码的保护做出贡献。 
于是,公司写的一大堆WEB项目也想做保护。但几大问题随之而来:

公司的所有项目全部是Maven项目,网上的混淆方案不是陈旧就是无效
网上的大部分解决方案感觉像是对简单DEMO进行混淆,根本不能用于复杂的WEB项目中
网上的大部分解决方案是针对Android项目的,针对WEB的少之又少
针对以上问题,本人花费一个月研究了WEB+Maven项目的混淆,终于收获果实,解决了这一大空缺难题。

项目介绍
就如之前所述,我们要混淆的项目绝不是一个简单的WEB DEMO,必须要包含了大量第三方框架。 
本文中介绍的项目使用了主流的一些框架:

Spring 4.1.1.RELEASE
SpringMVC 4.1.1.RELEASE
JackSon 2.5.0
MyBatis 3.3.0
Shiro 1.2.3
Log4J 1.2.17
SLF4J 1.7.10
Druid Pool 1.0.15
patchca 1.0.0
Jetty 9.2.7.v20150116
项目包结构


该项目是典型的Maven WEB项目,对于Maven WEB项目的结构不再赘述,这里对各种包做一下解释:

annotation 注解包,里面是自己写的注解类,主要混淆对象
controller SpringMVC的控制器包,主要混淆对象
credntials Shiro的自定义凭证,次要混淆对象
dao DAO包,主要混淆对象
exception 异常包,自定义了一些异常,主要混淆对象
filter Shiro的自定义过滤器,次要混淆对象
interceptor Shiro的自定义拦截器,次要混淆对象
job SpringTASK的定时任务包,次要混淆对象
mapper Mybatis的XML映射文件包,非混淆对象
model 实体包,非混淆对象
realm Shiro的自定义域包,次要混淆对象
service 实体的服务包,次要混淆对象
token Shiro的自定义令牌包,次要混淆对象
utils 公司自己的工具类,主要混淆对象
主要混淆对象 对类的名称、属性、方法名都进行混淆 
次要混淆对象 对类的名称不混淆,类的属性、方法名选择性混淆 
非混淆对象 不进行混淆,混淆后可能出现异常

Maven 配置(pom.xml)
本文的重头戏,使用Maven集成的ProGuard插件,混淆配置不用单独建立文件


         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.0.0
    war
    ...
    zhukun.shiro-spring
    1.0-SNAPSHOT

   
   
       
        UTF-8
       
        4.12
       
        1.2
        3.1.0
       
        1.2.17
        1.7.10
        1.6.12
       
        1.1.3
        3.2.1
        1.3.1
       
        1.2.3
       
        1.0.15
       
        5.1.30
        3.3.0
        1.2.3
       
        1.2.16
       
        1.3.2
       
        4.1.1.RELEASE
        2.5.0
       
        1.0.0
       
        9.2.7.v20150116
       
        2.3.2
   


   
       
            junit
            junit
            ${junit.version}
       

       
            javax.servlet
            jstl
            ${jstl.version}
       

       
            log4j
            log4j
            ${log4j.version}
       

       
            org.aspectj
            aspectjweaver
            ${aspectj.version}
       

       
            org.slf4j
            slf4j-log4j12
            ${slf4j.version}
       

       
            commons-logging
            commons-logging
            ${commons-logging.version}
       

       
            org.apache.shiro
            shiro-core
            ${shiro.version}
       

       
            org.apache.shiro
            shiro-web
            ${shiro.version}
       

       
            org.apache.shiro
            shiro-spring
            ${shiro.version}
       

       
            org.apache.shiro
            shiro-ehcache
            ${shiro.version}
       

       
            org.apache.shiro
            shiro-quartz
            ${shiro.version}
       

       
            commons-collections
            commons-collections
            ${commons-collections.version}
       

       
            mysql
            mysql-connector-java
            ${mysql.version}
       

       
            com.alibaba
            druid
            ${druid.version}
       

       
            javax.servlet
            javax.servlet-api
            ${servlet.version}
       

       
            commons-fileupload
            commons-fileupload
            ${commons-fileupload.version}
       

       
            org.mybatis
            mybatis
            ${mybatis.version}
       

       
            org.mybatis
            mybatis-spring
            ${mybatis-spring.version}
       

       
            com.github.miemiedev
            mybatis-paginator
            ${mybatis-paginator.version}
       

       
            com.fasterxml.jackson.core
            jackson-core
            ${jackson.version}
       

       
            com.fasterxml.jackson.core
            jackson-databind
            ${jackson.version}
       

       
            com.fasterxml.jackson.core
            jackson-annotations
            ${jackson.version}
       

       
            org.springframework
            spring-core
            ${spring.version}
       

       
            org.springframework
            spring-webmvc
            ${spring.version}
       

       
            org.springframework
            spring-context-support
            ${spring.version}
       

       
            org.springframework
            spring-orm
            ${spring.version}
       

       
            org.springframework
            spring-test
            ${spring.version}
            test
       

       
            org.patchca
            patchca
            ${patchca.version}
       

   

   
        shiro-spring
       
       
           
                src/main/java
               
                    **/*.xml
               

           

           
                src/main/resources
           

       

       
           
                org.apache.maven.plugins
                maven-compiler-plugin
                ${maven-compiler.version}
               
                    1.7
                    1.7
                    UTF-8
               

           

           
                org.eclipse.jetty
                jetty-maven-plugin
                ${jetty.version}
               
                   
                        /shiro-spring
                   

                   
                       
                        8080
                   

               

           

           
           
                org.mybatis.generator
                mybatis-generator-maven-plugin
                ${mybatis-generator.version}
               
                    true
                    true
               

           

           
           
                com.github.wvengen
                proguard-maven-plugin
                2.0.11
               
                   
                       
                        package
                       
                           
                            proguard
                       

                   

               

               
                   
                    true
                   
                    true
                   
                    pg
                   
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       

                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                   
                    ${project.build.finalName}-pg.jar
                   
                   
                        ${java.home}/lib/rt.jar
                   

                   
                    com/chinatelecom/gz/wy/zhukun/shiro_spring/**
                   
                    classes
                   
                    ${project.build.directory}
               
           
       
   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
以上代码中的注释足够各位参考了,若有问题欢迎留言

执行
clean package -DskipTests

使用Maven运行以上代码,执行完成后在target目录中会生成三个文件:

classes-pg.jar 混淆后的classes文件,里面包含完整的项目结构
proguard_map.txt 混淆内容的映射
proguard_seed.txt 参与混淆的类
混淆完成后,将classes-pg.jar解压到应用服务器覆盖原有的classes文件,通常目录为

X:\jetty9或tomcat7\webapps\shiro-spring\WEB-INF\classes

运行服务,项目运行正常

反编译
既然是混淆了的代码,那我们现在作为盗码者来反编译一下classes文件

可以看出,混淆成功了,盗码者读起来不是一二般的痛苦,我们的目的已经达到

遗留问题
虽然混淆是在Maven打包的时候进行,但是生成的war包及classes目录并未混淆,还需要将jar包中的内容提取,比较麻烦,不知道有没有让生成的war包就是已经混淆的办法。
本人的JAVA环境是JDK1.7 64位,其它的JDK并未尝试
不能对Spring等配置文件混淆,这样包结构还是存在,减弱了盗码者的读码难度
最后
欢迎大家讨论更加的代码保护方案,代码是我们辛苦的成果,绝不让他人非法盗取。当然,本文在非本人的同意下也禁止盗用,转载的话说明出处,谢谢合作!

注:本文中提到的项目源码为商业机密,恕不提供,谢谢!
--------------------- 
作者:永远TeRny 
来源:CSDN 
原文:https://blog.csdn.net/wltj920/article/details/48970869 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(Maven WEB 项目使用ProGuard进行混淆,最佳解决方案)