Snowy平台日志脱敏方案:敏感信息保护实践
1. 日志脱敏的重要性与风险场景
在数字化时代,日志作为系统运行状态的重要记录,常常包含用户手机号、邮箱、密码等敏感信息。未经处理的日志可能导致:
- 数据泄露:攻击者通过日志获取用户隐私信息
- 合规风险:违反GDPR、个人信息保护法等法规要求
- 内部威胁:运维人员可直接接触敏感数据
Snowy平台作为国内首个国密前后分离快速开发平台,基于Vue3+AntDesignVue4+Vite5+SpringBoot3技术栈,提供了完善的日志脱敏机制,确保在调试与审计的同时保护用户隐私。
2. Snowy日志脱敏架构设计
2.1 脱敏流程设计
2.2 核心组件分工
| 组件 | 职责 | 技术实现 |
|---|---|---|
| @CommonLog注解 | 标记需要记录日志的方法 | 自定义注解+AOP切面 |
| DevLogAop | 日志采集切面 | AspectJ+Around通知 |
| DevLogUtil | 日志处理工具类 | 线程池异步处理 |
| CommonCryptogramUtil | 日志签名工具 | 国密SM3算法 |
3. 实现方案详解
3.1 注解驱动的日志采集
Snowy采用注解方式标记需要脱敏的接口方法,示例代码如下:
// ClientUserCenterController.java
@ApiOperationSupport(order = 9)
@Operation(summary = "通过手机号找回用户密码")
@CommonLog("通过手机号找回用户密码")
@PostMapping("/client/user/retrievePasswordByPhone")
public CommonResult<String> retrievePasswordByPhone(@RequestBody @Valid ClientUserRetrievePasswordByPhoneParam param) {
clientUserService.retrievePasswordByPhone(param);
return CommonResult.ok();
}
3.2 AOP切面实现日志拦截
DevLogAop类实现日志的统一拦截与处理:
// DevLogAop.java
@Aspect
@Order
@Component
public class DevLogAop {
@Pointcut("@annotation(vip.xiaonuo.common.annotation.CommonLog)")
private void getLogPointCut() {}
@AfterReturning(pointcut = "getLogPointCut()", returning = "result")
public void doAfterReturning(JoinPoint joinPoint, Object result) {
// 获取注解信息
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
CommonLog commonLog = method.getAnnotation(CommonLog.class);
// 异步记录日志
DevLogUtil.executeOperationLog(commonLog, userName, joinPoint, JSONUtil.toJsonStr(result));
}
}
3.3 敏感数据脱敏策略
Snowy平台采用以下脱敏规则(以手机号为例):
/**
* 手机号脱敏处理
* 示例: 13812345678 -> 138****5678
*/
public static String maskPhone(String phone) {
if (StringUtils.isEmpty(phone) || phone.length() != 11) {
return phone;
}
return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
}
支持的脱敏类型包括:
| 数据类型 | 脱敏规则 | 示例 |
|---|---|---|
| 手机号 | 保留前3后4位 | 138****5678 |
| 邮箱 | 保留前2位和域名 | xy****@example.com |
| 身份证号 | 保留前6后4位 | 110101********1234 |
| 银行卡号 | 保留前6后4位 | 622202********1234 |
| 密码 | 完全替换为* | ****** |
4. 实践应用指南
4.1 基础使用步骤
- 添加依赖:确保项目已引入snowy-plugin-dev模块
<dependency>
<groupId>vip.xiaonuo</groupId>
<artifactId>snowy-plugin-dev</artifactId>
<version>${snowy.version}</version>
</dependency>
- 标记日志注解:在需要记录日志的Controller方法上添加@CommonLog
@CommonLog("编辑个人信息")
@PostMapping("/sys/user/editInfo")
public CommonResult<String> editInfo(@RequestBody @Valid SysUserEditInfoParam param) {
sysUserService.editInfo(param);
return CommonResult.ok();
}
- 配置脱敏规则:在application.yml中配置需要脱敏的字段
snowy:
log:
脱敏配置:
- 字段名: phone
类型: 手机号
- 字段名: email
类型: 邮箱
- 字段名: idCard
类型: 身份证
4.2 自定义脱敏实现
对于特殊业务场景,可实现自定义脱敏处理器:
/**
* 自定义地址脱敏处理器
*/
@Component
public class AddressMaskHandler implements MaskHandler {
@Override
public String mask(Object value) {
if (value == null) return null;
String address = value.toString();
// 只保留省份和城市,隐藏详细地址
if (address.length() > 6) {
return address.substring(0, 6) + "****";
}
return address;
}
@Override
public String getType() {
return "address";
}
}
5. 完整性与安全性保障
5.1 日志签名机制
为防止日志被篡改,Snowy对每条日志生成完整性签名:
// DevLogUtil.java
private static void creatLogSignValue(DevLog devLog) {
String logStr = devLog.toString().replaceAll(" +","");
devLog.setSignData(CommonCryptogramUtil.doSignature(logStr));
}
采用国密SM3算法生成签名,确保日志的真实性和完整性。
5.2 异步日志处理
为避免影响主业务流程,日志处理采用异步方式:
// DevLogUtil.java
public static void executeOperationLog(CommonLog commonLog, String userName, JoinPoint joinPoint, String resultJson) {
// 构建日志对象...
ThreadUtil.execute(() -> {
// 日志处理逻辑...
devLogService.save(devLog);
});
}
6. 性能优化建议
- 设置采样率:在高并发接口可设置日志采样率
snowy:
log:
sample-rate: 1.0 # 100%采样,生产环境可设为0.1
- 异步线程池配置:优化日志处理线程池
snowy:
thread-pool:
log:
core-pool-size: 5
max-pool-size: 20
queue-capacity: 1000
- 按级别过滤:非ERROR级别日志可减少字段记录
7. 最佳实践与案例分析
7.1 典型场景配置
用户管理模块脱敏配置:
snowy:
log:
脱敏配置:
- 字段名: phone
类型: 手机号
出现位置: 参数,返回值
- 字段名: email
类型: 邮箱
出现位置: 参数
- 字段名: password
类型: 密码
出现位置: 参数
7.2 案例:用户密码修改接口脱敏
原始日志(脱敏前):
{
"method": "POST",
"path": "/sys/user/resetPassword",
"params": {
"id": "1001",
"oldPassword": "Abc123456",
"newPassword": "Xyz654321"
},
"user": "admin",
"ip": "192.168.1.100"
}
脱敏后日志:
{
"method": "POST",
"path": "/sys/user/resetPassword",
"params": {
"id": "1001",
"oldPassword": "******",
"newPassword": "******"
},
"user": "admin",
"ip": "192.168.1.100",
"signData": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0"
}
8. 总结与未来展望
Snowy平台通过注解驱动、AOP切面、国密算法等技术手段,构建了一套完整的日志脱敏解决方案,实现了:
- 业务代码与日志逻辑解耦
- 敏感数据自动识别与脱敏
- 日志完整性与真实性保障
- 高性能异步处理机制
未来,Snowy将进一步增强:
- 基于AI的敏感数据自动识别
- 动态脱敏规则配置中心
- 脱敏效果实时审计面板
通过这套日志脱敏方案,Snowy平台帮助开发者在满足合规要求的同时,有效保护用户隐私数据,为企业数字化转型提供安全保障。
点赞+收藏+关注,获取更多Snowy平台最佳实践!下期预告:《国密算法在前后端数据传输中的应用》
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



