源盾 CodeShield · 用户使用手册 ← 返回首页

源盾(CodeShield)用户使用手册

版本:v1.8.1

适用对象:使用源盾保护 Java/Kotlin 字节码的研发、运维与安全工作工程师。


目录


第一章 产品简介

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.jartarget/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 配置许可证密钥

Gradlebuild.gradle):

bceProtect {
    licenseKey = 'YOUR-LICENSE-KEY'
    password = '...'
}

Mavenpom.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 在线校验与机器激活

默认模式。加密构建时流程如下:

  1. 加密工具携带许可证密钥 + 本机硬件指纹,向许可证服务器发起校验。
  2. 首次使用该密钥的机器会自动完成激活(按硬件指纹绑定),无需手工操作。
  3. 校验通过后,自动在当前工作目录生成离线许可证文件 bce.lic,供后续离线校验使用。
  4. 开始加密。

多机器许可证:一张许可证可绑定多台机器(取决于授权策略的机器数上限 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 离线许可证文件

适用于无法访问许可证服务器的内网 / 隔离环境。

获取方式

  1. 在能联网的机器上成功执行一次加密构建,工作目录会自动生成 bce.lic(推荐);
  2. 或由塔尔旺科技根据你的硬件指纹签发后交付。

使用方式

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/O1/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.gradlepluginManagement 必须是该文件第一条语句):

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.jarbce_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 未配置许可证密钥 配置 licenseKeyBCE_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 加密流程示例

  1. 准备待加密的 input.jar
  2. 执行 --generate-password 获得包裹密码。
  3. 执行加密命令,指定许可证密钥、是否启用字符串加密、排除前缀、M1 类列表。
  4. 将输出 output-protected.jarbce_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 能做什么、不能做什么

能做: - 识别 bceProtectbceGeneratePassword、包裹密码等关键词。 - 生成密码并写入构建脚本。 - 推荐算法、排除字符串、混淆范围。 - 根据错误信息给出修复建议。

不能做: - 替你修改商业许可证配置。 - 提供加密/解密算法实现细节。 - 替代内部安全审计流程。

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)来源有三种:

  1. Gradle 插件自动提取(默认) 执行 ./gradlew bceProtect --no-daemon 后,bce_agent.dll 会自动输出到 build/libs/ 目录,与 *-protected.jar 同目录。

  2. Maven 插件 extract-agent goal 在插件配置中加入 <goal>extract-agent</goal>,执行 mvn package 后,bce_agent.dll 会输出到 target/ 目录。

  3. 从插件 jar 中手动解压 如果 CI 环境需要单独获取 agent,可以从已发布的 codeshield-gradle-plugin-1.8.1.jarcodeshield-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)。

  4. 商务交付包 企业客户也可以从塔尔旺科技提供的正式交付包中获取对应平台的 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_KEYBCE_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 动态链接库