最新要闻
- 特斯拉Model 3起火殃及宝马新车 车主索赔法院如此判决
- 新疆阿瓦提长绒棉:清爽透气纯棉背心9.9元/件狂促
- 小伙戒指卡手遇130名消防员演训:正好现场教学 科普一定不能硬拽
- 每日热门:城会玩!印度法官无法判决向ChatGPT求助 专家称或成全球法院系统标配
- 专为小姐姐打造!雅迪冠能Q9发布:超级续航+超级好看
- 环球讯息:清明将至,我省各地倡导文明祭祀育新风—— 追思亲人,如何更好“重情”
- 世界速看:社保基金2022年四季度新进30股 增持64股
- 天天快看点丨法拉第未来发布会只展示了个车架 贾跃亭还有这些问题需要回答
- 女子带孩子吃饭故意往菜里扔头发 店家看监控发现:网友吐槽教坏孩子
- 号称德国500年纯酿造法!特斯拉推出啤酒GigaBier:3瓶卖667元
- 全球通讯!微软、索尼等巨头纷纷退出:全球最大游戏展E3宣布取消
- 当前速看:15.86万元起 新款大众途岳上市:换1.5T发动机、能喝92号油
- 让退化的森林再获新生
- 天天滚动:比亚迪不去美国 照样做大哥
- 世界观速讯丨海底捞2022年营收347亿!“最牛打工妹”杨利娟接任后扭亏为盈赚了13亿
- 天天热资讯!4G比5G更成熟 越来越多用户认可?三大运营商猛推5G 2025年将连接超10亿
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
全球观察:利用Jackson序列化实现数据脱敏
作者:京东物流 张晓旭
1.背景
在项目中有些敏感信息不能直接展示,比如客户手机号、身份证、车牌号等信息,展示时均需要进行数据脱敏,防止泄露客户隐私。脱敏即是对数据的部分信息用脱敏符号(*)处理。
2.目标
- 在服务端返回数据时,利用Jackson序列化完成数据脱敏,达到对敏感信息脱敏展示。
- 降低重复开发量,提升开发效率
- 形成统一有效的脱敏规则
- 可基于重写默认脱敏实现的desensitize方法,实现可扩展、可自定义的个性化业务场景的脱敏需求
3.主要实现
3.1基于Jackson的自定义脱敏序列化实现
StdSerializer:所有标准序列化程序所使用的基类,这个是编写自定义序列化程序所推荐使用的基类。ContextualSerializer:是Jackson 提供的另一个序列化相关的接口,它的作用是通过字段已知的上下文信息定制JsonSerializer。
package com.jd.ccmp.ctm.constraints.serializer;import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.BeanProperty;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.SerializerProvider;import com.fasterxml.jackson.databind.ser.ContextualSerializer;import com.fasterxml.jackson.databind.ser.std.StdSerializer;import com.jd.ccmp.ctm.constraints.Symbol;import com.jd.ccmp.ctm.constraints.annotation.Desensitize;import com.jd.ccmp.ctm.constraints.desensitization.Desensitization;import com.jd.ccmp.ctm.constraints.desensitization.DesensitizationFactory;import com.jd.ccmp.ctm.constraints.desensitization.DefaultDesensitization;import java.io.IOException;/** * 脱敏序列化器 * * @author zhangxiaoxu15 * @date 2022/2/8 11:10 */public class ObjectDesensitizeSerializer extends StdSerializer
注:createContextual可以获得字段的类型以及注解。当字段拥有自定义注解时,取出注解中的值创建定制的序列化方式,这样在serialize方法中便可以得到这个值了。createContextual方法只会在第一次序列化字段时调用(因为字段的上下文信息在运行期不会改变),所以无需关心性能问题。
(相关资料图)
3.2定义脱敏接口、以及工厂实现
3.2.1脱敏器接口定义
package com.jd.ccmp.ctm.constraints.desensitization;/** * 脱敏器 * * @author zhangxiaoxu15 * @date 2022/2/8 10:56 */public interface Desensitization { /** * 脱敏实现 * * @param target 脱敏对象 * @return 脱敏返回结果 */ T desensitize(T target);}
3.2.2脱敏器工厂实现
package com.jd.ccmp.ctm.constraints.desensitization;import java.util.HashMap;import java.util.Map;/** * 工厂方法 * * @author zhangxiaoxu15 * @date 2022/2/8 10:58 */public class DesensitizationFactory { private DesensitizationFactory() { } private static final Map, Desensitization>> map = new HashMap<>(); @SuppressWarnings("all") public static Desensitization> getDesensitization(Class> clazz) { if (clazz.isInterface()) { throw new UnsupportedOperationException("desensitization is interface, what is expected is an implementation class !"); } return map.computeIfAbsent(clazz, key -> { try { return (Desensitization>) clazz.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new UnsupportedOperationException(e.getMessage(), e); } });
3.3常用的脱敏器实现
3.3.1默认脱敏实现
可基于默认实现,扩展实现个性化场景
package com.jd.ccmp.ctm.constraints.desensitization;/** * 默认脱敏实现 * * @author zhangxiaoxu15 * @date 2022/2/8 11:01 */public interface DefaultDesensitization extends Desensitization {}
3.3.2手机号脱敏器
实现对手机号中间4位号码脱敏
package com.jd.ccmp.ctm.constraints.desensitization;import com.jd.ccmp.ctm.constraints.Symbol;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 手机号脱敏器,保留前3位和后4位 * * @author zhangxiaoxu15 * @date 2022/2/8 11:02 */public class MobileNoDesensitization implements DefaultDesensitization { /** * 手机号正则 */ private static final Pattern DEFAULT_PATTERN = Pattern.compile("(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}"); @Override public String desensitize(String target) { Matcher matcher = DEFAULT_PATTERN.matcher(target); while (matcher.find()) { String group = matcher.group(); target = target.replace(group, group.substring(0, 3) + Symbol.getSymbol(4, Symbol.STAR) + group.substring(7, 11)); } return target;
3.4注解定义
通过@JacksonAnnotationsInside实现自定义注解,提高易用性
package com.jd.ccmp.ctm.constraints.annotation;import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;import com.fasterxml.jackson.databind.annotation.JsonSerialize;import com.jd.ccmp.ctm.constraints.desensitization.Desensitization;import com.jd.ccmp.ctm.constraints.serializer.ObjectDesensitizeSerializer;import java.lang.annotation.*;/** * 脱敏注解 * * @author zhangxiaoxu15 * @date 2022/2/8 11:09 */@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@JacksonAnnotationsInside@JsonSerialize(using = ObjectDesensitizeSerializer.class)@Documentedpublic @interface Desensitize { /** * 对象脱敏器实现 */ @SuppressWarnings("all") Class extends Desensitization>> desensitization();
3.4.1默认脱敏注解
package com.jd.ccmp.ctm.constraints.annotation;import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;import com.jd.ccmp.ctm.constraints.desensitization.DefaultDesensitization;import java.lang.annotation.*;/** * 默认脱敏注解 * * @author zhangxiaoxu15 * @date 2022/2/8 11:14 */@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@JacksonAnnotationsInside@Desensitize(desensitization = DefaultDesensitization.class)@Documentedpublic @interface DefaultDesensitize {
3.4.2手机号脱敏注解
package com.jd.ccmp.ctm.constraints.annotation;import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;import com.jd.ccmp.ctm.constraints.desensitization.MobileNoDesensitization;import java.lang.annotation.*;/** * 手机号脱敏 * * @author zhangxiaoxu15 * @date 2022/2/8 11:18 */@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@JacksonAnnotationsInside@Desensitize(desensitization = MobileNoDesensitization.class)@Documentedpublic @interface MobileNoDesensitize {}
3.5定义脱敏符号
支持指定脱敏符号,例如* 或是 _
package com.jd.ccmp.ctm.constraints;import java.util.stream.Collectors;import java.util.stream.IntStream;/** * 脱敏符号 * * @author zhangxiaoxu15 * @date 2022/2/8 10:53 */public class Symbol { /** * "*"脱敏符 */ public static final String STAR = "*"; private Symbol() {} /** * 获取符号 * * @param number 符号个数 * @param symbol 符号 */ public static String getSymbol(int number, String symbol) { return IntStream.range(0, number).mapToObj(i -> symbol).collect(Collectors.joining()); }
4.使用样例&执行流程剖析
程序类图
**执行流程剖析** 1.调用JsonUtil.toJsonString()开始执行序列化 2.识别属性mobile上的注解@MobileNoDesensitize(上文3.4.2) 3.调用ObjectDesensitizeSerializer#createContextual(上文3.1 & 3.2),返回JsonSerializer 4.调用手机号脱敏实现MobileNoDesensitization#desensitize(上文3.3.2) 5.输出脱敏后的序列化结果,{"mobile":"133****5678"}
不难发现核心执行流程是第3步,但是@MobileNoDesensitize与ObjectDesensitizeSerializer又是如何联系起来的呢?
- 尝试梳理下引用链路:@MobileNoDesensitize -> @Desensitize -> @JsonSerialize -> ObjectDesensitizeSerializer
- 但是,在ObjectDesensitizeSerializer的实现中,我们似乎却没有发现上述链路的直接调用关系
- 这就不得不说下Jackson元注解的概念
**Jackson元注解**1.提到元注解这个词,大家会想到@Target、@Retention、@Documented、@Inherited2.Jackson也以同样的思路设计了@JacksonAnnotationsInside/** * Meta-annotation (annotations used on other annotations) * used for indicating that instead of using target annotation * (annotation annotated with this annotation), * Jackson should use meta-annotations it has. * This can be useful in creating "combo-annotations" by having * a container annotation, which needs to be annotated with this * annotation as well as all annotations it "contains". * * @since 2.0 */@Target({ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@JacksonAnnotationpublic @interface JacksonAnnotationsInside{}
正是通过”combo-annotations”(组合注解、捆绑注解)的机制,实现了指示Jackson应该使用其拥有的元注释,而不是使用目标注释,从而实现了自定义脱敏实现设计目标。
5.总结
以上就是利用Jackson序列化实现数据脱敏的全过程,如有此类需求的同学可以借鉴上面的实现方法。
关键词:
-
全网最详细中英文ChatGPT-GPT-4示例文档-类比语句智能生成从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命
我们在写文章时,为了生动化一些事物,会经常使用类比的方法,将一类事物比喻成其它更加形象的事物,从...
来源: 世界速递!skywalking插件工作原理剖析
全网最详细中英文ChatGPT-GPT-4示例文档-类比语句智能生成从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命
全球观察:利用Jackson序列化实现数据脱敏
特斯拉Model 3起火殃及宝马新车 车主索赔法院如此判决
新疆阿瓦提长绒棉:清爽透气纯棉背心9.9元/件狂促
小伙戒指卡手遇130名消防员演训:正好现场教学 科普一定不能硬拽
每日热门:城会玩!印度法官无法判决向ChatGPT求助 专家称或成全球法院系统标配
专为小姐姐打造!雅迪冠能Q9发布:超级续航+超级好看
环球讯息:清明将至,我省各地倡导文明祭祀育新风—— 追思亲人,如何更好“重情”
当前消息!Microsoft Edge 分屏 推荐
国家统计局:3月份采购经理指数延续扩张走势
世界速看:社保基金2022年四季度新进30股 增持64股
天天快看点丨法拉第未来发布会只展示了个车架 贾跃亭还有这些问题需要回答
女子带孩子吃饭故意往菜里扔头发 店家看监控发现:网友吐槽教坏孩子
号称德国500年纯酿造法!特斯拉推出啤酒GigaBier:3瓶卖667元
全球通讯!微软、索尼等巨头纷纷退出:全球最大游戏展E3宣布取消
当前速看:15.86万元起 新款大众途岳上市:换1.5T发动机、能喝92号油
助力“科技+产业+金融”良性发展 上海首单非公开科创债发行
让退化的森林再获新生
天天滚动:比亚迪不去美国 照样做大哥
世界观速讯丨海底捞2022年营收347亿!“最牛打工妹”杨利娟接任后扭亏为盈赚了13亿
天天热资讯!4G比5G更成熟 越来越多用户认可?三大运营商猛推5G 2025年将连接超10亿
熔断和降级有什么区别?
资讯:国际金融市场早知道:3月31日
全球播报:上证报:美元拐点将至,分析师称人民币资产或有望成为避险资产
当前播报:冯小刚主演 中国版《忠犬八公》今日上映:日本版曾感动无数人
视讯!发布/上市时间来了!NV RTX 4070国行售价大曝光:玩家直呼老黄良心了
读SQL进阶教程笔记03_自连接
pcm音频的录制、播放及转换
全球观点:非洲致命疾病 出现症状24小时内死亡:医生直呼病毒可怕引外界担心
快报:媒体:谁在开发“一键脱衣”App 行为龌龊已触犯法律 应严惩开发者
环球热文:新疆新鑫矿业(03833.HK)2022年度纯利增44.4%至7.45亿元 末期息0.15元
【世界新视野】美国火车又双叒叕脱轨了:装乙醇车厢爆炸起火
SSD还要降价!今年是涨不回来了
全球消息!实测一个月 我发现了家用脱毛仪的真相
全球资讯:FF91量产了 不过市场里已经没了贾老板的位置
全球速递!2022年全球新能源销冠 每天进账11亿!“技术为王”的比亚迪做对了什么?
全球资讯:来月经能吃人参果吗?
“门口五不放,放了家运衰”,5种东西是啥?老祖宗的经验之谈
关注:01、关于满减优惠券可叠加使用场景下的动态规划算法
当前视点!Spring AOP官方文档学习笔记(一)之AOP概述
全球焦点!魅族20系列价格公布:2999元起、无界顶配8499元!
当前头条:Epic要免费送大作《消逝的光芒》增强版了:立省百元!网友:E宝YYDS
香蕉、蜂蜜治疗便秘?又骗我好多年
当前热议!俄妹COS《生化危机1》吉尔 战斗服难掩好身材
今头条!【kafka】-生产环境问题-报错Maximum application poll interval
热议:流畅、稳定全面进化:魅族Flyme 10正式发布
天天资讯:17999元 ROG新款XG Mobile显卡坞上架:175W移动版RTX 4090
天天看点:魅族Flyme Auto车机系统正式发布:交互完全不输华为问界
世界观点:满血标准版48个月不卡!魅族20发布:2999元起
每日观点:3999元起 魅族20 PRO发布:魅族史上最高标准旗舰
环球热资讯!React Router 备忘清单_开发速查表分享
每日观点:希尔排序
环球微动态丨强网杯2022 GameMaster
环球视讯!128只债券推迟或取消发行
全球新资讯:李强会见博鳌亚洲论坛理事会成员
当前焦点!一款在我国卖不好的手机:真实销量把苹果都拉下马了
非洲再现致命性疾病:出现症状24小时内死亡
每日看点!魅族20 INFINITY无界版由京东方供屏:采用四边等窄设计
最新:元气森林官方发车:0糖0脂气泡水+燃茶多口味饮料混合囤货 2.8元/瓶新低
煤油心目中的魅族王者归来 三年回到国内中高端市场TOP5
环球快资讯:游戏行业也衰退?EA拟裁员6%减少办公空间
环球观焦点:张译《他是谁》豆瓣评分两天再降0.2:刑侦局你给我讲爱情?
一箭四星!中国金牌火箭长二丁火箭又一次成功:31年来超高可靠性
环球热讯:距《你的名字》仅一步之遥:新海诚《铃芽之旅》票房破4亿
山东高速股东户数下降2.82%,户均持股74.45万元
用户吐槽下载视频会员到期不能看 客服:需重新开通会员
天天快资讯:官方认证“全国美食地图”来了:快看看你家乡上榜没
【播资讯】业界首创!台铃发布水冷氢能两轮车:备用氢罐随身带 续航无压力
中科院联合研发技术!小米米家全效空气净化器明天开售:首发3699元
环球速递!苹果WWDC大会定档!iOS 17将至 看看你的iPhone还能不能升
【世界新要闻】NEXON新作TPS《幕后高手》开启不限量最终测试
使用pinctrl和gpio子系统开发GPIO驱动正点原子IMX6ULL阿尔法板的LED灯
Topaz Video AI V3.1.10 视频降噪升画质工具 安装教程(windows/macos版)
热讯:DBSAT脚本快速收集方法
实战SQL优化(以MySQL深分页为例)
世界看热讯:如何限制进程内存:cgroup
时讯:每日机构分析:3月30日
世界播报:空调安装莫任性,城管上门解民忧
博主揭秘成都夜市“鬼秤”套路:10家有8家不准!官方已开展调查
每日讯息!车企回应试驾翻车后 新款坦克500正常上市:33.50万起买高安全硬派越野
索尼PS VR2销量滑铁卢:首周仅有不足30万
天天热文:拒绝山寨卡、翻新卡!NVIDIA联合七彩虹等厂商重拳出击
每日聚焦:CloudQuery 社区版重启 | 我们做了哪些准备?
世界播报:GraphPad Prism 9 V9.5.1 破解版安装教程
世界讯息:python中类成员修饰符
因为一篇文章,这国将召见俄大使
全球最新:改革举措加快推出 “首次”“首单”不断涌现——金融部门努力提升金融服务实体经济能力
【时快讯】抖音发布公告:“剧情演绎”类视频需注明 否则最严无限期封禁
全球热点评!怀念原版《RE4》艾什莉 玩家们绘制老鼠艾什莉同人图
世界简讯:单休女生30小时往返1300公里游6景点:第二天还要上班
速讯:上海交大教授李峰:医生没有创造力 非常容易被AI替代
澳大利亚多地暴雨洪灾 泳池频现剧毒漏斗蜘蛛:最快15分钟致死
当前头条:目标规模超30亿,浙江衢州拟设一支产业基金
天天最资讯丨04735-数据库系统原理知识点
【快播报】【验证码逆向专栏】极验三代、四代点选类验证码逆向分析
Linux 服务器大量的 log 日志,如何正确看日志快速定位错误?你必须学会!
天天最资讯丨APS系统设计经验分享(时间推导 - 2023.03)
每日动态!一个诡异的Python小问题
全球球精选!科创板收盘播报:科创50指数涨0.33% 半导体股延续强势表现