首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

金融用户敏感数据如何优雅地实现脱敏?

项目介绍

日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强,编写起来又特别麻烦。

sensitive[1]提供了基于注解的方式,并且内置了常见的脱敏方式,便于开发。

日志脱敏

为了金融交易的安全性,国家强制规定对于以下信息是要日志脱敏的:

1.用户名2.手机号3.邮箱4.银行卡号5.密码6.身份证号

特性

1.基于注解的日志脱敏。2.可以自定义策略实现,策略生效条件。3.内置常见的十几种脱敏内置方案。4.java 深拷贝,且原始对象不用实现任何接口。5.支持用户自定义注解。6.支持基于 FastJSON 直接生成脱敏后的 json

快速开始

环境准备

JDK 7+

Maven 3.x

maven 导入

核心 api 简介

工具类的核心方法列表如下:

定义对象

•UserAnnotationBean.java

通过注解,指定每一个字段的脱敏策略。

•数据准备

构建一个最简单的测试对象:

•测试代码

我们可以直接利用  去打印日志信息,而这个对象对于代码其他流程不影响,我们依然可以使用原来的  对象。

当然,也可以使用  打印日志信息。

@Sensitive 注解

说明

这种注解是为了便于用户使用,本质上等价于 。

注解可以指定对应的脱敏策略。

内置注解与映射

@Sensitive 定义

与 @Sensitive 混合使用

如果你将新增的注解  与  同时在一个字段上使用。

为了简化逻辑,优先选择执行 ,如果  执行脱敏, 那么  将不会生效。

如:

更多特性

自定义脱敏策略生效的场景

默认情况下,我们指定的场景都是生效的。

但是你可能需要有些情况下不进行脱敏,比如有些用户密码为 123456,你觉得这种用户不脱敏也罢。

•UserPasswordCondition.java

其他保持不变,我们指定了一个 condition,实现如下:

•ConditionFooPassword.java

也就是只有当密码不是 123456 时密码脱敏策略才会生效。

属性为集合或者对象

如果某个属性是单个集合或者对象,则需要使用注解 。

•放在集合属性上,且属性为普通对象

会遍历每一个属性,执行上面的脱敏策略。

•放在对象属性上

会处理对象中各个字段上的脱敏注解信息。

•放在集合属性上,且属性为对象

遍历每一个对象,处理对象中各个字段上的脱敏注解信息。

放在集合属性上,且属性为普通对象

•UserEntryBaseType.java

作为演示,集合中为普通的字符串。

放在对象属性上

例子如下:

自定义注解

•v0.0.4 新增功能。允许功能自定义条件注解和策略注解。•v0.0.11 新增功能。允许功能自定义级联脱敏注解。

案例1

自定义密码脱敏策略&自定义密码脱敏策略生效条件

•策略脱敏

•脱敏生效条件

•TIPS

策略单独使用的时候,默认是生效的。

如果有  注解,则只有当条件满足时,才会执行脱敏策略。

只会对系统内置注解和自定义注解生效,因为  有属于自己的策略生效条件。

•策略优先级

优先生效,然后是系统内置注解,最后是用户自定义注解。

对应的实现

两个元注解 、 分别指定了对应的实现。

•CustomPasswordStrategy.java

•ConditionFooPassword.java

定义测试对象

定义一个使用自定义注解的对象。

测试

构建对象的方法如下:

案例2

•v0.0.11 新增功能。允许功能自定义级联脱敏注解。

自定义级联脱敏注解

•自定义级联脱敏注解

可以根据自己的业务需要,在自定义的注解上使用 。

使用方式保持和  一样即可。

定义测试对象

定义一个使用自定义注解的对象。

生成脱敏后的 JSON

说明

为了避免生成中间脱敏对象,v0.0.6 之后直接支持生成脱敏后的 JSON。

使用方法

新增工具类方法,可以直接返回脱敏后的 JSON。

生成的 JSON 是脱敏的,原对象属性值不受影响。

注解的使用方式

和  完全一致。

使用示例代码

所有的测试案例中,都添加了对应的  测试代码,可以参考。

此处只展示最基本的使用。

注意

本次 JSON 脱敏基于 FastJSON[2]。

FastJSON 在序列化本身存在一定限制。当对象中有集合,集合中还是对象时,结果不尽如人意。

示例代码

本测试案例可见测试代码。

解决方案

如果有这种需求,建议使用原来的 。

脱敏引导类

为了配置的灵活性,引入了引导类。

核心 api 简介

引导类的核心方法列表如下:

使用示例

使用方式和工具类一致,示意如下:

配置深度拷贝实现

默认的使用 FastJson 进行对象的深度拷贝,等价于:

参见 SensitiveBsTest.java[3]

deepCopy 用于指定深度复制的具体实现,支持用户自定义。

深度复制(DeepCopy)

说明

深度复制可以保证我们日志输出对象脱敏,同时不影响正常业务代码的使用。

可以实现深度复制的方式有很多种,默认基于 fastjson[4]实现的。

为保证后续良性发展,v0.0.13 版本之后将深度复制接口抽离为单独的项目:

deep-copy[5]

内置策略

目前支持 6 种基于序列化实现的深度复制,便于用户替换使用。

每一种都可以单独使用,保证依赖更加轻量。

自定义

为满足不同场景的需求,深度复制策略支持用户自定义。

自定义深度复制[6]

开源地址

https://github.com/houbb/sensitive[7]

References

sensitive:https://github.com/houbb/sensitive

FastJSON:https://github.com/alibaba/fastjson

SensitiveBsTest.java:https://github.com/houbb/sensitive/blob/master/sensitive-test/src/test/java/com/github/houbb/sensitive/test/bs/SensitiveBsTest.java

fastjson:https://github.com/alibaba/fastjson

deep-copy:https://github.com/houbb/deep-copy

自定义深度复制:https://github.com/houbb/deep-copy#%E8%87%AA%E5%AE%9A%E4%B9%89

https://github.com/houbb/sensitive :https://github.com/houbb/sensitive

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230531A09R4Z00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券