- 基于 Jackson 序列化实现数据脱敏
- How to (De)serialize field from object based on annotation using Jackson?
- Jackson 2.0.0 released: going GitHub, handling cyclic graphs, builder style…
你可以通过 MvnRepository 等网站查看 Chaparral 的最新版本,通过 Chaparral - GitHub 访问源代码。
「日志系统的隐私安全」一文中提到过系统对外输出中的敏感数据需要脱敏。基于 HTTP API 通信的 Web 系统可以在序列化 JSON 对象时完成这一操作。Spring Boot 使用 FasterXML/Jackson 实现对象与 JSON 字符串之间的转换,通过继承 StdSerializer
实现自己的序列化方法,并通过 JsonSerialize
注解在相应属性上引用即可简单实现数据脱敏。
class UserAccount {
@JsonSerialize(using = IDCardMaskingDesensitizer.class)
private String idCard;
Chaparral,「欉(cóng,音同丛)」 是对这一思路的扩展。
用户使用 cc.ddrpa.chaparral.annotation.Sensitive
注解指明哪些属性含有敏感数据并说明需要如何处理。Chaparral 的 cc.ddrpa.chaparral.DesensitizeSerializer
通过实现 com.fasterxml.jackson.databind.ser.ContextualSerializer
接口的 createContextual
方法读取所处理字段的上下文,获得注解携带的信息,从而达到调用不同脱敏逻辑的效果。
public class SystemUserVO {
// 应用预设的几种脱敏规则
@Sensitive(strategy = DesensitizeStrategy.BANK_ACCOUNT)
private String bankAccount;
// 可以编写自定义规则
@Sensitive(strategy = DesensitizeStrategy.CUSTOM, using = cc.ddrpa.chaparral.howto.CustomAddressHandler.class)
private Address address;
// 默认使用 nulling out 规则
@Sensitive
private Integer fieldShouldBeNullingOut;
}
典型的输出如下:
{
"realName": "张*三",
"idCard": "3****************3",
"bankAccount": "622307******9940",
"email": "n***y@ddrpa.cc",
"mobile": "188****9941",
"address": {
"province": "浙江省",
"city": "杭州市",
"detail": "西湖区桃源岭*号",
"zipCode": "310001"
},
"fieldShouldBeNullingOut": null
}
自定义脱敏逻辑需要实现 cc.ddrpa.chaparral.desensitizer.IDesensitizer
接口,目前暂不支持脱敏后变为其他结构。
@Sensitive(strategy = CUSTOM, using = CustomIdCardDesensitizer.class)
private String idcard;
Chaparral 目前内置如下几种脱敏规则,用户也可以通过 CUSTOM
扩展其他规则。
脱敏策略 | 应用场景 | 脱敏规则 | 示例 |
---|---|---|---|
BANK_ACCOUNT |
银行卡号 | 保留前 6 后 4,中间用 * 代替,总长 16 |
622307******9940 |
BIRTHDAY |
生日(以及其他日期) | 出生日期脱敏,使用 yyyy-MM-dd Pattern,年份用 **** 代替 |
****-10-01 |
CELL |
手机号码 | 保留前 3 后 4,中间使用 * 代替 |
188****9941 |
EMAIL |
电子邮件地址 | 保留用户名部分的第一个和最后一个字符,以及电子邮箱域名 | n***y@ddrpa.cc |
ID_CARD |
中华人民共和国居民身份证号码 | 保留前 1 后 1,共 18 位,用 * 填充 |
3****************3 |
NAME |
中文姓名 | 无论原长多少,保留第一个字和最后一个字,中间添加一个 * |
张*三 |
这里顺便记录下第一次往 Maven 中央仓库发软件包的经历,顺着 To publish an artifact to Maven Central - JetBrains Space 和 Publishing my artifact - The Central Repository Documentation 基本不会出什么问题。
- 注册 sonatype.org 的 JIRA 账号;
- 由于我还未在 Group ID
cc.ddrpa
下发过包,需要发起一个 Create Repository ticket,同时通过域名解析添加一个指定内容的 TXT Record 证明ddrpa.cc
这个域名归属,这一步只需做一次,之后使用cc.ddrpa.*
作为 Group ID 也是可以的; - 配置好项目的 pom,先通过
-SNAPSHOT
发一个预览版,其他项目这个时候就可以通过添加 snapshot 仓库拉取制品了;
<repositories>
<repository>
<id>snapshots</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
</repositories>
- 配置 GPG 签名工具,把公钥公布出去;
- 万事具备后修改
${project.version}
发布正式版,用 JIRA 账号登录 sonatype 的 nexus,找到Staging Repositories
,close staging 状态; - 等一系列检查完成就可以选择 release,出现问题可以 drop;
- 一般等几分钟就可以通过中央仓库及各镜像库拉取(最久的一次等了六个小时),不过想要在 MvnRepository 和其他地方搜到还要再等等;
以后再发布 Group ID 为 cc.ddrpa
和 cc.ddrpa.*
的软件包,从第 5 步开始即可。