java代码混淆 源代码保护 代码逻辑混淆 代码加密 支持JDK16-程序员宅基地

技术标签: java授权  java加密  知识文档  JDK16  java字符串加密  混淆技术  java混淆  

  java代码可以反编译,因此有时候要保护自己的知识产权还真得费点心思,一般来说有三个思路:

  1、将class文件加密,这个是最安全的,但也费事儿,因为要重写classloader来解密class文件;

  2、使用花指令,使得class文件不能反编译(利用反编译工具漏洞);安全性一般,还是有花指令破解器;

  3、代码混淆,提高代码阅读成本;简单易操作,一般采用这种或者与其它方式结合;

  我们项目中用到的即为代码混淆工具ProGuard,相关文章参考:

免费的java代码混淆,程序加密推荐_a1ccwt的博客-程序员宅基地_java代码混淆

  ProGuard是一个纯java编写的混淆工具,有客户端跟jar包两种使用方式。可以将程序打包为jar,然后用工具进行混淆,也可以在maven中导入ProGuard的插件,对代码进行混淆。本例中为对普通javaweb项目进行代码混淆。maven配置插件如下:

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

<!-- 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>

      <!-- 是否将生成的PG文件安装部署-->

      <attach>true</attach>

      <!-- 是否混淆-->

      <obfuscate>true</obfuscate>

      <!-- 指定生成文件分类 -->

      <attachArtifactClassifier>pg</attachArtifactClassifier>

      <options>

         <!-- JDK目标版本1.8-->

         <option>-target 1.8</option>

         <!-- 不做收缩(删除注释、未被引用代码)-->

         <option>-dontshrink</option>

         <!-- 不做优化(变更代码实现逻辑)-->

         <option>-dontoptimize</option>

         <!-- 不路过非公用类文件及成员-->

         <option>-dontskipnonpubliclibraryclasses</option>

         <option>-dontskipnonpubliclibraryclassmembers</option>

         <!--不用大小写混合类名机制-->

         <option>-dontusemixedcaseclassnames</option>

         <!-- 优化时允许访问并修改有修饰符的类和类的成员 -->

         <option>-allowaccessmodification</option>

         <!-- 确定统一的混淆类的成员名称来增加混淆-->

         <option>-useuniqueclassmembernames</option>

         <!-- 不混淆所有包名-->

         <!--<option>-keeppackagenames</option>-->

         <!-- 需要保持的属性:异常,注解等-->

         <option>-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod</option>

         <!-- 不混淆所有的set/get方法->

         <!--<option>-keepclassmembers public class * {void set*(***);*** get*();}</option>-->

         <!-- 不混淆包下的所有类名,且类中的方法也不混淆-->

         <option>-keep class com.xxx.xxx.bboss.SystemConfig { <methods>; }</option>

         <option>-keep class com.xxx.xxx.framework.** { *; }</option>

         <option>-keep class com.xxx.xxx.xxx.controller.** { <methods>; }</option>

         <option>-keep class com.xxx.xxx.xxx.dao.** { <methods>; }</option>

         <option>-keep class com.xxx.xxx.xxx.exception { <methods>; }</option>

         <option>-keep class com.xxx.xxx.xxx.model.** { <methods>; }</option>

      </options>

      <!--class 混淆后输出的jar包-->

      <outjar>classes-autotest.jar</outjar>

      <!-- 添加依赖,这里你可以按你的需要修改,这里测试只需要一个JRE的Runtime包就行了 -->

      <libs>

         <lib>${java.home}/lib/rt.jar</lib>

      </libs>

      <!-- 对什么东西进行加载,这里仅有classes成功,毕竟你也不可能对配置文件及JSP混淆吧-->

      <injar>classes</injar>

      <!-- 输出目录-->

      <outputDirectory>${project.build.directory}</outputDirectory>

   </configuration>

</plugin>

  运行 mvn clean package -DskipTests

  混淆后结果如图所示:

  classes-pg.jar为混淆后的classes文件,里边包含完整的项目结构

  proguard_map.txt混淆内容映射

  proguard_seed.txt参与混淆的类

  混淆后反编译代码如下:

  可以看到,部分包名跟类名已经被改为了简单字母,不再具有业务含义,而且变量名也进行了修改,增加了阅读代码难度。

  运行服务,项目正常运行。

  需要注意的问题:

  1、因为有时候会配置不保持包名或类名,因此一些相关配置文件的内容需要改变,好在ProGuard不是随机生成类名,而是先按照原名称对相同包下类进行排序,混淆后的类名称依次为a.class,b.class,c.class.....

那么问题来了,当包中超过26个类时,默认命名为A.class,B.class,C.class,在某些操作系统下,会不区分class文件名称的大小写,会导致错误(水平所限,未深入探究跟类加载相关);因此

  <!--不用大小写混合类名机制-->

  <option>-dontusemixedcaseclassnames</option>

  配置极为关键,该配置会在超过26个类文件时,命名为aa.class,ab.class,ac.class,而不是原来的大写类名,从而避免错误。

  2、打包部署问题。该配置文件打包出来的war中classes文件仍然为正常代码,需要手动解压,将classes-pg.jar中classes替换进去,在工程化管理的情况下,可以在jenkins中配置脚本,自动将混淆后的classes替换进war包:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

#更改war包classes为混淆包的内容

cd /root/.jenkins/workspace/mytest_master/target

jar -xvf classes-pg.jar

rm -rf mytest

mkdir mytest

mv mytest.war mytest

cd mytest/

jar -xvf mytest.war

rm -rf WEB-INF/classes/com/

cd ../

cp -rf com mytest/WEB-INF/classes/

cd mytest

jar -cvfM0 mytest.war ./

mv mytest.war ../

这样jenkins打出的就是混淆后的war包了,可以直接交给客户使用。

需要加密,制定化的,欢迎大家加QQ交流学习!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1ccwt/article/details/108442286

智能推荐

Spring MVC学习随笔-控制器(Controller)开发详解:调用业务对象、父子工厂拆分(applicationContext.xml、dispatcher.xml)-程序员宅基地

文章浏览阅读681次,点赞11次,收藏9次。这部分笔记深入探讨了SpringMVC控制器开发。主要涵盖了请求参数处理、业务对象调用和页面跳转,展示了整合SSM时的核心思路和具体的编码示例。讨论了父子工厂拆分、配置文件的分离,解决了父子容器问题,确保事务在子容器中配置正确。提供了完整的XML配置和Java代码示例,展示了如何通过不同的容器管理不同层的对象,实现了整洁可维护的项目结构。

Quartus II 15软件安装_cyclone-15.0.0.145.qdz-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏25次。必装组件:Quartus IIhttp://download.altera.com/akdlm/software/acdsinst/15.0/145/ib_installers/QuartusSetup-15.0.0.145-windows.exe 1.8GBhttp://download.altera.com/akdlm/software/acdsinst/15.0/145/ib_insta..._cyclone-15.0.0.145.qdz

QGis二次开发基础 -- 销毁当前地图工具_如何销毁new qq.maps.map-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏4次。本文注定很短。由某位朋友需求,在设置了地图控件之后,怎么才能将当前的地图工具释放掉,返回原来的空地图状态。比如刚刚打开程序的时候,鼠标指针是一个箭头,表示没有地图工具,也不能在地图上直接操作。而点选某个地图工具后(例如漫游工具,鼠标指针会变成一个小手),现在想释放掉这个设置的地图工具。 这个需求我之前没有想到过,大多数时候我都是直接选择漫游工具来释放其他的地图工具。而看到这个需求我的一反应就是将_如何销毁new qq.maps.map

Codeforces 621C Wet Shark and Flowers-程序员宅基地

文章浏览阅读38次。题意:一群鲨鱼围成一圈,Wet Shark说个质数p,每个鲨鱼在一定范围内选个数,如果两个相邻的鲨鱼选的数的乘积能被p整除,则每个鲨鱼都将得到1000元,求鲨鱼们最终得到钱数的期望。分析:比赛时乱七八糟的写,一直错,重新读题才注意到题目中说的: If for any pair of neighbouring sharks i and j the produc...

g开头的C语言编程软件,C语言函数大全(g开头)-程序员宅基地

文章浏览阅读542次。函数名: gcvt功 能: 把浮点数转换成字符串用 法: char *gcvt(double value, int ndigit, char *buf);程序例:#include#includeint main(void){char str[25];double num;int sig = 5; /* significant digits *//* a regular number */num =..._g开头 程序员

Android数据库存取图片_android 实现 相机、相册功能 + 图片存取数据库操作-程序员宅基地

文章浏览阅读1.0k次。7、存入数据库(数据库存储图的字段类型使用BLOB类型),然后把imgByte存进去就好了,Android数据库增删改查还不会的可以参考我前边发的文章。2、在AndroidManifest.xml导入允许访问内置SD卡的权限。6、Bitmap转换byte[]方法。5、将选择的图片进行转换并显示。1、首先需要导入依赖。3、申请获取存储权限。_android 实现 相机、相册功能 + 图片存取数据库操作

随便推点

接口自动化测试(Python+Requests+Unittest)合集详解教程_带requests的python在线运行环境-程序员宅基地

文章浏览阅读689次,点赞8次,收藏25次。作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。_带requests的python在线运行环境

MAST中安装spatial-correlation-sampler踩坑记录_spatial-correlation-sampler gcc版本对应-程序员宅基地

文章浏览阅读1.7k次。论文:《MAST: A Memory-Augmented Self-Supervised Tracker》github地址:https://github.com/zlai0/MAST记录一下配置MAST中的安装spatial-correlation-sampler过程中的坑,几个月前跑过这个网络,最近换了个服务器重新配置环境,spatial-correlation-sampler的安装过程遇到了点小问题,在此mark下。问题:pip install spatial-correlation-sample_spatial-correlation-sampler gcc版本对应

LangChain入门指南-程序员宅基地

文章浏览阅读3.3w次,点赞47次,收藏384次。LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库。官方文档:https://python.langchain.com/en/latest/_langchain

【智能车入门:面包板】(蓝牙遥控、超声波避障、红外循迹)-程序员宅基地

文章浏览阅读1.6k次,点赞43次,收藏16次。这里将传感器得DO引脚接到PB6(设置成浮空输入),通过判断PB6引脚的高低电平,来控制led亮灭,led一脚接gnd,另一脚接PB7。这里将四个红外循迹传感器都要做一遍测试,就是看它能否正常工作,当能接收到反射回来的红外线时,这个模块的DO引脚就输出低电平,如果距离过远,或者是射到了黑色的物质上,红外线没法反射回来,此时DO引脚输出高电平,靠这个逻辑就能实现简单的循迹。有了①②③④的测试就可以组装一下车子然后测试超声波避障了,此时可以用充电宝给stm32供电,看看能不能正常工作,可以的话就可以上电池了。

网络安全与应用程序安全-程序员宅基地

文章浏览阅读1.2k次,点赞25次,收藏8次。在当今的数字环境中确保数据安全变得比以往任何时候都更具挑战性。

HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计_标题为提升《html5+css3 web前端设计》课程作业质量,结合课程知识技术特点,同-程序员宅基地

文章浏览阅读51次。1 网页简介:此作品为学生个人主页网页设计题材,HTML+CSS 布局制作,web前端期末大作业,大学生网页设计作业源码,这是一个不错的网页制作,画面精明,代码为简单学生水平, 非常适合初学者学习使用。2.网页编辑:网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad++ 等任意html编辑软件进行运行及修改编辑等操作)。3.知识应用:技术方面主要应用了网页知识中的: Div+CSS、鼠标滑_标题为提升《html5+css3 web前端设计》课程作业质量,结合课程知识技术特点,同

推荐文章

热门文章

相关标签