# JavaByteShield **Repository Path**: gityyge/java-byte-shield ## Basic Information - **Project Name**: JavaByteShield - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-01 - **Last Updated**: 2026-06-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # java-byte-shield 使用说明 > Java 字节码 AES 加密保护 — 编译后加密敏感方法,运行时动态解密执行 --- ## 环境要求 - **JDK** 21+ - **Maven** 3.6+ - **操作系统** Windows / Linux / macOS --- ## 快速开始 ### 1. 打包 ```bash mvn clean package -PEncryptInstall -DskipTests ``` 或在 PowerShell 中直接运行脚本: ```powershell .\EncryptInstall.ps1 ``` **产物:** | 文件 | 说明 | |------|------| | `target/obfuscated-demo-1.0-SNAPSHOT.jar` | 应用 fat JAR(含加密 .enc 文件) | | `target/decrypt-agent.jar` | Java Agent JAR(~300KB,仅 Agent + SnakeYAML) | > 如果不加 `-PEncryptInstall`,只会打出普通的未加密 JAR,方法体不会被清空。 --- ### 2. 运行 #### 方式一:普通运行(方案一/方案二) ```bash java -jar target/java-byte-shield-1.0-SNAPSHOT.jar ``` 程序使用 `FileClassLoader`(方案二)运行,自动解密并执行业务逻辑。 #### 方式二:Agent 运行(方案三 ★推荐) ```bash java -javaagent:target/decrypt-agent.jar -jar target/java-byte-shield-1.0-SNAPSHOT.jar ``` JVM 在类加载阶段自动将空壳字节码替换为真实字节码,业务代码完全不用改,可以直接 `import` / `new` / `@Autowired`。 --- ### 3. 预期输出 ``` [FileClassLoader] 已从 classpath 加密资源加载: com.example.service.UserService ======================================== 方案二:FileClassLoader 方案 ======================================== === 执行业务逻辑 getUserInfo === 返回: User: 001, Name: Zhang San, Age: 25 结果: User: 001, Name: Zhang San, Age: 25 === 执行业务逻辑 calculatePrice === 原价: 150.0, 折扣: 0.9, 最终价: 135 结果: 135 [方案二] FileClassLoader 演示完成 ``` 如果使用 Agent 方式启动,会先看到 `[DecryptAgent] Java Agent 解密拦截器已加载`,然后执行方案三代码。 --- ## 项目结构 ``` javassistDemo/ ├── pom.xml ← Maven 配置 ├── EncryptInstall.ps1 ← 一键打包脚本 ├── 混淆加密原理说明.md ← 详细原理文档 ├── README.md ← 本文档 ├── src/main/java/com/example/ │ ├── agent/DecryptAgent.java ← 方案三:Java Agent │ ├── annotation/EncryptMethod.java ← @EncryptMethod 注解 │ ├── config/ConfigUtil.java ← 密钥管理 │ ├── core/ │ │ ├── FileClassLoader.java ← 方案二:打破双亲委派 │ │ └── ObfuscateProxy.java ← 方案一:JDK 动态代理 │ ├── processor/ │ │ ├── BuildTimeProcessor.java ← 编译期流程编排 │ │ └── BytecodeEncryptor.java ← 编译期具体实现 │ ├── service/ │ │ ├── IUserService.java ← 接口 │ │ └── UserService.java ← 加密保护的目标类 │ └── DemoApplication.java ← 启动入口 └── src/main/resources/ └── application.yml ← 应用配置(含 AES 密钥) ``` --- ## 加密原理(一句话) 编译时用 Javassist + AES 把 `@EncryptMethod` 方法的真实字节码加密为 `.enc` 文件,方法体清空为 `return null`。运行时通过代理/ClassLoader/Agent 三种方式之一解密并执行真实逻辑。 详细说明见 [混淆加密原理说明.md](混淆加密原理说明.md)。