Chaparral:在 JSON 序列化过程中脱敏数据,以及发布软件包到 Maven 中央仓库

2023-01-26, 星期四, 15:04

DevCyber SecurityMAKEJava

你可以通过 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 SpacePublishing my artifact - The Central Repository Documentation 基本不会出什么问题。

  1. 注册 sonatype.org 的 JIRA 账号;
  2. 由于我还未在 Group ID cc.ddrpa 下发过包,需要发起一个 Create Repository ticket,同时通过域名解析添加一个指定内容的 TXT Record 证明 ddrpa.cc 这个域名归属,这一步只需做一次,之后使用 cc.ddrpa.* 作为 Group ID 也是可以的;
  3. 配置好项目的 pom,先通过 -SNAPSHOT 发一个预览版,其他项目这个时候就可以通过添加 snapshot 仓库拉取制品了;
<repositories>
    <repository>
        <id>snapshots</id>
        <url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
    </repository>
</repositories>
  1. 配置 GPG 签名工具,把公钥公布出去;
  2. 万事具备后修改 ${project.version} 发布正式版,用 JIRA 账号登录 sonatype 的 nexus,找到 Staging Repositoriesclose staging 状态;
  3. 等一系列检查完成就可以选择 release,出现问题可以 drop
  4. 一般等几分钟就可以通过中央仓库及各镜像库拉取(最久的一次等了六个小时),不过想要在 MvnRepository 和其他地方搜到还要再等等;

以后再发布 Group ID 为 cc.ddrpacc.ddrpa.* 的软件包,从第 5 步开始即可。