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

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


相关文章
|
10天前
|
安全 Java 大数据
|
27天前
|
监控 安全 数据可视化
java基于微服务的智慧工地管理云平台SaaS源码 数据大屏端 APP移动端
围绕施工现场人、机、料、法、环、各个环节,“智慧工地”将传统建筑施工与大数据物联网无缝结合集成多个智慧应用子系统,施工数据云端整合分析,提供专业、先进、安全的智慧工地解决方案。
31 1
|
28天前
|
前端开发 小程序 Java
uniapp上传图片 前端以及java后端代码实现
uniapp上传图片 前端以及java后端代码实现
42 0
|
1月前
|
监控 数据可视化 Java
《使用 JFreeChart 进行数据可视化:提升 Java Web 应用的数据展示能力》
【4月更文挑战第4天】JFreeChart 是 Java Web 应用中数据可视化的强大开源库,提供多种图表类型如线图、柱状图,助于理解数据趋势和模式。通过导入库、创建数据集、设置图表属性,开发者可生成吸引人的图表提升用户体验。使用时注意数据准确性、配色、标签和交互性。JFreeChart 具有高度可定制性、良好性能和社区支持,适用于业务展示、系统监控及数据分析场景。
|
27天前
|
消息中间件 Java 微服务
构建高性能微服务架构:Java后端实践
【4月更文挑战第8天】 在当今互联网应用的快速迭代与高并发挑战下,微服务架构以其灵活性和扩展性成为众多企业技术选型的宠儿。本文将深入探讨在Java后端开发中,如何构建一个高性能的微服务系统,涵盖从基础架构设计、关键技术选型到性能优化策略的全方位分析。我们将透过实际案例,剖析微服务实践中的最佳模式与常见陷阱,为后端开发人员提供一份实操指南。
|
3天前
|
存储 监控 Java
如何在Java中实现等待文件修改后再读取数据的功能?
如何在Java中实现等待文件修改后再读取数据的功能?
10 0
|
3天前
|
JSON JavaScript Java
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
11 0
|
6天前
|
安全 Java 网络安全
深入理解Java异常处理网络安全与信息安全:保护数据的关键策略
【4月更文挑战第29天】本文将深入探讨Java中的异常处理机制,包括异常的概念、分类、捕获和处理等方面。通过详细的解析和实例演示,帮助读者更好地理解Java异常处理的原理和应用。 【4月更文挑战第29天】在数字化时代,数据成为最宝贵的资产之一。随着网络攻击的日益猖獗,了解并实施有效的网络安全和信息保护措施变得至关重要。本文将深入探讨网络安全漏洞的概念、加密技术的重要性以及提升个人和企业的安全意识的必要性。我们将分析当前的安全挑战,并提供一系列实用的防护策略,旨在帮助读者构建一个更加安全的数字环境。
|
6天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如
|
6天前
|
Java 关系型数据库 MySQL
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术
【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术