# SecureLog
**Repository Path**: geekfrog/securelog
## Basic Information
- **Project Name**: SecureLog
- **Description**: SecureLog ECC 是基于国密算法的日志安全组件,能够在保持原有日志输出链路不变的前提下,对日志中的敏感信息进行"结构化优先脱敏",并将原始敏感值加密为 SECURE_DATA 随日志一起落盘,便于后续审计回溯与离线解密。
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: https://gitee.com/geekfrog/securelog
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-01-29
- **Last Updated**: 2026-01-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SecureLog ECC
SecureLog ECC 是基于国密算法的日志安全组件,能够在保持原有日志输出链路不变的前提下,对日志中的敏感信息进行"结构化优先脱敏",并将原始敏感值加密为 `SECURE_DATA` 随日志一起落盘,便于后续审计回溯与离线解密。
本仓库包含组件本体(`SecureLog-ECC`)以及 Logback、Log4j2、Log4j1 bridge 的示例工程。
> 💡 **AI 辅助开发说明**:本项目在开发过程中使用了 AI 辅助工具进行代码生成和优化,但所有核心算法和架构设计均由人工审核和验证确保正确性。
## 核心能力
- **结构化优先脱敏**:支持 JSON、SQL 参数、URL query、querystring、key/value 等多种格式,纯文本作为兜底方案
- **国密算法支持**:采用 SM2(加密 SM4 密钥)+ SM4(加密敏感数据)组合,JCE Provider 可通过配置加载(默认使用 BouncyCastle)
- **双轨密钥管理**:基于 `trace_id` 的会话密钥 + 系统级滚动密钥(按时间间隔自动更新)
- **事件上下文记录**:
- `SECURE_DATA`:原始敏感值的加密载荷(Base64 格式)
- `PUB_KEY_FINGERPRINT`:当前加密所用公钥的摘要(Base64 格式),用于快速定位对应的私钥
## 脱敏范围(默认配置)
- 强敏感 key:password、pwd、pass、token、access_token、clientSecret、secret、apiKey、idcard、cardNumber、jbrCardNumber、mobile、phone、tel、email、address(大小写不敏感)
- 值形态识别:手机号、身份证、邮箱、严格地址、高熵 token
- 结构化优先顺序:JSON → SQL Parameters → URL query → querystring → key/value → 纯文本兜底
- 兜底扫描范围:身份证、手机号、邮箱、严格地址(不做高熵 token 裸扫)
## 脱敏示例
```text
JSON
输入:{"password":"123456","mobile":"13800138000","token":"AbCdef1234567890XyZ"}
输出:{"password":"******","mobile":"138****8000","token":"AbCd****90XyZ"}
SQL Parameters
输入:Parameters: 13800138000(String), 2024-01-01(Date)
输出:Parameters: 138****8000(String), 2024-01-01(Date)
URL query
输入:/api/login?token=AbCdef1234567890XyZ&mobile=13800138000
输出:/api/login?token=AbCd****90XyZ&mobile=138****8000
querystring
输入:token=AbCdef1234567890XyZ&email=test@example.com
输出:token=AbCd****90XyZ&email=te***@example.com
key/value
输入:password=123456 token: AbCdef1234567890XyZ
输出:password=****** token: AbCd****90XyZ
纯文本
输入:用户手机号13800138000,身份证11010519491231002X
输出:用户手机号138****8000,身份证110105********002X
```
## 目录结构
- `SecureLog-ECC/`:组件本体(打包产物 `team.frog:securelog-ecc`)
- `logback-only-project/`:Logback 示例工程(含 CLI 入口)
- `log4j2-only-project/`:Log4j2 示例工程
- `log4j1-bridge-project/`:Log4j1 → Log4j2 bridge 示例工程
- `项目技术文档.md`:更完整的设计与实现说明
## 快速开始
### 1. 引入依赖(Maven)
接入工程需要自行提供日志框架与密码学 Provider 依赖(本组件在 `SecureLog-ECC/pom.xml` 中将 `slf4j/jackson/logback/log4j2` 设为 `provided`)。
```xml
team.frog
securelog-ecc
${securelog-ecc.version}
org.bouncycastle
bcprov-jdk15on
1.70
com.fasterxml.jackson.core
jackson-databind
2.15.4
```
根据你的工程选型,选择引入以下日志框架依赖之一:
- **Logback**:`ch.qos.logback:logback-classic`
- **Log4j2**:`org.apache.logging.log4j:log4j-api`、`org.apache.logging.log4j:log4j-core`(如需通过 SLF4J 使用:`org.apache.logging.log4j:log4j-slf4j-impl`)
### 2. 配置 `securelog-ecc.properties`
在接入工程的 classpath(例如 `src/main/resources` 目录)下创建 `securelog-ecc.properties` 文件,最少需要配置以下内容:
```properties
ecc.public.key=
ecc.crypto.provider=org.bouncycastle.jce.provider.BouncyCastleProvider
```
常用可选配置项(均有默认值):
```properties
# MDC 键名
mdc.secure.data.key=SECURE_DATA
mdc.pub.key.fingerprint.key=PUB_KEY_FINGERPRINT
mdc.trace.id.keys=trace_id,traceId,requestId,correlationId,X-Trace-Code,X-Trace-Id
# 密钥缓存(双轨)
ecc.session.key.cache.size=30000
ecc.session.key.cache.buffer.percentage=0.05
ecc.system.key.cache.size=1000
ecc.system.key.cache.buffer.percentage=0.1
ecc.system.id.change.interval.minutes=15
```
完整配置说明请参考:[securelog-ecc.properties](SecureLog-ECC/src/main/resources/securelog-ecc.properties) 和 [项目技术文档.md](项目技术文档.md)。
### 3. 配置日志框架接入
#### 3.1 Logback(`logback.xml`)
使用 [SecureMaskingAppender](SecureLog-ECC/src/main/java/team/frog/securelogecc/logback/SecureMaskingAppender.java) 包装目标 Appender:
```xml
out/app.log
true
%msg%n SECURE_DATA=%X{SECURE_DATA} PUB_KEY_FINGERPRINT=%X{PUB_KEY_FINGERPRINT}%n
```
#### 3.2 Log4j2(`log4j2.xml`)
通过 [SecureMaskingPolicy](SecureLog-ECC/src/main/java/team/frog/securelogecc/log4j2/SecureMaskingPolicy.java) 注入脱敏与上下文字段,并配置 `packages` 属性以加载插件:
```xml
```
### 4. 验证配置生效
打印一条包含敏感字段的日志,例如:
`password=123456&token=abc123`
期望的输出结果:
- 日志正文中的敏感值已被脱敏处理
- 同一条日志的上下文字段中会出现 `SECURE_DATA`(Base64 格式)和 `PUB_KEY_FINGERPRINT`(Base64 格式)
## 解密 `SECURE_DATA`
使用 [SecureDataDecrypter](SecureLog-ECC/src/main/java/team/frog/securelogecc/SecureDataDecrypter.java):
```java
String plaintextJson =
team.frog.securelogecc.SecureDataDecrypter.decryptSecureData(secureDataBase64, base64Pkcs8PrivateKey);
```
如果你需要按 `PUB_KEY_FINGERPRINT` 快速定位私钥,可使用:
- [EccCore.publicKeyFingerprint](SecureLog-ECC/src/main/java/team/frog/securelogecc/core/EccCore.java#L113-L126) 计算公钥摘要(Base64 公钥 → Base64 解码 → SHA-256 → 前 20 字节 → Base64)
组件侧会在加载公钥配置时缓存摘要(避免重复计算),见:
- [ConfigManager.getPublicKeyFingerprint](SecureLog-ECC/src/main/java/team/frog/securelogecc/manager/ConfigManager.java#L130-L143)
## CLI(生成密钥对 / 解密)
组件提供交互式 CLI:[Sm2CliApp](SecureLog-ECC/src/main/java/team/frog/securelogecc/cli/Sm2CliApp.java)。
示例工程中已提供可直接运行的入口:
- [SecureLogCli](logback-only-project/src/main/java/team/frog/securelogecc/sample/logback/SecureLogCli.java)
CLI 在输出公钥 Base64 后,会额外输出 `公钥摘要`(用于密钥识别与检索)。
## 版本历史
### 近期变更(未发布)
- 配置加载优先从文件系统,增加脱敏处理器成功创建提示
### v1.0.2(当前版本)
- 配置错误时增加错误日志提醒与输出
- 生成密钥对时公钥、私钥、公钥摘要合并保存
- 公钥摘要输出与指纹计算复用,并贯通 Logback/Log4j2 的 MDC 写入
### v1.0.1
- 新增控制台工具:生成公私钥与 SECURE_DATA 解密
- 配置加载优先从文件系统,创建脱敏处理器成功提示
### v1.0.0
- 初始版本发布
- 支持双轨密钥管理
- 基于ConcurrentHashMap + ConcurrentLinkedQueue的缓存优化
- 完整的配置管理系统
## 本仓库构建与运行
### 构建组件本体
```bash
mvn -f SecureLog-ECC/pom.xml test
```
如果需要让示例工程引用本地构建的组件版本:
```bash
mvn -f SecureLog-ECC/pom.xml install
```
### 运行示例
- Logback benchmark:见 [LogbackFileBenchmark](logback-only-project/src/main/java/team/frog/securelogecc/sample/logback/LogbackFileBenchmark.java)
- Log4j2 benchmark:见 [Log4j2FileBenchmark](log4j2-only-project/src/main/java/team/frog/securelogecc/sample/log4j2/Log4j2FileBenchmark.java)