• 使用 ClassFinal 对 java class 文件进行加密防止反编译


    ClassFinal 是一款 java class文件安全加密工具,支持直接加密 jar 包或 war 包,无需修改任何项目代码,兼容 spring-framework;可避免源码泄漏或字节码被反编译

    特点

    • 无需修改原项目代码,只要把编译好的jar/war包用本工具加密即可
    • 运行加密项目时,无需求修改tomcat,spring等源代码
    • 支持普通jar包、springboot jar包以及普通java web项目编译的war包
    • 支持spring framework、swagger等需要在启动过程中扫描注解或生成字节码的框架
    • 支持maven插件,添加插件后在打包过程中自动加密
    • 支持加密WEB-INF/lib或BOOT-INF/lib下的依赖jar包
    • 支持绑定机器,项目加密后只能在特定机器运行
    • 支持加密springboot的配置文件

     

    官网:https://github.com/roseboy/classfinal

    国内 gitee:https://gitee.com/roseboy/classfinal

     

    目录

    1、使用命令进行加密

    1.1、加密

    1.2、反编译测试

    2、使用 maven 插件进行加密

    3、运行加密后的 jar


     

     

    1、使用命令进行加密

    1.1、加密

    官网下载加密 jar 包 classfinal-fatjar.jar

    笔者使用国内 gitee,找到下图位置,点击下载

    d7bbad6bc9b540d19f2000e42b0c6ff2.png

    下载完成后得到 classfinal-fatjar-1.2.1.jar

    daa5599ee6a64b669dea7ed266663f8b.png

     

    下面笔者使用 IDEA 新建一个 SpringBoot 项目测试字节码加密

    项目名为 demo

    4d67c6914d90442cb07dece944c260d4.png

    SpringBoot版本 2.7.16,只选一个 web 依赖

    66538aebb6f04e11bdbdbbbd41b95ef0.png

    创建完成的项目

    pom.xml 文件

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>2.7.16version>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.wsjzzcbqgroupId>
    12. <artifactId>demoartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>demoname>
    15. <description>Demo project for Spring Bootdescription>
    16. <properties>
    17. <java.version>1.8java.version>
    18. properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.bootgroupId>
    22. <artifactId>spring-boot-starter-webartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframework.bootgroupId>
    26. <artifactId>spring-boot-starter-testartifactId>
    27. <scope>testscope>
    28. dependency>
    29. dependencies>
    30. <build>
    31. <plugins>
    32. <plugin>
    33. <groupId>org.springframework.bootgroupId>
    34. <artifactId>spring-boot-maven-pluginartifactId>
    35. plugin>
    36. plugins>
    37. build>
    38. project>

    application.properties 文件

    1. server.port=80
    2. name=Have a happy heart

    SpringBoot 启动类

    1. package com.wsjzzcbq.demo;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. @SpringBootApplication
    5. public class DemoApplication {
    6. public static void main(String[] args) {
    7. SpringApplication.run(DemoApplication.class, args);
    8. }
    9. }

    测试代码 DemoController

    1. package com.wsjzzcbq.demo.controller;
    2. import org.springframework.beans.factory.annotation.Value;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.RestController;
    5. /**
    6. * DemoController
    7. *
    8. * @author wsjz
    9. * @date 2023/09/27
    10. */
    11. @RestController
    12. public class DemoController {
    13. @Value("${name}")
    14. private String name;
    15. @RequestMapping("/demo")
    16. public String demo() {
    17. return name;
    18. }
    19. }

    将项目打成 jar 包

    78cbfe759a75447498f2215a52f0ba03.gif

    打开项目目录下的 target 目录,找到 jar 包

    0688bef0e3244822b4672e9e6424c00e.png

     

    将 jar 包复制到  classfinal-fatjar-1.2.1.jar 所在的目录进行加密

    14270a4a84964532b2af742a88312c4b.png

    加密命令

    java -jar classfinal-fatjar-1.2.1.jar -file demo-0.0.1-SNAPSHOT.jar -packages com.wsjzzcbq.demo -cfgfiles application.properties -pwd 123456 -Y

    java -jar classfinal-fatjar-1.2.1.jar -file demo-0.0.1-SNAPSHOT.jar -packages com.wsjzzcbq.demo -cfgfiles application.properties -pwd 123456

    上面的命令比下面的多了一个 -Y,其意思是 无需确认

    参数说明
    -file        加密的jar/war完整路径
    -packages    加密的包名(可为空,多个用","分割)
    -libjars     jar/war包lib下要加密jar文件名(可为空,多个用","分割)
    -cfgfiles    需要加密的配置文件,一般是classes目录下的yml或properties文件(可为空,多个用","分割)
    -exclude     排除的类名(可为空,多个用","分割)
    -classpath   外部依赖的jar目录,例如/tomcat/lib(可为空,多个用","分割)
    -pwd         加密密码,如果是#号,则使用无密码模式加密
    -code        机器码,在绑定的机器生成,加密后只可在此机器上运行
    -Y           无需确认,不加此参数会提示确认以上信息

    上面的命令对项目根 package com.wsjzzcbq.demo,和配置文件 application.properties 进行加密

     

    在需要加密的 jar 包的目录打开 cmd 窗口,执行上面的加密命令,对 jar 进行加密

    997b26cc76af4d72b5cdeae6550403fa.gif

     

    1.2、反编译测试

    这里笔者使用 jd-gui 进行反编译

    jd-gui 官网:http://java-decompiler.github.io/

    下载 windows 版本 

    76de1d0aac5649548edcaa28292d0c85.png

    下载后解压

    c9884c892e59421daa58523866bcce20.png

    37f2fcf2395a45e499a4d39053e01cf5.png

    双击打开 jd-gui.exe

    9639979c55634738b8f3fd134c016209.png

    选择加密后的 jar

    44c554b757c04c2ab9abeffb4b8c1e65.png

    反编译查看

    application.properties 文件为空

    DemoController的 demo 方法为空

    93d6b93319bd49c39e811c1ddc073940.gif

     

     

    2、使用 maven 插件进行加密

    在需要加密的项目 pom.xml 文件中添加 classfinal-maven-plugin 插件

    1. <plugin>
    2. <groupId>net.roseboygroupId>
    3. <artifactId>classfinal-maven-pluginartifactId>
    4. <version>${classfinal.version}version>
    5. <configuration>
    6. <password>123456password>
    7. <packages>com.wsjzzcbq.demopackages>
    8. <cfgfiles>application.propertiescfgfiles>
    9. configuration>
    10. <executions>
    11. <execution>
    12. <phase>packagephase>
    13. <goals>
    14. <goal>classFinalgoal>
    15. goals>
    16. execution>
    17. executions>
    18. plugin>

    classfinal.version 是 1.2.1

    完整 pom.xml 文件

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>2.7.16version>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.wsjzzcbqgroupId>
    12. <artifactId>demoartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>demoname>
    15. <description>Demo project for Spring Bootdescription>
    16. <properties>
    17. <java.version>1.8java.version>
    18. <classfinal.version>1.2.1classfinal.version>
    19. properties>
    20. <dependencies>
    21. <dependency>
    22. <groupId>org.springframework.bootgroupId>
    23. <artifactId>spring-boot-starter-webartifactId>
    24. dependency>
    25. <dependency>
    26. <groupId>org.springframework.bootgroupId>
    27. <artifactId>spring-boot-starter-testartifactId>
    28. <scope>testscope>
    29. dependency>
    30. dependencies>
    31. <build>
    32. <plugins>
    33. <plugin>
    34. <groupId>org.springframework.bootgroupId>
    35. <artifactId>spring-boot-maven-pluginartifactId>
    36. plugin>
    37. <plugin>
    38. <groupId>net.roseboygroupId>
    39. <artifactId>classfinal-maven-pluginartifactId>
    40. <version>${classfinal.version}version>
    41. <configuration>
    42. <password>123456password>
    43. <packages>com.wsjzzcbq.demopackages>
    44. <cfgfiles>application.propertiescfgfiles>
    45. configuration>
    46. <executions>
    47. <execution>
    48. <phase>packagephase>
    49. <goals>
    50. <goal>classFinalgoal>
    51. goals>
    52. execution>
    53. executions>
    54. plugin>
    55. plugins>
    56. build>
    57. project>

    添加 classfinal-maven-plugin 插件后可直接打包出加密的 jar

    5c5a02558d064436a1c7b4fc70ba6f65.gif

     

    3、运行加密后的 jar

    运行命令

    java -javaagent:demo-0.0.1-SNAPSHOT-encrypted.jar="-pwd 123456" -jar demo-0.0.1-SNAPSHOT-encrypted.jar

    运行测试

    4ade3f1d86b54930ba23a85228162a22.gif

    浏览器访问 http://localhost/demo

    95925b8ba0344e11b441d2958e06c966.png

    至此完

     

     

     

  • 相关阅读:
    Linux系统编程学习笔记
    月报总结|Moonbeam 10月份大事一览
    PyTorch离线安装
    计算机毕业设计Java智能旅游电子票务系统演示录像2020(源码+系统+mysql数据库+lw文档)
    【数学】【位运算】Divan and bitwise operations—CF1614C
    25.1 MySQL SELECT语句
    A星(A*、A Star)路径规划算法详解(附MATLAB代码)
    eclipse启动web项目优化
    算法 缺失的第一个正整数-(哈希)
    深度学习之基于YoloV8的行人跌倒目标检测系统
  • 原文地址:https://blog.csdn.net/wsjzzcbq/article/details/133179309