SpringBoot自定义注解之脱敏注解的示例分析
发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章将为大家详细讲解有关SpringBoot自定义注解之脱敏注解的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。自定义注解之脱敏注解数据脱敏是指对某些敏
千家信息网最后更新 2024年11月22日SpringBoot自定义注解之脱敏注解的示例分析
这篇文章将为大家详细讲解有关SpringBoot自定义注解之脱敏注解的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
自定义注解之脱敏注解
数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。需求是把返回到前端的数据进行脱敏,以免造成隐私信息的泄露。
一、脱敏后的效果
这样显示很不好吧,所有信息都泄露了
这样就很好了吧
二、代码
1.脱敏注解
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)@JacksonAnnotationsInside@JsonSerialize(using = SensitiveSerialize.class)public @interface Sensitive { /** * 脱敏数据类型 */ SensitiveTypeEnum type() default SensitiveTypeEnum.CUSTOMER; /** * 前置不需要打码的长度 */ int prefixNoMaskLen() default 0; /** * 后置不需要打码的长度 */ int suffixNoMaskLen() default 0; /** * 用什么打码 */ String symbol() default "*";}
2.定义脱敏类型
public enum SensitiveTypeEnum { /** * 自定义 */ CUSTOMER, /** * 姓名 */ NAME, /** * 身份证 */ ID_NUM, /** * 手机号码 */ PHONE_NUM}
3.敏感工具类
public class DesensitizedUtils { /** * 对字符串进行脱敏操作 * * @param origin 原始字符串 * @param prefixNoMaskLen 左侧需要保留几位明文字段 * @param suffixNoMaskLen 右侧需要保留几位明文字段 * @param maskStr 用于遮罩的字符串, 如'*' * @return 脱敏后结果 */ public static String desValue(String origin, int prefixNoMaskLen, int suffixNoMaskLen, String maskStr) { if (origin == null) { return null; } StringBuilder sb = new StringBuilder(); for (int i = 0, n = origin.length(); i < n; i++) { if (i < prefixNoMaskLen) { sb.append(origin.charAt(i)); continue; } if (i > (n - suffixNoMaskLen - 1)) { sb.append(origin.charAt(i)); continue; } sb.append(maskStr); } return sb.toString(); } /** * 【中文姓名】只显示最后一个汉字,其他隐藏为星号,比如:**梦 * * @param fullName 姓名 * @return 结果 */ public static String chineseName(String fullName) { if (fullName == null) { return null; } return desValue(fullName, 1, 0, "*"); } /** * 【身份证号】显示前4位, 后2位,其他隐藏。 * * @param id 身份证号码 * @return 结果 */ public static String idCardNum(String id) { return desValue(id, 4, 2, "*"); } /** * 【手机号码】前三位,后四位,其他隐藏。 * * @param num 手机号码 * @return 结果 */ public static String mobilePhone(String num) { return desValue(num, 3, 4, "*"); }}
4.脱敏序列化信息
@NoArgsConstructor@AllArgsConstructorpublic class SensitiveSerialize extends JsonSerializerimplements ContextualSerializer { /** * 脱敏类型 */ private SensitiveTypeEnum sensitiveTypeEnum; /** * 前几位不脱敏 */ private Integer prefixNoMaskLen; /** * 最后几位不脱敏 */ private Integer suffixNoMaskLen; /** * 用什么打码 */ private String symbol; @Override public void serialize(final String origin, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException { switch (sensitiveTypeEnum) { case CUSTOMER: jsonGenerator.writeString(DesensitizedUtils.desValue(origin, prefixNoMaskLen, suffixNoMaskLen, symbol)); break; case NAME: jsonGenerator.writeString(DesensitizedUtils.chineseName(origin)); break; case ID_NUM: jsonGenerator.writeString(DesensitizedUtils.idCardNum(origin)); break; case PHONE_NUM: jsonGenerator.writeString(DesensitizedUtils.mobilePhone(origin)); break; default: throw new IllegalArgumentException("unknown sensitive type enum " + sensitiveTypeEnum); } } @Override public JsonSerializer> createContextual(final SerializerProvider serializerProvider, final BeanProperty beanProperty) throws JsonMappingException { if (beanProperty != null) { if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) { Sensitive sensitive = beanProperty.getAnnotation(Sensitive.class); if (sensitive == null) { sensitive = beanProperty.getContextAnnotation(Sensitive.class); } if (sensitive != null) { return new SensitiveSerialize(sensitive.type(), sensitive.prefixNoMaskLen(), sensitive.suffixNoMaskLen(), sensitive.symbol()); } } return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty); } return serializerProvider.findNullValueSerializer(null); }}
小结一下
该注解用于隐私数据的脱敏,只作用于类的属性上。该注解有四个属性,type表示脱敏数据类型(默认为CUSTOMER自定义,后面三个属性才有效),prefixNoMaskLen表示前置不需要打码的长度(默认为0),suffixNoMaskLen表示后置不需要打码的长度(默认为0),symbol表示用什么打码(默认为*)。
一般用于返回对象给前端对象中包含隐私数据例如身份证、详细地址需要进行脱敏的情况。
示例:
public class UserInfo { @Sensitive(type = SensitiveTypeEnum.NAME) private String name; @Sensitive(type = SensitiveTypeEnum.ID_NUM) private String idNum; @Sensitive(type = SensitiveTypeEnum.PHONE_NUM) private String phone; @Sensitive(type = SensitiveTypeEnum.CUSTOMER, prefixNoMaskLen = 3, suffixNoMaskLen = 2, symbol = "#") private String address; @Sensitive(prefixNoMaskLen = 1, suffixNoMaskLen = 2, symbol = "*") private String password;}
如果还有疑问我写了个demo,可以下载下来运行看看
链接: 脱敏注解demo.
自己手写的一个高效自定义字符串脱敏注解
经理要求写一个自定义脱敏注解,百度查了一堆。都是效率比较低的
自己写了个 仅供参考
/** * description: 数据脱敏 * 1、默认不传部位、不传显示*号数量时字段全部脱敏 * * 原始字符串 adminis 总长度从0计算 总数6 * index=(0,2) size = 1 下标即从0到2以内的字符标注" * ",size=1 则只填充一个* size 不能超过截取字符 * index=(2,3) size =2 下标即从2到3以内的字符标注" * ",size=2 则只填充二个* size 不能超过截取字符 * * date: 2020/3/13 15:56 * * @author oakdog * @version 1.0 */@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@JacksonAnnotationsInside@JsonSerialize(using = Desensitization.ConvertDesensitization.class)public @interface Desensitization { /** * 传入的下标索引 * 规则 第一位起始下标 第二位是结束下标 默认值6位下标 **/ int[] index() default {0,6}; /** * 需要脱敏的字符长度 * 规则 输入 3 :则根据index下标索引对应脱敏3个字符 默认6个长度脱敏 **/ int size() default 6; class ConvertDesensitization extends StdSerializer
关于"SpringBoot自定义注解之脱敏注解的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
脱敏
字符
注解
长度
下标
数据
字符串
原始
信息
号码
类型
结果
身份
隐私
处理
示例
姓名
字段
属性
手机
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库登录报错12514
大学法治展馆软件开发
数据库课程程序设计
上海网络安全培训薪资高就业快
商城网站数据库
东平手机app软件开发定制
盐城思科网络安全工程师
七五网络安全法
阿里巴巴网络安全部门
江苏交学网络技术有限公司招聘
网络技术发展对我们的影响
秦皇岛原装服务器多少钱
问卷调查系统 数据库设计
电脑怎么破解网络安全密钥
想开软件开发公司
安卓安装系统软件开发者模式
利用开源软件开发国产系统
网络安全与会计信息化
在哪个网站学数据库
挤爆服务器的小说
华三服务器hdm管理口密码
创建数据库有哪些软件
关系数据库设计理论主要包括哪些
潍坊翰赢网络技术有限公司
web应用前端机指网站服务器吗
临沂中小学校园网络安全
部落冲突怎么看好友是什么服务器
面试不会数据库怎么办呢
怎么把集合存到数据库
ktv网络技术员是做什么的