classfinal加密Spring boot3

问题描述

classfinal是一个class文件加密的开源项目,原项目地址:https://gitee.com/roseboy/classfinal.git 但是目前已经停止维护。最近我在开发JavaFX + Spring boot3.5.10应用,希望能够保护一下代码,可是加密后的项目死活运行不起来,注入到Spring Bean属性中的依赖是加密过后的类信息(所有方法体代码都被清空了)于是就有了本次源码修改,。

排查思路

注入到Spring Bean属性中的依赖是加密过后的类信息(所有方法体代码都被清空了),也就是说解密加密成功了,解密的时候没有找到解密的类。所以主要去看解密逻辑-加密文件的查找逻辑。

原因分析

经过排查,导致无法解密的原因是:SpringBoot2 和SpringBoot3对于Class的获取方式发生了变化,需要修改加密文件路径的获取方式以兼容SpringBoot2 和Spring boot3。

解决方案

优化 `JarDecryptor.readEncryptedFile()` ,增强路径判断和获取逻辑,修改的关键代码如下:

java 复制代码
    /**
     * 在jar文件或目录中读取文件字节
     *
     * @param workDir jar文件或目录
     * @param name    文件名
     * @return 文件字节数组
     */
    public static byte[] readEncryptedFile(File workDir, String name) {
        String fileName = ENCRYPT_PATH + name;

        // 获取真实的 File 对象(处理 Spring Boot 3 的 nested 路径)
        File realFile = getRealFile(workDir);

        byte[] bytes = null;
        if (realFile.isFile()) {
            bytes = JarUtils.getFileFromJar(realFile, fileName);
        } else {
            File targetFile = new File(realFile, fileName);
            if (targetFile.exists()) {
                bytes = IoUtils.readFileToByte(targetFile);
            }
        }
        return bytes;
    }

    private static File getRealFile(File file) {
        String path = file.getPath();

        // 清理 nested: 前缀(Spring Boot 3)
        if (path.contains("nested:")) {
            String cleanPath = path.replaceAll(".*nested:", "");
            // 递归清理,防止多层嵌套
            return getRealFile(new File(cleanPath));
        }

        // 清理绝对路径中的 nested:
        String absPath = file.getAbsolutePath();
        if (absPath.contains("nested:")) {
            String cleanPath = absPath.replaceAll(".*nested:", "");
            return getRealFile(new File(cleanPath));
        }

        return file;
    }

运行效果

我测试了两个版本Spring boot2.7.12和Spring boot3.5.10都能正常对依赖进行解密注入。

注意

1 现在class final项目原作者已经停止维护了,无法发起PR,所以我自己创建了一个仓库,如果你想看我修改的代码,看这里https://gitee.com/pengjian5720/classfinal

2 修改了源码之后想要用到自己项目上的话,就升级一下版本号,把代码推送到本地仓库,然后在业务系统引入你自己的版本号就好了,maven会先在本地仓库查找的。

3 如果是一个团队项目,涉及到多人引用,那么你可以部署一个 nexus 代码仓库进行代码共享,把你修改后的代码推送到nexus服务就好了。

4 现在用classfinal的人好像也没多少,我就没有把代码推送到maven仓库,如果需要的话可以在评论区留言,要是用的人多我再考虑长期维护这个项目吧

复制代码
相关推荐
霸道流氓气质38 分钟前
Spring AI 多模态开发指南:图片理解与语音合成
java·人工智能·spring
en.en..42 分钟前
Linux mmap 内存映射深度解析:基于帧缓冲 /dev/fb0
java·服务器·前端
geovindu42 分钟前
CSharp: Command Pattern
开发语言·后端·c#·.net·.netcore·命令模式·行为模式
洋不写bug44 分钟前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
后台模板学习1 小时前
用 IM 即时聊天项目一次讲清消息去重算法的踩坑与解决方案
java·数据库·spring
秋名RG1 小时前
2026/6/15 系统故障复盘与整改方案
java·架构
今天要早睡_1 小时前
C++ 核心语法速过:命名空间、引用、函数重载与 nullptr 深度解析
android·java·c++
南讯股份Nascent1 小时前
2026年CRM技术选型观察:当“数据打通“成为第一需求,电商CRM的架构价值在哪里
java·大数据·用户运营
心易行者1 小时前
Python自动化测试7步落地法:用python在线运行省掉90%环境配置时间
java·开发语言·人工智能·python·log4j·ai编程
tedcloud1232 小时前
OpenLogi 怎么搭建?用 Rust 打造一个轻量的 Logitech 外设管理工具
linux·运维·服务器·开发语言·后端·rust·开源