JAVA代码加密和机器码绑定通用解决方案

2023-11-02 01:10

本文主要是介绍JAVA代码加密和机器码绑定通用解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、阅读对象

仅限于相关项目的研发人员,非本项目相关人员,不得随意打听和泄露代码加密规则。

二、须知

本文档中的技术是经过本人验证的行之有效的,可以拿过来复制后使用,如遇到问题,或者读者想增加额外的需求,可以浏览文中附录的api文档寻找答案。

三、操作步骤

3.1打包pom.xml文件修改

本步骤主要目的是把项目中依赖的jar包抽离出本项目,这样打包出来的主体jar包的体积就只用保留相关class和resourse,这样的好处是部署起来只需要拷贝核心代码的主项目包,体积更小,需要代码混淆的部分也会更精炼(剥离前172MB,剥离后只保留4MB,大概就是这么大的差距吧),如下图:

 pom.xml的plugins中增加依赖剥离逻辑,核心代码如下:

<!-- 不把依赖的jar包打入主体包内,inclues配置非必填,主要是把想要保留在核心业务包内的代码保留下来  -->
<!-- 这里我把jeecg的core包保留下来是因为我写了一个反射,core必须和核心业务在一个包内  --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><layout>ZIP</layout><includes><include><groupId>org.jeecgframework.boot</groupId><artifactId>wo-bpm-base-core</artifactId></include><include><groupId>org.jeecgframework.boot</groupId><artifactId>wo-bpm-local-api</artifactId></include><include><groupId>org.jeecgframework.boot</groupId><artifactId>wo-bpm-base-tools</artifactId></include><include><groupId>org.jeecgframework.boot</groupId><artifactId>codegenerate</artifactId></include><include><groupId>org.jeecgframework.boot</groupId><artifactId>hibernate-re</artifactId></include></includes></configuration></plugin><!--拷贝依赖 copy-dependencies  --><!--把所有依赖的jar包copy到target下面的lib文件夹中  --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId><executions><execution><id>copy-dependencies</id><phase>package</phase><goals><goal>copy-dependencies</goal></goals><configuration><outputDirectory>${project.build.directory}/lib</outputDirectory><overWriteReleases>false</overWriteReleases><overWriteSnapshots>false</overWriteSnapshots><overWriteIfNewer>true</overWriteIfNewer><includeScope>runtime</includeScope><!-- 配置不想要暴露出去的jar --><excludeGroupIds>org.jeecgframework.boot</excludeGroupIds></configuration></execution></executions></plugin><!-- 把lib下面所有踢出去的jar包写进classpath中,并指定主启动类  --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><manifest><addClasspath>true</addClasspath><classpathPrefix>lib/</classpathPrefix><mainClass>org.jeecg.JeecgSystemApplication</mainClass></manifest></archive><outputDirectory>${project.build.directory}</outputDirectory></configuration></plugin>

3.2代码混淆

代码混淆的目的是防止第三方公司反编译破解源码,造成公司财产的损坏,所以混淆的算法不重要,重要的是混淆的代码不能让别人直接反编译出来,这里我使用的是开源的代码混淆工具。参考地址(https://gitee.com/roseboy/classfinal)。

详细使用方式可以参考官方文档,这里我给大家推荐使用的是使用命令行打包,这样的话在源码层次暴露加密规则。

 加密命令如下:

java -jar classfinal-fatjar.jar -file yourpaoject.jar -libjars a.jar,b.jar -packages com.yourpackage,com.yourpackage2 -exclude com.yourpackage.Main -pwd 123456 -Y

 加密之后的项目不能直接启动,需要设置javaagent来启动,代码如下:

java -javaagent:yourpaoject-encrypted.jar -jar yourpaoject-encrypted.jar

这里官方支持把启动密码直接写在命令行里或者环境变量中,这里我不建议明文写在命令行或者环境变量中,建议启动后二次输入。

3.3机器码绑定

机器码绑定的目的是防止用户直接把服务器做成镜像,或者拷贝到其他地方复制一套环境使用,给公司造成不可挽回的损失。

上文中推荐的ClassFinal工具支持机器码绑定操作,操作步骤如下:

1.获取机器码:

java -jar classfinal-fatjar.jar -C

2.加密指令中加入-code(机器码,在绑定的机器生成,加密后只可在此机器上运行)参数

PS:机器唯一码的逻辑无非是mac地址、ip地址、网卡信息、cpu信息、磁盘信息等融合到一起做hash加密,ClassFinal工具机器码的逻辑是把上述信息全都融合到一起,十分方便,但是也带来一个问题,那就是如果服务器的ip、网卡、CPU、甚至是wifi连接有一个变化后,程序就无法启动了,会给运维带来不确定的风险,慎用。如果客户服务器不会变化的情况下尚可,如果有不可预估风险,比如阿里云ECS服务器,到期后需要把镜像迁移就不好说了,请酌情使用,也可以自己写一个算法,获取机器磁盘序列号加密即可。

这篇关于JAVA代码加密和机器码绑定通用解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/327061

相关文章

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Java中的JSONObject详解

《Java中的JSONObject详解》:本文主要介绍Java中的JSONObject详解,需要的朋友可以参考下... Java中的jsONObject详解一、引言在Java开发中,处理JSON数据是一种常见的需求。JSONObject是处理JSON对象的一个非常有用的类,它提供了一系列的API来操作J

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin