SpringBoot自定义注解之脱敏注解的示例分析
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章将为大家详细讲解有关SpringBoot自定义注解之脱敏注解的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。自定义注解之脱敏注解数据脱敏是指对某些敏
千家信息网最后更新 2025年01月18日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安全错误
数据库的锁怎样保障安全
二类网络安全法
怎么看服务器日志
阿里云数据库备份.tar
真实有效的语音聊天软件开发
网络技术运用会考Excel
宁夏吴忠软件开发公司案例
万方数据库中心
kis 网络加密服务器
服务器团团
奇点服务器
软件开发内容简介模板
创建数据库ssgl
海南服务器机柜工厂
定时任务实现每分钟查询数据库
软件开发费的会计科目
5g网络安全管理指南
魔兽世界好的服务器
协和医院采购网络安全运维
游族网络技术走势分析
如何对待网络安全论文
宿迁购买网络技术大概费用
软件开发的发展前景好
为什么总账号总是弹出不了服务器
网络安全源头的意识
服务器暂时出现了问题
本届互联网大会上的黑科技
pipeline远程连接服务器
uplay服务器维护
服务器能长时间运行原因
网络安全家庭教育读后感