关系经济人类预测化学自然
投稿投诉
自然科学
知识物理
化学生物
地理解释
预测理解
本质社会
人类现象
行为研究
经济政治
心理结构
关系指导
人文遗产

仅需一个注解,实现SpringBoot项目中的隐私数据脱敏!

4月28日 霸鲸观投稿
  这两天在整改等保测出的问题,里面有一个用户信息泄露的风险项(就是后台系统里用户的一些隐私数据直接明文显示了),其实指的就是要做数据脱敏。
  数据脱敏:把系统里的一些敏感数据进行加密处理后再返回,达到保护隐私作用,实现效果图如下:
  其实要实现上面的效果,可能最先想到的方法是直接改每个controller接口,在返回数据前做一次加密处理,当然这个方法肯定是非常捞的。这里推荐用注解来实现,即高效又优雅,省时省力,支持扩展。
  其实解决方案大体上分两种:在拿到数据时就已经脱敏了(如在mysql查询时用insert函数进行隐藏)拿到数据后在序列化的时候再进行脱敏(如用fastjson、jackson)
  这里我所选用的方案是第二种,即在接口返回数据前,在序列化的时候对敏感字段值进行处理,并且选用jackson的序列化来实现(推荐)1。创建隐私数据类型枚举:PrivacyTypeEnumimportlombok。G隐私数据类型枚举GetterpublicenumPrivacyTypeEnum{自定义(此项需设置脱敏的范围)CUSTOMER,姓名NAME,身份证号IDCARD,手机号PHONE,邮箱EMAIL,}2。创建自定义隐私注解:PrivacyEncryptimportcom。fasterxml。jackson。annotation。JacksonAnnotationsIimportcom。fasterxml。jackson。databind。annotation。JsonSimportjava。lang。annotation。ElementTimportjava。lang。annotation。Rimportjava。lang。annotation。RetentionPimportjava。lang。annotation。T自定义数据脱敏注解Target(ElementType。FIELD)作用在字段上Retention(RetentionPolicy。RUNTIME)class文件中保留,运行时也保留,能通过反射读取到JacksonAnnotationsInside表示自定义自己的注解PrivacyEncryptJsonSerialize(usingPrivacySerializer。class)该注解使用序列化的方式publicinterfacePrivacyEncrypt{脱敏数据类型(没给默认值,所以使用时必须指定type)PrivacyTypeEnumtype();前置不需要打码的长度intprefixNoMaskLen()default1;后置不需要打码的长度intsuffixNoMaskLen()default1;用什么打码Stringsymbol()}3。创建自定义序列化器:PrivacySerializerimportcom。fasterxml。jackson。core。JsonGimportcom。fasterxml。jackson。databind。BeanPimportcom。fasterxml。jackson。databind。JsonMappingEimportcom。fasterxml。jackson。databind。JsonSimportcom。fasterxml。jackson。databind。SerializerPimportcom。fasterxml。jackson。databind。ser。ContextualSimportcom。zk。common。core。domain。enumerate。PrivacyTypeEimportcom。zk。common。core。utils。PrivacyUimportjava。io。IOEimportjava。util。Oimportlombok。AllArgsCimportlombok。NoArgsCimportorg。apache。commons。lang3。StringUNoArgsConstructorAllArgsConstructorpublicclassPrivacySerializerextendsJsonSerializerStringimplementsContextualSerializer{脱敏类型privatePrivacyTypeEnumprivacyTypeE前几位不脱敏privateIntegerprefixNoMaskL最后几位不脱敏privateIntegersuffixNoMaskL用什么打码privateSOverridepublicvoidserialize(finalStringorigin,finalJsonGeneratorjsonGenerator,finalSerializerProviderserializerProvider)throwsIOException{if(StringUtils。isNotBlank(origin)null!privacyTypeEnum){switch(privacyTypeEnum){caseCUSTOMER:jsonGenerator。writeString(PrivacyUtil。desValue(origin,prefixNoMaskLen,suffixNoMaskLen,symbol));caseNAME:jsonGenerator。writeString(PrivacyUtil。hideChineseName(origin));caseIDCARD:jsonGenerator。writeString(PrivacyUtil。hideIDCard(origin));casePHONE:jsonGenerator。writeString(PrivacyUtil。hidePhone(origin));caseEMAIL:jsonGenerator。writeString(PrivacyUtil。hideEmail(origin));default:thrownewIllegalArgumentException(unknownprivacytypeenumprivacyTypeEnum);}}}OverridepublicJsonS?createContextual(finalSerializerProviderserializerProvider,finalBeanPropertybeanProperty)throwsJsonMappingException{if(beanProperty!null){if(Objects。equals(beanProperty。getType()。getRawClass(),String。class)){PrivacyEncryptprivacyEncryptbeanProperty。getAnnotation(PrivacyEncrypt。class);if(privacyEncryptnull){privacyEncryptbeanProperty。getContextAnnotation(PrivacyEncrypt。class);}if(privacyEncrypt!null){returnnewPrivacySerializer(privacyEncrypt。type(),privacyEncrypt。prefixNoMaskLen(),privacyEncrypt。suffixNoMaskLen(),privacyEncrypt。symbol());}}returnserializerProvider。findValueSerializer(beanProperty。getType(),beanProperty);}returnserializerProvider。findNullValueSerializer(null);}}
  这里是具体的实现过程,因为要脱敏的数据都是String类型的,所以继承JsonSerializer时的类型填String
  重写的serialize方法是实现脱敏的核心,根据类型type的不同去设置序列化后的值
  重写的createContextual方法就是去读取我们自定义的PrivacyEncrypt注解,打造一个上下文的环境。推荐:Java面试题4。隐私数据隐藏工具类:PrivacyUtilpublicclassPrivacyUtil{隐藏手机号中间四位publicstaticStringhidePhone(Stringphone){returnphone。replaceAll((d{3})d{4}(d{4}),12);}隐藏邮箱publicstaticStringhideEmail(Stringemail){returnemail。replaceAll((w?)(w)(w)(w。〔az〕(。〔az〕)?),134);}隐藏身份证publicstaticStringhideIDCard(StringidCard){returnidCard。replaceAll((d{4})d{10}(w{4}),12);}【中文姓名】只显示第一个汉字,其他隐藏为星号,比如:任publicstaticStringhideChineseName(StringchineseName){if(chineseNamenull){}returndesValue(chineseName,1,0,);}【身份证号】显示前4位,后2位publicstaticStringhideIdCard(StringidCard){returndesValue(idCard,4,2,);}【手机号码】前三位,后四位,其他隐藏。publicstaticStringhidePhone(Stringphone){returndesValue(phone,3,4,);}对字符串进行脱敏操作paramorigin原始字符串paramprefixNoMaskLen左侧需要保留几位明文字段paramsuffixNoMaskLen右侧需要保留几位明文字段parammaskStr用于遮罩的字符串,如return脱敏后结果publicstaticStringdesValue(Stringorigin,intprefixNoMaskLen,intsuffixNoMaskLen,StringmaskStr){if(originnull){}StringBuildersbnewStringBuilder();for(inti0,norigin。length();i){if(iprefixNoMaskLen){sb。append(origin。charAt(i));}if(i(nsuffixNoMaskLen1)){sb。append(origin。charAt(i));}sb。append(maskStr);}returnsb。toString();}publicstaticvoidmain(String〔〕args){System。out。println(hideChineseName(张三三));}}
  这个工具类其实可以自己定,根据自己的业务去扩展,提一点:
  在自定义注解PrivacyEncrypt里,只有type的值为PrivacyTypeEnum。CUSTOMER(自定义)时,才需要指定脱敏范围,即prefixNoMaskLen和suffixNoMaskLen的值,像邮箱、手机号这种隐藏格式都采用固定的5。注解使用
  直接在需要脱敏的字段上加上注解,指定type值即可,如下:DatapublicclassPeople{privateIprivateSprivateIprivateIPrivacyEncrypt(typePrivacyTypeEnum。PHONE)隐藏手机号privateSPrivacyEncrypt(typePrivacyTypeEnum。EMAIL)隐藏邮箱privateSprivateS}
  到这里,脱敏工作就已经结束了,全局使用这一个注解即可,一劳永逸,测试效果图如下:
  以上代码已经过测试,并已实际使用,所以可放心使用
  来源:blog。csdn。netqq36737803articledetails122366043
投诉 评论 转载

苏联瓦西里扎耶采夫苏联第一王牌狙击手击毙四百德军在世界排名前十的狙击手中有不少都是来自前苏联军队,其中最优秀的狙击手就是瓦西里扎耶采夫,据说他曾经在卫国战争中做出了非常重大的贡献,不仅在二战期间击毙了四百多名德军,而且他还组……在挪威过了20多次的圣诞节,现在的我眼里的圣诞节是什么样的呢时光如白驹过隙,因为先生是挪威人我已在挪威定居生活了24年,也已过了24个圣诞节。有时我会想,在现在的我的眼里,圣诞节是什么样的呢?是围着圣诞树唱挪威圣诞歌;是孩子们的爸……天府可乐被野性消费,又一个国产汽水要崛起?中新网1月7日电(中新财经记者谢艺观)若论起近日最火的饮料品牌,或非天府可乐莫属。先是天府可乐宣布破产等话题登上微博热搜,后被证实为乌龙,董事长还亲自出场辟谣。作为老牌国……寻常的日子也飘香谁知一转眼,时光飞逝如电,过不去的岁月,抹不去的从前。那从前的岁月让我在闲暇之时,总喜欢漫步在记忆的河边,任微风轻抚,吹开了记忆河边的花朵,嗅一嗅那沁人的芳香馨香……刘恒的母亲是谁为什么说她是汉朝最幸运的女人汉文帝刘恒,历史上著名的文景之治的开创者,他在历史上的名声一直都是很好的,毕竟能够使当时的汉朝逐步发展起来,最终成就了汉武帝的霸业,必然也是一个励精图治的好皇帝。而汉文帝的母亲……留洋归来彻底废了?郭田雨三失良机30分钟又被换下下赛季会更尴足协杯14决赛,拥有莫伊塞斯、孙准浩以及绝大部分主力球员的山东泰山,面对全华班且均为替补阵容的武汉三镇,应对非常艰难,开场仅4分钟先失一球。随后,山东泰山发动反扑,小将郭田雨获……墙面颜色太深能刷第三遍吗墙面颜色太深的话,是不能再重新刷乳胶漆或者白色乳胶漆的,颜色深了是盖不住的,如果不喜欢这个色了,想改成白色需要重新打磨墙面,也可以选择墙布遮盖,具体可以看看本站提供的介绍。……快递查询软件,自动识别快递公司,批量查询在途信息关于查询快递物流的方法,其实市面上现在不计其数,主要是好不好用的问题。今天小编给大家分享一款查询技巧,下面就一起来试试。需要哪些工具?下载一个快递批量查询高手……从完璧归赵到渑池会盟为何说秦赵两国之导读完璧归赵的故事想必大家早就耳熟能详了,这件事的起因是,赵国得到楚国宝玉和氏璧,秦昭襄王得知此消息后修书于赵惠文王,愿以十五座城池换取和氏璧,于是赵王便派蔺相如持玉赴秦……明白造句用明白造句大全61、清华大学的学风是“行胜于言”,它是我的座右铭,我也希望能和中学生朋友共勉。同时我也希望你们能够明白:一个真正的马拉松运动员决不会空等奥林匹克金牌从天上掉下来,现在就行动起……失而复得库里找回1718赛季罚球冠军奖杯北京时间12月31日,据NBC体育报道,斯蒂芬库里在社交媒体上感谢球迷帮助自己寻回201718赛季最高罚球命中率奖杯。感谢帮助我将奖杯找回来,库里转发了该球迷的推文并写道……仅需一个注解,实现SpringBoot项目中的隐私数据脱敏!这两天在整改等保测出的问题,里面有一个用户信息泄露的风险项(就是后台系统里用户的一些隐私数据直接明文显示了),其实指的就是要做数据脱敏。数据脱敏:把系统里的一些敏感数据进……
内燃机VS电机一个热效率40,一个电机效率90给你们看看我的牌面,骨伽双刃装机分享冬至将至,无论多忙,别忘吃4物,顺应时节,浑身温暖又一采耳店被关停?披着养生外衣打擦边,实则别有洞天?显示器产品全球热点市场准入(下)今天输给快船之后九连败,比尔受伤之后奇才队就没有胜利过杜星霖张纪中被偶遇,未开美颜均显苍老,寒风中为事业打拼不容易全新的个人养老金理财新在哪?惠州公积金新规I类人才夫妻最高可申请公积金贷款150万为何你戴帽子既显脸大又难看?跟着潮人这样戴,洋气又显脸小郎平国外生活养得好!61岁素颜染黄发神清气爽,穿一身黑也不显早安问候语问候,让我们没有距离真诚,让我们彼此珍惜
海底两万里练习题(练习题精选及答案!)贵阳哪里风景比较好,适合旅游?《姜子牙》的三个彩蛋是什么意思?官宣了三个新人物我国已有养老服务机构和设施近22万个初三学生寒假学习计划指导曹雪芹把自己的生活体验融入了《红楼梦》?越吻越想要的接吻招式厌学孩子怎么心理疏导小孩厌学心理怎么疏导老年人吸氧机吸氧度数多少合适西游记读书笔记300字(通用18篇)物质奖励交换学习成绩能行吗?后果严重,家长应该知道的真相雪掩不住浓浓相思意散文欣赏

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找菏泽德阳山西湖州宝鸡上海茂名内江三亚信阳长春北海西安安徽黄石烟台沧州湛江肇庆鹤壁六安韶关成都钦州