当前位置:   article > 正文

使用SpringBoot + Maven + ProGuard进行代码混淆_spring boot proguard maven

spring boot proguard maven

1. 背景

最近公司需要向甲方交付源码,想要对项目代码进行混淆,以提高代码阅读难度,提高源码安全性。这个任务就交到了我身上,不负众望也是弄出来了,分享一下。

2. 实现和实现步骤

2.1 pom文件的配置如下

  1. <build>
  2. <finalName>${project.artifactId}</finalName>
  3. <defaultGoal>compile</defaultGoal>
  4. <plugins>
  5. <plugin>
  6. <groupId>com.github.wvengen</groupId>
  7. <artifactId>proguard-maven-plugin</artifactId>
  8. <version>2.6.0</version>
  9. <executions>
  10. <execution>
  11. <!--打包的时候开始混淆-->
  12. <phase>package</phase>
  13. <goals>
  14. <!--混淆-->
  15. <goal>proguard</goal>
  16. </goals>
  17. </execution>
  18. </executions>
  19. <configuration>
  20. <injar>${project.build.finalName}.jar</injar>
  21. <!--输出的jar-->
  22. <outjar>${project.build.finalName}.jar</outjar>
  23. <outputDirectory>${project.basedir}/target</outputDirectory>
  24. <!--是否混淆-->
  25. <obfuscate>true</obfuscate>
  26. <!--是否允许进行代码混淆时将依赖放入临时文件夹(防止依赖太多或者依赖层级过深超出windows命令最大长度报错)-->
  27. <putLibraryJarsInTempDir>true</putLibraryJarsInTempDir>
  28. <!--是否允许进行代码混淆时生成临时配置文件-->
  29. <generateTemporaryConfigurationFile>true</generateTemporaryConfigurationFile>
  30. <!--proguard官网推荐-->
  31. <inLibsFilter>!META-INF/**,!META-INF/versions/9/**.class</inLibsFilter>
  32. <options>
  33. <!--jdk版本-->
  34. <option>-target 1.8</option>
  35. <!--不做收缩-->
  36. <option>-dontshrink</option>
  37. <!--不做代码优化-->
  38. <option>-dontoptimize</option>
  39. <!--查找和替换在代码中以字符串形式引用的类名(处理代码中com.example.MyClass格式类名)-->
  40. <option>-adaptclassstrings</option>
  41. <!--proguard官网推荐-->
  42. <option>-dontskipnonpubliclibraryclasses</option>
  43. <option>-dontskipnonpubliclibraryclassmembers</option>
  44. <option>-dontusemixedcaseclassnames</option>
  45. <option>-useuniqueclassmembernames</option>
  46. <option>-keepparameternames</option>
  47. <option>-keeppackagenames</option>
  48. <option>-keepattributes *Annotation*, Signature, Exceptions, InnerClasses, EnclosingMethod, LineNumberTable, LocalVariableTable, LocalVariableTypeTable, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations, RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, MethodParameters</option>
  49. <!--保持目录结构-->
  50. <option>-keepdirectories</option>
  51. <option>-keepclassmembers enum * { *; }</option>
  52. <option>-keepclassmembers public class * { void set*(***); *** get*(); }</option>
  53. <option>-keep class com.fw.formland.backend.entity.**{*;}</option>
  54. <option>-keep class com.fw.formland.backend.mapper.**{*;}</option>
  55. <option>-keep class com.fw.formland.backend.model.**{*;}</option>
  56. <option>-keep class com.fw.formland.backend.mapper.** { *; }</option>
  57. <option>-keepclassmembers class com.fw.formland.backend.mapper.** { *; }</option>
  58. <option>
  59. -keep class * {
  60. @org.springframework.beans.factory.annotation.Value *;
  61. @javax.annotation.PostConstruct *;
  62. @javax.annotation.PreDestroy *;
  63. @org.springframework.scheduling.annotation.Async *;
  64. @org.springframework.context.annotation.Bean *;
  65. @org.springframework.context.annotation.Configuration *;
  66. @org.springframework.stereotype.Component *;
  67. }
  68. </option>
  69. <option>-keepclasseswithmembers public class *{
  70. public static void main(java.lang.String[]); }
  71. </option>
  72. </options>
  73. <libs>
  74. <lib>${java.home}/lib/rt.jar</lib>
  75. <lib>${java.home}/lib/jsse.jar</lib>
  76. </libs>
  77. <!--多模块项目中,如果有别的模块应用了当前模块的代码,则需将其它模块也进行混淆处理并以代码的形式放到最后的输出文件中,而不是以jar包的形式-->
  78. <assembly>
  79. <inclusions>
  80. <inclusion>
  81. <groupId>com.fw.formland</groupId>
  82. <artifactId>bpm-extend</artifactId>
  83. </inclusion>
  84. <inclusion>
  85. <groupId>com.fw.formland</groupId>
  86. <artifactId>formland_base</artifactId>
  87. </inclusion>
  88. </inclusions>
  89. </assembly>
  90. </configuration>
  91. </plugin>
  92. <plugin>
  93. <groupId>org.springframework.boot</groupId>
  94. <artifactId>spring-boot-maven-plugin</artifactId>
  95. <executions>
  96. <execution>
  97. <id>repackage</id>
  98. <goals>
  99. <goal>repackage</goal>
  100. </goals>
  101. </execution>
  102. </executions>
  103. <!--多模块项目中,如果有别的模块应用了当前模块的代码,在做完上述assembly的配置之后,需要在最后输出文件的依赖中排除掉assembly中配置的两个依赖项-->
  104. <configuration>
  105. <excludeGroupIds>com.fw.formland</excludeGroupIds>
  106. </configuration>
  107. </plugin>
  108. </plugins>
  109. </build>

2.2 进入命令行,执行mvn clean package,等待混淆打包完成即可

  • formland.jar:真正的混淆之后的文件
  • formland_proguard_base.jar:当injar和outjar一样时,proguard自动生成,内容为混淆前的代码
  • generated-proguard.conf:根据你proguard的configuration标签中的配置生成的配置文件
  • proguard_map:混淆映射文件,告诉你进行了哪些代码的混淆
  • proguard_seed:用于保存 ProGuard 在混淆过程中保留的类、字段和方法的列表

3. 两个注意点

  • spring-boot-maven-plugin一定要放在proguard-maven-plugin之后。
  • 不建议开启<option>-dontwarn</option>,否则混淆打包可能没问题,项目启动也可能没问题,但是接口调用就可能出现各种依赖问题的报错。建议关闭,并且在混淆打包的时候根据控制台的警告输出处理好问题。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/1015770
推荐阅读
相关标签
  

闽ICP备14008679号