源盾(CodeShield)用户使用手册
版本:v1.8.1
适用对象:使用源盾保护 Java/Kotlin 字节码的研发、运维与安全工作工程师。
目录
- 第一章 产品简介
- 1.1 什么是源盾
- 1.2 核心能力
- 1.3 适用场景
- 1.4 保护边界与安全声明
- 第二章 快速开始
- 2.1 环境准备
- 2.2 获取插件
- 2.3 生成包裹密码
- 2.4 Gradle 最小配置
- 2.5 Maven 最小配置
- 2.6 第一次保护并验证
- 第三章 许可证与授权
- 3.1 许可证概述
- 3.2 配置许可证密钥
- 3.3 在线校验与机器激活
- 3.4 离线许可证文件
- 3.5 查看本机硬件指纹
- 3.6 许可证常见问题
- 第四章 Gradle 插件详解
- 4.1 插件应用方式
- 4.2
bceProtect {}DSL 配置项 - 4.3 任务清单
- 4.4 常见 Gradle 错误与排查
- 第五章 Maven 插件详解
- 5.1 插件坐标与生命周期绑定
- 5.2 常用配置参数
- 5.3 常见 Maven 错误与排查
- 第六章 CLI 独立使用
- 6.1
bce-protect.exe参数说明 - 6.2 加密流程示例
- 6.3 提取与使用
bce_agent.dll - 第七章 加密模式与策略选择
- 7.1 M1 全加密
- 7.2 M2 方法体加密(默认)
- 7.3 M1 + M2 混合模式
- 7.4 如何选择加密范围(白名单模型)
- 7.5 自动分析:
bceAnalyze与 YAML 候选配置 - 第八章 高级功能
- 8.1 字符串加密与
excludeStrings - 8.2 名称混淆与映射文件
- 8.3 依赖 JAR 同步加密:
extraJars - 8.4 运行时启动与 Native Agent 参数
- 第九章 框架兼容性
- 9.1 Spring / Spring Boot
- 9.2 JPA / Hibernate
- 9.3 CGLIB / AOP
- 9.4 Jackson / 序列化
- 9.5 OSGi / 热部署
- 第十章 AI Agent Skill 使用指南
- 10.1 什么是 codeshield-skill
- 10.2 支持的 Agent 与安装方式
- 10.3 典型对话示例
- 10.4 Skill 能做什么、不能做什么
- 10.5 自定义与更新 Skill
- 第十一章 常见问题与故障排查
- 11.1 构建阶段错误
- 11.2 运行时错误
- 11.3 Agent DLL 相关错误
- 11.4 性能与兼容性问题
- 11.5 从哪里获取 agent 动态链接库?
- 附录
- 附录 A:插件 ID 与 Maven 坐标速查表
- 附录 B:DSL / XML 配置示例合集
- 附录 C:术语表
第一章 产品简介
1.1 什么是源盾
源盾(Code Shield)是北京塔尔旺科技有限公司出品的 JVM 字节码加密保护产品。它在构建期对 Java/Kotlin class 文件进行加密,在运行期通过 Native Agent 透明解密,让反编译工具看到的是加密后的乱码或占位符,从而保护核心代码与知识产权。
1.2 核心能力
| 能力 | 说明 |
|---|---|
| M1 全加密 | 对整个 .class 文件加密,替换为仅保留类名的 Stub。安全等级高,适合不需要框架扫描的纯内部类。 |
| M2 方法体加密(默认) | 保留完整类结构,仅加密方法体与字符串常量。兼容 Spring、JPA、AOP/CGLIB 等主流框架。 |
| M1 + M2 混合 | 同一 JAR 中按类显式选择不同策略,兼顾安全与兼容。 |
| 字符串加密 | 常量池中用户可见字符串替换为等长占位符,运行时还原。 |
| 名称混淆 | 对指定类的私有方法/字段/类名进行视觉混淆,并输出映射文件。 |
| Native Agent 透明解密 | 运行时无感解密,无需修改业务代码。 |
| 商业许可证 | 加密构建需持有效许可证,支持在线校验与离线许可证文件两种授权方式。 |
1.3 适用场景
- SDK / 中间件厂商:核心算法用 M1 模式加密,对外 API 用 M2 模式加密。
- 企业核心系统:关键算法类用 M1 模式,业务类 M2 模式。
- SaaS 多租户后端:用 M2 模式 + 字符串加密保护业务逻辑。
- JavaFX / 桌面应用:核心算法用 M1 模式,UI 与业务类用 M2 模式。
- 试点 / PoC:先配置 1~2 个工具类 M1,验证运行后再扩展。
1.4 保护边界与安全声明
- 源盾保护的是编译后的字节码,不是源代码。
- 加密后的 JAR 必须配合 Native Agent(
bce_agent.dll/libbce_agent.so/libbce_agent.dylib)才能运行。 - 密码以包裹形式配置(即包裹密码),构建脚本中不出现明文。
- 每次执行加密构建都需要有效的商业许可证(见第三章)。
第二章 快速开始
2.1 环境准备
| 组件 | 最低要求 |
|---|---|
| JDK | 8+(源码/目标 1.8) |
| Gradle | 7+(插件使用场景) |
| Maven | 3.6+(插件使用场景) |
| 操作系统 | Windows x64 / Linux x86_64 / macOS arm64(Apple Silicon,macOS 14+);插件内嵌三平台二进制,自动按系统提取 |
| 许可证 | 有效的源盾许可证密钥(向塔尔旺科技商务获取) |
2.2 获取插件
- Gradle 插件(v1.8.1 起发布在 Maven Central,两种方式任选,详见 4.1):
plugins {}块(推荐,需在 settings.gradle 的pluginManagement中声明mavenCentral()):plugins { id 'com.telecwin.codeshield.jvm' version '1.8.1' }buildscript {} + apply plugin(不便改 settings.gradle 时):buildscript { classpath 'com.telecwin.codeshield:codeshield-gradle-plugin:1.8.1' }+apply plugin: 'com.telecwin.codeshield.jvm'- Maven 插件(Maven 默认从 Maven Central 解析,无需额外配置仓库):
- 坐标:
com.telecwin.codeshield:codeshield-maven-plugin:1.8.1
2.3 生成包裹密码
Gradle:
./gradlew bceGeneratePassword --no-daemon
Maven:
mvn com.telecwin.codeshield:codeshield-maven-plugin:1.8.1:generate-password
输出示例(每次随机):
============================================================
BCE 加密密码(请妥善保存,丢失将无法解密)
============================================================
RJreKJXd58bYAcizcFsClEFCRmCve0AM27YWaoqTpDQ=
============================================================
从 v1.1+ 开始,禁止使用明文密码。未使用包裹形态的密码会被插件 / CLI / Agent 拒绝。
v1.7.0 起密码包裹格式升级:
base64( 随机 IV[12] || AES-GCM 密文 ),16 字节明文密码对应的包裹串为 60 字符(旧版 44 字符)。同一密码每次生成的包裹串不同(随机 IV)。v1.6.x 及更早版本生成的包裹密码(含带enc:前缀的历史格式)在 v1.7.0 中一律失效,升级后需重新运行bceGeneratePassword/generate-password生成并替换。
2.4 Gradle 最小配置
plugins {
id 'com.telecwin.codeshield.jvm' version '1.8.1'
}
bceProtect {
licenseKey = 'YOUR-LICENSE-KEY' // 替换为你的许可证密钥
password = 'RJreKJXd58bYAcizcFsClEFCRmCve0AM27YWaoqTpDQ='
encryptStrings = true
excludeStrings = ['java.', 'org.springframework']
}
执行:
./gradlew bceProtect --no-daemon
产物:build/libs/<artifact>-<version>-protected.jar,同目录默认还会输出 bce_agent.dll。
2.5 Maven 最小配置
<plugin>
<groupId>com.telecwin.codeshield</groupId>
<artifactId>codeshield-maven-plugin</artifactId>
<version>1.8.1</version>
<configuration>
<licenseKey>YOUR-LICENSE-KEY</licenseKey>
<password>RJreKJXd58bYAcizcFsClEFCRmCve0AM27YWaoqTpDQ=</password>
<encryptStrings>true</encryptStrings>
<excludeStrings>java.,org.springframework</excludeStrings>
</configuration>
<executions>
<execution>
<goals>
<goal>protect</goal>
<goal>extract-agent</goal>
</goals>
</execution>
</executions>
</plugin>
执行:
mvn package
产物:target/<artifact>-<version>-protected.jar,target/bce_agent.dll。
2.6 第一次保护并验证
# Gradle
./gradlew bceProtect --no-daemon
ls build/libs/*-protected.jar build/libs/bce_agent.dll
# Maven
mvn package
ls target/*-protected.jar target/bce_agent.dll
运行:
java -agentpath:./bce_agent.dll=RJreKJXd58bYAcizcFsClEFCRmCve0AM27YWaoqTpDQ= \
-jar build/libs/myapp-1.0.0-protected.jar
第三章 许可证与授权
3.1 许可证概述
源盾是商业授权产品。每一次执行加密构建(Gradle bceProtect、Maven protect、CLI bce-protect)都会校验许可证,未配置或校验失败时构建会直接中止。
- 许可证密钥(license key)格式:
XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XX, 从这里购买许可证。 - 支持两种授权方式:
- 在线校验(默认):构建时连接许可证服务器完成验证,首次使用自动激活当前机器。
- 离线许可证文件:使用
.lic许可证文件在本地完成验证,适合无法访问外网的 CI / 内网环境。 - 许可证服务器地址、账号等参数已内置在加密工具中,用户只需提供许可证密钥。
保密提示:许可证密钥等同授权凭证,请勿提交到公开仓库或随产品分发给最终客户。
3.2 配置许可证密钥
Gradle(build.gradle):
bceProtect {
licenseKey = 'YOUR-LICENSE-KEY'
password = '...'
}
Maven(pom.xml):
<configuration>
<licenseKey>YOUR-LICENSE-KEY</licenseKey>
<password>...</password>
</configuration>
CLI:
bce-protect.exe input.jar output.jar <password> --license-key=YOUR-LICENSE-KEY
环境变量(三种用法通用,适合 CI 保密注入):
# Windows PowerShell
$env:BCE_LICENSE_KEY="YOUR-LICENSE-KEY"
# Linux/macOS
export BCE_LICENSE_KEY="YOUR-LICENSE-KEY"
构建脚本中的
licenseKey优先级高于环境变量BCE_LICENSE_KEY。建议本地开发写在脚本里,CI 用环境变量注入。
3.3 在线校验与机器激活
默认模式。加密构建时流程如下:
- 加密工具携带许可证密钥 + 本机硬件指纹,向许可证服务器发起校验。
- 首次使用该密钥的机器会自动完成激活(按硬件指纹绑定),无需手工操作。
- 校验通过后,自动在当前工作目录生成离线许可证文件
bce.lic,供后续离线校验使用。 - 开始加密。
多机器许可证:一张许可证可绑定多台机器(取决于授权策略的机器数上限 maxMachines)。
每台新机器首次使用时同样自动激活,直到占满名额。机器数达到上限后,新机器会收到类似下面的提示:
License machine limit reached: 3/3 machine(s) already bound to this license.
Please deactivate a previously bound machine first, or contact your license administrator to increase the machine limit.
其中 M/N 表示“已绑定 M 台 / 上限 N 台”。此时请先在不再使用的旧机器上解绑(联系塔尔旺科技管理员),或追加授权。
注意事项:
- 构建机器需要能访问许可证服务器(HTTPS,默认
api.license.telecwin.com)。如公司有出口防火墙,请放行该域名。 - 每个许可证可激活的机器数量由购买的授权策略决定(单机或多机)。机器数用满后,新机器会报
machine limit reached,需联系塔尔旺科技释放不用的机器或追加授权。 - 更换构建机器(如 CI 迁移)前,建议先联系管理员确认可激活机器数。
3.4 离线许可证文件
适用于无法访问许可证服务器的内网 / 隔离环境。
获取方式:
- 在能联网的机器上成功执行一次加密构建,工作目录会自动生成
bce.lic(推荐); - 或由塔尔旺科技根据你的硬件指纹签发后交付。
使用方式:
Gradle:
bceProtect {
licenseKey = 'YOUR-LICENSE-KEY'
licenseFile = file('bce.lic')
password = '...'
}
Maven:
<configuration>
<licenseKey>YOUR-LICENSE-KEY</licenseKey>
<licenseFile>${project.basedir}/bce.lic</licenseFile>
<password>...</password>
</configuration>
CLI:
# 配置了 license-file 时仍先尝试在线,失败自动回退离线;--offline 强制离线
bce-protect.exe input.jar output.jar <password> \
--license-key=YOUR-LICENSE-KEY \
--license-file=bce.lic --offline
环境变量:BCE_LICENSE_FILE 指向 .lic 文件路径。
注意事项:
- 离线文件与许可证密钥、机器指纹绑定,三者必须匹配:把 A 机器的
bce.lic拿到 B 机器使用会校验失败。 bce.lic含授权信息,请与密钥同等保密;.gitignore中建议加入*.lic。- 许可证到期后离线文件同样失效,需重新获取。
3.5 查看本机硬件指纹
许可证按机器硬件指纹绑定。排查激活问题或申请离线签发时,管理员可能需要你提供指纹:
./gradlew bcePrintFingerprint --no-daemon
该任务会打印本机的硬件指纹分项信息(主板、CPU、磁盘等),整段复制给许可证管理员即可。
3.6 许可证常见问题
| 现象 / 报错 | 原因 | 处理 |
|---|---|---|
BCE license key must be configured |
未配置许可证密钥 | 配置 licenseKey 或环境变量 BCE_LICENSE_KEY |
License key is required(CLI) |
未传 --license-key |
传参或设置 BCE_LICENSE_KEY |
Online license validation failed ... Connection refused / timeout |
无法连接许可证服务器 | 检查网络与防火墙放行 api.license.telecwin.com;或改用离线 bce.lic |
license is already activated on another machine |
密钥已绑定其他机器,可激活数已满 | 联系塔尔旺科技释放旧机器或追加授权 |
NOT_FOUND / License not found |
密钥不存在或拼写错误 | 核对密钥(注意 0/O、1/I),仍失败联系我们 |
license has expired |
许可证已到期 | 联系我们续期,续期后离线文件需重新获取 |
No offline license file available for fallback |
在线失败且未配置离线文件 | 联网成功一次生成 bce.lic,或配置 licenseFile |
| 离线校验失败 | bce.lic 与密钥/机器不匹配或文件损坏 |
在绑定机器上重新生成,核对密钥一致 |
第四章 Gradle 插件详解
4.1 插件应用方式
两种方式任选其一。区别不在 Gradle 新旧版本(源盾要求 Gradle 7+,两种语法均支持),而在插件解析路径的配置位置。v1.8.1 起插件发布在 Maven Central(未发布到 Gradle Plugin Portal)。
| 方式 | 版本要求 | 适用场景 |
|---|---|---|
plugins {} 块 |
语法 Gradle 2.1+(2015-09 引入,5.0 起脱离孵化);声明自定义插件仓库需 pluginManagement(Gradle 3.5+) |
推荐。插件从 Maven Central 解析,只需在 settings.gradle 声明 mavenCentral() 为插件仓库 |
buildscript {} + apply plugin |
任意 Gradle 版本(1.x 起) | 不便改 settings.gradle 时;仓库直接写在 build.gradle。官方示例 bce-test 即采用此方式 |
方式一:plugins {}(需在 settings.gradle 配置 pluginManagement)
settings.gradle(pluginManagement 必须是该文件第一条语句):
pluginManagement {
repositories {
mavenCentral() // 源盾插件从这里解析(v1.8.1+)
gradlePluginPortal() // 其他插件的兜底的,保留
}
}
build.gradle:
plugins {
id 'com.telecwin.codeshield.jvm' version '1.8.1'
}
不配置
pluginManagement直接用plugins {}会报:Plugin [id: 'com.telecwin.codeshield.jvm', version: '1.8.1'] was not found in any of the following sources。 原因:Gradle 默认只查 Gradle Plugin Portal,源盾插件的 marker 发布在 Maven Central。
方式二:buildscript {} + apply plugin(任意 Gradle 版本)
buildscript {
repositories {
mavenCentral() // v1.8.1 起插件在 Maven Central
}
dependencies {
classpath 'com.telecwin.codeshield:codeshield-gradle-plugin:1.8.1'
}
}
apply plugin: 'com.telecwin.codeshield.jvm'
注意:请勿使用 Maven Central 上的 1.8.0(其插件 POM 缺运行时依赖,运行会报
NoClassDefFoundError),1.8.1 起已修复。
4.2 bceProtect {} DSL 配置项
bceProtect {
// ===== 必填 =====
licenseKey = 'YOUR-LICENSE-KEY' // 许可证密钥(或设 BCE_LICENSE_KEY)
password = '...'
// ===== 许可证(可选)=====
licenseFile = file('bce.lic') // 离线许可证文件,见第三章
offline = false // true 时强制离线校验
// ===== 输入/输出 =====
inputJar = file('build/libs/myapp.jar')
outputJar = file('build/libs/myapp-protected.jar')
// ===== 字符串加密 =====
encryptStrings = true
excludeStrings = ['java.', 'org.springframework']
// ===== M1 全加密白名单(YAML)=====
configFile = 'bce-full-encrypt.yaml'
// ===== 额外 JAR 同步加密 =====
extraJars = ['geo_utils', 'com.example:geo_utils', 'libs/custom.jar']
// ===== Native Agent 输出 =====
outputAgentDll = true // 默认 true
agentDllName = 'bce_agent.dll' // 默认 'bce_agent.dll'
// ===== 名称混淆 =====
obfuscationEnabled = false
obfuscationClasses = ['com.example.SecretUtil']
obfuscationAdaptClassStrings = true
obfuscationGenerateMapping = true
}
4.3 任务清单
| 任务 | 作用 | 输出 |
|---|---|---|
bceGeneratePassword |
生成包裹密码 | stdout |
bceProtect |
校验许可证,加密主 JAR 与 extraJars |
protected.jar、bce_agent.dll、报告 |
bceAnalyze |
扫描并推荐 M1 候选类与混淆候选 | YAML 报告 |
bcePrintFingerprint |
打印本机硬件指纹(用于许可证激活/排障) | stdout |
4.4 常见 Gradle 错误与排查
| 错误 | 原因 | 修复 |
|---|---|---|
Plugin com.telecwin.codeshield.jvm was not found |
未发布到本地/远程仓库 | 先执行 ./gradlew :bce-gradle-plugin:publishToMavenLocal --no-daemon |
BCE license key must be configured |
未配置许可证密钥 | 配置 licenseKey 或 BCE_LICENSE_KEY,见第三章 |
Online license validation failed |
无法连接许可证服务器 / 密钥无效 | 见 3.6 许可证常见问题 |
Plaintext password rejected |
密码未使用包裹形态 | 运行 bceGeneratePassword 后使用其输出 |
bce-protect.exe not found |
插件 jar 内未嵌入 exe | 先构建 :bce-native-protect:nativeImage 并重新发布插件 |
| Gradle daemon 挂起 | 未加 --no-daemon |
所有 Gradle 命令追加 --no-daemon |
第五章 Maven 插件详解
5.1 插件坐标与生命周期绑定
<plugin>
<groupId>com.telecwin.codeshield</groupId>
<artifactId>codeshield-maven-plugin</artifactId>
<version>1.8.1</version>
<configuration>
<licenseKey>YOUR-LICENSE-KEY</licenseKey>
<password>...</password>
</configuration>
<executions>
<execution>
<goals>
<goal>protect</goal>
</goals>
</execution>
</executions>
</plugin>
protect 默认绑定到 package 阶段。
5.2 常用配置参数
| XML 字段 | 说明 | 默认值 |
|---|---|---|
licenseKey |
许可证密钥(或设 BCE_LICENSE_KEY) |
必填 |
licenseFile |
离线许可证文件路径 | 空(在线校验) |
offline |
是否强制离线校验 | false |
password |
包裹密码 | 必填 |
inputJar |
输入 JAR | ${project.build.directory}/${project.build.finalName}.jar |
outputJar |
输出 JAR | ...-protected.jar |
encryptStrings |
是否加密字符串 | true |
excludeStrings |
字符串加密排除前缀 | 空 |
configFile |
M1 白名单 YAML | 空 |
extraJars |
额外加密 JAR | 空 |
outputAgentDll |
是否提取 agent DLL | true |
agentDllName |
agent DLL 文件名 | bce_agent.dll |
Maven 配置标签名 = Java 字段名(如
password),不是@Parameter(property = "bce.password")中的属性名。
5.3 常见 Maven 错误与排查
| 错误 | 原因 | 修复 |
|---|---|---|
Parameter 'bce.password' is unknown |
使用了 <bce.password> 标签 |
改为 <password> |
BCE license key must be configured |
未配置许可证密钥 | 配置 <licenseKey> 或 BCE_LICENSE_KEY,见第三章 |
Plaintext password rejected |
密码未使用包裹形态 | 运行 generate-password goal |
Failed to parse plugin descriptor |
插件 jar 缺少 plugin.xml |
重新发布 bce-maven-plugin |
第六章 CLI 独立使用
6.1 bce-protect 参数说明
适合未使用 Gradle/Maven 的项目或 CI 独立步骤。bce-protect 为 GraalVM Native Image 单文件可执行程序,Windows 下为 bce-protect.exe,Linux 下为 bce-protect,参数完全一致。
# 生成密码
bce-protect.exe --generate-password
# 打印本机硬件指纹(许可证激活/排障用)
bce-protect.exe --print-fingerprint
# 加密 JAR(在线校验许可证)
bce-protect.exe \
input.jar \
output-protected.jar \
RJreKJXd58bYAcizcFsClEFCRmCve0AM27YWaoqTpDQ= \
true "java.,org.springframework" \
--full-encrypt=com.example.CryptoHelper,com.example.AESUtil \
--license-key=YOUR-LICENSE-KEY
# 加密 JAR(强制离线校验)
bce-protect.exe input.jar output-protected.jar <password> \
--license-key=YOUR-LICENSE-KEY \
--license-file=bce.lic --offline
# 运行时
java -agentpath:./bce_agent.dll=RJreKJXd58bYAcizcFsClEFCRmCve0AM27YWaoqTpDQ= \
-jar output-protected.jar
许可证相关参数:
| 参数 | 说明 |
|---|---|
--license-key=<key> |
许可证密钥(必填,或设 BCE_LICENSE_KEY) |
--license-file=<path> |
离线许可证文件(或设 BCE_LICENSE_FILE) |
--offline |
强制离线校验,不连接许可证服务器 |
--print-fingerprint |
打印本机硬件指纹后退出 |
6.2 加密流程示例
- 准备待加密的
input.jar。 - 执行
--generate-password获得包裹密码。 - 执行加密命令,指定许可证密钥、是否启用字符串加密、排除前缀、M1 类列表。
- 将输出
output-protected.jar与bce_agent.dll一起部署。
6.3 提取与使用 Native Agent
CLI 加密后,可在输出目录找到 bce_agent.dll(Windows)、libbce_agent.so(Linux)或 libbce_agent.dylib(macOS)。
运行时通过 -agentpath: 指定:
# Windows
java -agentpath:/opt/codeshield/bce_agent.dll=YOUR_PASSWORD -jar app-protected.jar
# Linux
java -agentpath:/opt/codeshield/libbce_agent.so=YOUR_PASSWORD -jar app-protected.jar
第七章 加密模式与策略选择
7.1 M1 全加密
- 对整个 class 文件加密,替换为仅保留类名的 Stub。
- 反编译后只剩类名,方法、字段、注解、字节码全部不可见。
- 不适合 Spring 组件、抽象类、枚举、注解、SPI 类。
- 适合:纯内部工具类、加密算法、License 校验、离线工具。
7.2 M2 方法体加密(默认)
- 保留完整类结构(类名、注解、字段、方法签名、接口)。
- 仅加密方法体与字符串常量。
- 兼容 Spring、JPA、AOP/CGLIB、Jackson 等框架。
- 默认输出模式,密钥派生已高度优化,启动开销极低。
7.3 M1 + M2 混合模式
通过 YAML 显式指定 M1 类,其余类自动走 M2:
# bce-full-encrypt.yaml
fullEncryptClasses:
- com.example.util.CryptoHelper
- com.example.algorithm.AESUtil
excludePackages:
- com.example.controller
- com.example.entity
excludeClasses:
- com.example.*Test
在 build.gradle 中引用:
bceProtect {
password = '...'
configFile = 'bce-full-encrypt.yaml'
}
7.4 如何选择加密范围(白名单模型)
源盾采用白名单(opt-in)模型:
- 未列入
fullEncryptClasses的类不会被 M1 全加密。 - 默认全部走 M2 方法体加密。
- 建议从 1~2 个工具类开始试点,验证运行后再扩展。
7.5 自动分析:bceAnalyze 与 YAML 候选配置
./gradlew bceAnalyze --no-daemon
输出:
build/reports/bce-full-encrypt-candidates.yaml(M1 候选)build/reports/bce-obfuscation-suggestions.yaml(混淆候选)
自动排除规则:
- 接口 / 抽象类 / 枚举 / 注解
- 含 Spring/JPA 等框架注解的类
- 含 main 方法的类
- SPI 类、Spring AutoConfig 类
- 匹配 excludePackages / excludeClasses 的类
第八章 高级功能
8.1 字符串加密与 excludeStrings
bceProtect {
encryptStrings = true
excludeStrings = [
'java.',
'javax.',
'org.springframework.',
'org.hibernate.',
'com.fasterxml.jackson.',
'jakarta.',
'org.slf4j.',
'ch.qos.logback.',
'org.apache.tomcat.'
]
}
效果:反编译工具中字符串显示为等长下划线 ________,运行时由 Agent 还原。
8.2 名称混淆与映射文件
bceProtect {
obfuscationEnabled = true
obfuscationClasses = ['com.example.SecretUtil', 'com.example.CryptoHelper']
obfuscationAdaptClassStrings = true
obfuscationGenerateMapping = true
}
- 仅混淆指定类的私有方法/字段(可选类名)。
mapping.txt输出到build/bce/obfuscation-mapping.txt。- 与 M1 全加密混用时:
bce-full-encrypt.yaml中的fullEncryptClasses必须使用原始类名,因为混淆发生在 M1 匹配之前,插件会用混淆后的名称去匹配。
8.3 依赖 JAR 同步加密:extraJars
源盾支持对项目的依赖jar进行加密,而不只是项目产生的jar进行加密,这样在项目发布、打包时更加方便。
bceProtect {
extraJars = [
'geo_utils', // 按依赖名
'com.example:geo_utils', // 按 group:name
'libs/my-custom.jar' // 按相对路径
]
}
加密后的额外 JAR 输出到 build/bce-extra/。
8.4 运行时启动与 Native Agent 参数
java -agentpath:./bce_agent.dll=YOUR_PASSWORD \
-jar app-protected.jar
参数说明:
- -agentpath: 后接 DLL 绝对或相对路径。
- = 后接包裹密码。
- 多个 JVM 参数顺序无特殊要求。
第九章 框架兼容性
9.1 Spring / Spring Boot
M2 保留完整类结构,因此:
| 场景 | 兼容 |
|---|---|
@ComponentScan |
✅ |
@Autowired |
✅ |
@Value 注入 |
✅ |
| AOP / CGLIB 代理 | ✅ |
| Spring Boot 嵌套 JAR | ✅(v1.1.1+) |
9.2 JPA / Hibernate
M2 保留字段与 @Entity 注解,实体扫描正常。
M1 会破坏实体类,抽象
@Entity父类已由bceAnalyze自动排除。
9.3 CGLIB / AOP
M2 保留方法签名,CGLIB 可正常生成代理子类。
9.4 Jackson / 序列化
运行时已还原为完整字节码,序列化/反序列化正常。
9.5 OSGi / 热部署
Native Agent 在 ClassFileLoadHook 阶段解密,兼容动态类加载与热部署。
第十章 AI Agent Skill 使用指南
10.1 什么是 codeshield-skill
codeshield-skill 是面向 AI 编码助手(Claude Code、OpenCode、Cursor、Cline 等)的技能包。安装后,AI Agent 能够识别源盾相关指令,自动帮你生成密码、配置插件、排查错误。
10.2 支持的 Agent 与安装方式
自动安装:
# Linux / macOS
./codeshield-skill/install/install.sh
# Windows PowerShell
.\codeshield-skill\install\install.ps1
安装路径:
- Claude Code:~/.claude/skills/codeshield/
- OpenCode:~/.opencode/skill/codeshield/
- Cursor:<project>/.cursor/skills/codeshield/
手动安装:
下载 codeshield-skill-1.8.1.zip 并解压到上述目录。
10.3 典型对话示例
生成密码并配置:
用户:帮我把这个 Java 项目用源盾加密一下。
Agent:
1. 运行 ./gradlew bceGeneratePassword --no-daemon
2. 在 build.gradle 中添加 id 'com.telecwin.codeshield.jvm' version '1.8.1'
3. 配置 bceProtect { licenseKey = '...'; password = '...' }
4. 运行 ./gradlew bceProtect --no-daemon
排查错误:
用户:运行时报 BCEProtected class file cannot be loaded。
Agent:启动命令缺少 -agentpath,请使用:
java -agentpath:./bce_agent.dll=YOUR_PASSWORD -jar app-protected.jar
10.4 Skill 能做什么、不能做什么
能做:
- 识别 bceProtect、bceGeneratePassword、包裹密码等关键词。
- 生成密码并写入构建脚本。
- 推荐算法、排除字符串、混淆范围。
- 根据错误信息给出修复建议。
不能做: - 替你修改商业许可证配置。 - 提供加密/解密算法实现细节。 - 替代内部安全审计流程。
10.5 自定义与更新 Skill
Skill 版本与产品版本一致。升级产品时,建议同步替换 skill 目录下的文件。
第十一章 常见问题与故障排查
11.1 构建阶段错误
| 错误 | 原因 | 修复 |
|---|---|---|
Plaintext password rejected |
密码未使用包裹形态 | 运行 bceGeneratePassword / generate-password |
BCE license key must be configured |
未配置许可证密钥 | 配置 licenseKey / BCE_LICENSE_KEY,见第三章 |
Online license validation failed |
连不上许可证服务器 / 密钥无效 / 机器数已满 | 见 3.6 许可证常见问题 |
Plugin ... was not found |
本地仓库未发布或缓存旧坐标 | 重新 publishToMavenLocal 或升级版本号 |
bce-protect.exe not found |
插件未嵌入 exe | 先构建 native-protect 并重新发布插件 |
Parameter 'bce.password' is unknown |
Maven 配置标签错误 | 使用 <password> 而非 <bce.password> |
11.2 运行时错误
| 错误 | 原因 | 修复 |
|---|---|---|
BCEProtected class file cannot be loaded |
未挂 Agent | 添加 -agentpath:./bce_agent.dll=... |
UnsatisfiedLinkError |
DLL 与 JVM 位数不匹配 | 确认使用 64 位 JVM |
NoClassDefFoundError: kotlin/... |
Kotlin stdlib 未加入 classpath | 运行时包含 kotlin-stdlib-*.jar |
failed to decode wrapped password |
包裹密码字符串损坏 | 重新生成并复制 |
11.3 Agent DLL 相关错误
| 错误 | 原因 | 修复 |
|---|---|---|
Native agent DLL not found |
未生成或未复制 DLL | Gradle 默认输出到 build/libs/;Maven 需配置 extract-agent goal |
| DLL 加载失败 | 系统缺少 VC++ 运行库 | 安装对应 Visual C++ Redistributable |
11.4 性能与兼容性问题
| 现象 | 原因 | 修复 |
|---|---|---|
| 启动明显变慢(旧版本) | 旧版密钥派生开销 | 升级到 v1.5.0+(密钥派生已优化,单类开销微秒级) |
| Spring Boot 启动失败 | M1 错误地加密了框架类 | 将 Spring 组件从 fullEncryptClasses 移除 |
| 字符串加密后日志乱码 | 日志框架字符串被加密 | 将日志框架前缀加入 excludeStrings |
11.5 从哪里获取 agent 动态链接库?
agent 动态链接库(bce_agent.dll / libbce_agent.so / libbce_agent.dylib)来源有三种:
-
Gradle 插件自动提取(默认) 执行
./gradlew bceProtect --no-daemon后,bce_agent.dll会自动输出到build/libs/目录,与*-protected.jar同目录。 -
Maven 插件
extract-agentgoal 在插件配置中加入<goal>extract-agent</goal>,执行mvn package后,bce_agent.dll会输出到target/目录。 -
从插件 jar 中手动解压 如果 CI 环境需要单独获取 agent,可以从已发布的
codeshield-gradle-plugin-1.8.1.jar或codeshield-maven-plugin-1.8.1.jar中解压:META-INF/native/windows-x86_64/bce_agent.dll(Windows)、META-INF/native/linux-x86_64/libbce_agent.so(Linux)或META-INF/native/macos-aarch64/libbce_agent.dylib(macOS)。 -
商务交付包 企业客户也可以从塔尔旺科技提供的正式交付包中获取对应平台的 agent 二进制文件。
附录
附录 A:插件 ID 与 Maven 坐标速查表
| 项目 | 值 |
|---|---|
| Gradle plugin id | com.telecwin.codeshield.jvm |
| Gradle 插件坐标 | com.telecwin.codeshield:codeshield-gradle-plugin:1.8.1 |
| Maven 插件坐标 | com.telecwin.codeshield:codeshield-maven-plugin:1.8.1 |
| DSL 块名 | bceProtect { ... } |
| Maven 配置标签 | <licenseKey>、<password>、<encryptStrings> 等 |
| 许可证环境变量 | BCE_LICENSE_KEY、BCE_LICENSE_FILE |
附录 B:DSL / XML 配置示例合集
完整 Gradle 配置:
plugins {
id 'com.telecwin.codeshield.jvm' version '1.8.1'
}
bceProtect {
licenseKey = 'YOUR-LICENSE-KEY'
password = 'RJreKJXd58bYAcizcFsClEFCRmCve0AM27YWaoqTpDQ='
encryptStrings = true
excludeStrings = ['java.', 'org.springframework']
configFile = 'bce-full-encrypt.yaml'
extraJars = ['geo_utils']
outputAgentDll = true
agentDllName = 'bce_agent.dll'
obfuscationEnabled = true
obfuscationClasses = ['com.example.SecretUtil']
obfuscationAdaptClassStrings = true
obfuscationGenerateMapping = true
}
完整 Maven 配置:
<plugin>
<groupId>com.telecwin.codeshield</groupId>
<artifactId>codeshield-maven-plugin</artifactId>
<version>1.8.1</version>
<configuration>
<licenseKey>YOUR-LICENSE-KEY</licenseKey>
<password>RJreKJXd58bYAcizcFsClEFCRmCve0AM27YWaoqTpDQ=</password>
<encryptStrings>true</encryptStrings>
<excludeStrings>java.,org.springframework</excludeStrings>
<configFile>bce-full-encrypt.yaml</configFile>
<outputAgentDll>true</outputAgentDll>
<agentDllName>bce_agent.dll</agentDllName>
</configuration>
<executions>
<execution>
<goals>
<goal>protect</goal>
<goal>extract-agent</goal>
</goals>
</execution>
</executions>
</plugin>
附录 C:术语表
| 术语 | 说明 |
|---|---|
| M1 全加密 | 对整个 class 文件加密为 Stub |
| M2 方法体加密 | 保留类结构,仅加密方法体与字符串 |
| 包裹密码 | 经包裹编码的源盾加解密密码,由 bceGeneratePassword 生成,构建脚本中不出现明文 |
| Native Agent | 运行时解密的 C++ JVMTI Agent |
bceProtect |
Gradle/Maven 插件的加密任务/goal |
bceAnalyze |
扫描候选类的分析任务 |
bcePrintFingerprint |
打印本机硬件指纹的任务(许可证激活/排障用) |
| 许可证密钥(license key) | 源盾商业授权凭证,加密构建时校验 |
离线许可证文件(.lic) |
与密钥和机器指纹绑定的本地授权文件,用于无外网环境 |
bce_agent.dll |
Windows 平台的 Native Agent 动态链接库 |
libbce_agent.so |
Linux 平台的 Native Agent 动态链接库 |
libbce_agent.dylib |
macOS 平台(Apple Silicon)的 Native Agent 动态链接库 |