java后端数据脱敏看这一篇就够了.

简介: 现在的项目中需要对展示的数据进行脱敏处理,类似的场景很常见,比如说展示的手机号、银行卡、用户姓名等全部用***这类的特殊字符进行代替。

背景说明


   现在的项目中需要对展示的数据进行脱敏处理,类似的场景很常见,比如说展示的手机号、银行卡、用户姓名等全部用***这类的特殊字符进行代替。我们的项目就需要将岗位展示列表中的用户岗位发布姓名全部用星号进行替换.最初的时候是入门级版本,几行代码就可以实现。后期对项目进行优化,考虑到脱敏的场景以及脱敏的形式可能会变化(比如说手机号脱敏要求前面三位后两位之外的进行脱敏,用户姓名要求全部脱敏处理),所以对原有逻辑进行了修改,于是有了进阶版实现方式,优点在于对脱敏业务与序列化处理进行解耦,便于拓展和后期维护,下面就具体说下处理过程,希望对有同样需求的同学有所帮助!


入门级处理


   场景:将岗位查询列表中的用户姓名进行全部脱敏处理,使用三个星号进行代替.直接上代码:

实体类ShopPostInfo:

public class ShopPostInfo implements Serializable {
    private static final long serialVersionUID = -2040496864515327697L;
    // 数据脱敏处理,用户名全部替换为***
   @JsonSerialize(using = DesensitizationSerializer.class)
    private String userName;
// 省略其他信息


自定义脱敏处理器DesensitizationSerializer:

public class DesensitizationSerializer extends JsonSerializer<String>  {
    // 序列化处理
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        // 脱敏成***
        gen.writeString("***");
    }
    }


脱敏后截图:

397132fbf33204875d32719527b68399_6349bee326d54b3b881d207555af3893.png

   可以看到用户的姓名都已经被处理成***了.到这里问题是解决了,但是后期再有其他的脱敏需求怎么办,比如说想对手机号进行脱敏处理,只想对前三位后两位之外的数字进行脱敏处理怎么办?重新定义一个手机号脱敏处理器?那以后需要维护的脱敏类会越来越多,显得会有所冗余,毕竟每种脱敏处理器中仅有脱敏策略不同,是否可以只专注于脱敏策略的实现,对于序列化的实现进行统一处理.基于上面的疑问就有了脱敏处理的进阶版,请往下看!


进阶版处理


自定义脱敏注解

@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = DesensitizationSerializer.class)
public @interface DesensitizationAnnotation {
    Class<? extends DesensitizationStrategy> strategy();
}

自定义脱敏注解序列化处理器


public class DesensitizationSerializer extends JsonSerializer<String> implements ContextualSerializer {
    // 脱敏处理策略
    private DesensitizationStrategy desensitizationStrategy;
    public DesensitizationSerializer() {
    }
    public DesensitizationSerializer(DesensitizationStrategy desensitizationStrategy) {
        this.desensitizationStrategy = desensitizationStrategy;
    }
    // 序列化核心处理
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        int a=0;
        // 脱敏处理公共逻辑
        String desensitizationValue = desensitizationStrategy.desensitizationHandle(value);
        // 序列化处理公共方案
        gen.writeString(desensitizationValue);
    }
    // 设置自定义脱敏策略:desensitizationSerializer
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
        JsonSerializer<?> desensitizationSerializer = null;
        if(null == property) desensitizationSerializer = prov.findNullValueSerializer(property);
        if(!Objects.equals(property.getType().getRawClass(), String.class))
            desensitizationSerializer = prov.findValueSerializer(property.getType(), property);
        if(Objects.equals(property.getType().getRawClass(), String.class)){
            // JsonSerializer设置自定义脱敏策略
            desensitizationSerializer = handleDesensitizationSerializer(desensitizationSerializer, property);
        }
        return desensitizationSerializer;
    }
    // 脱敏设置
    private JsonSerializer<?> handleDesensitizationSerializer(JsonSerializer<?> desensitizationSerializer, BeanProperty beanProperty) {
        // 获取脱敏注解
        DesensitizationAnnotation desensitizationJsonSerializer = beanProperty.getAnnotation(DesensitizationAnnotation.class);
        if (desensitizationJsonSerializer == null) desensitizationJsonSerializer = beanProperty.getContextAnnotation(DesensitizationAnnotation.class);
        // 设置脱敏实例,添加自定义脱敏策略
        if (desensitizationJsonSerializer != null) {
            try {
                desensitizationSerializer = new DesensitizationSerializer(desensitizationJsonSerializer.strategy().newInstance());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return desensitizationSerializer;
    }
}


实体类中添加序列化处理器


public class ShopPostInfo implements Serializable {
    private static final long serialVersionUID = -2040496864515327697L;
    // modify by txm 2022/10/4 数据脱敏处理
    // @JsonSerialize(using = DesensitizationSerializer.class)
    @DesensitizationAnnotation(strategy = FullSensitization.class)
    private String userName;
// 省略其他信息
}


全部脱敏处理策略:

public class FullSensitization implements DesensitizationStrategy{
    // 全脱敏处理
    @Override
    public String desensitizationHandle(String oldValue) {
        return "***";
    }
}


指定格式脱敏策略,这里指定只对用户姓名第一个字以外进行脱敏处理(暂时没想出更合理的脱敏场景,能理解要优化的点就行)

public class PatternDeSensitization implements DesensitizationStrategy{
    // 部分脱敏处理,首个字符处理,其余都脱敏.这里使用的hutool中的strUtil工具类,直接使用string原生的方法也可以.
    @Override
    public String desensitizationHandle(String oldValue) {
        return StrUtil.replace(oldValue,1,oldValue.length(),'*');
    }
}


测试结果:

   全部脱敏实现效果:

397132fbf33204875d32719527b68399_6349bee326d54b3b881d207555af3893.png


   部分脱敏实现效果:

81d6320b8bb98dff49ceb1a43b8a67c7_d280a42de2c344c3b3b1cf07c9cdfaf6.png

   以上是关于数据脱敏的实现方式,其中根据业务需求做了一下结构优化,如果有相同的业务需求,看完希望对你有帮助,欢迎评论区留言点赞!


相关文章
|
17天前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
112 3
|
1月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
1月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
23天前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
57 16
|
5月前
|
自然语言处理 Java 关系型数据库
Java|小数据量场景的模糊搜索体验优化
在小数据量场景下,如何优化模糊搜索体验?本文分享一个简单实用的方案,虽然有点“土”,但效果还不错。
91 0
|
5月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
391 70
|
传感器 分布式计算 安全
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
本文围绕 Java 大数据在智能安防入侵检测系统中的应用展开,剖析系统现状与挑战,阐释多源数据融合及分析技术,结合案例与代码给出实操方案,提升入侵检测效能。
|
6月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
7月前
|
SQL JavaScript 安全
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
296 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
|
6月前
|
Java API Docker
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境
以上内容是一个简单的实现在Java后端中通过DockerClient操作Docker生成python环境并执行代码,最后销毁的案例全过程,也是实现一个简单的在线编程后端API的完整流程,你可以在此基础上添加额外的辅助功能,比如上传文件、编辑文件、查阅文件、自定义安装等功能。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境