程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 快速入门

  • 后端手册

    • 分页实现
    • 导入导出功能
    • 文件上传与下载
    • 权限注解实现
    • 事务管理详解
    • 全局异常处理
    • 参数验证详解
    • 数据脱敏详解
      • 一、数据脱敏的常见类型
      • 二、如何实现数据脱敏
        • 1. 在实体类字段上添加脱敏注解
        • 2. 定义脱敏策略
        • 3. 实现脱敏逻辑
        • 4. 配置 Jackson 使用自定义序列化器
      • 三、扩展脱敏策略
      • 四、总结
    • 系统日志功能实现
    • 数据权限控制
    • 多数据源实现
    • 代码生成功能
    • 定时任务实现
    • 系统接口文档生成
    • 防重复提交实现
    • 国际化支持
    • 新建子模块
  • 前端手册

  • 组件文档

  • 数据库分析

  • 若依框架
  • 后端手册
scholar
2024-08-31
目录

数据脱敏详解

# 数据脱敏

在企业级应用中,保护用户隐私和敏感数据非常重要。当接口返回包含敏感信息的数据时,通常需要进行数据脱敏处理。数据脱敏的常用手段是使用 * 隐藏一部分数据,例如脱敏后的手机号码显示为 158****8888。若依框架基于 Jackson 提供了便捷的字段脱敏注解,只需在字段上添加对应的注解,即可实现数据脱敏。

# 一、数据脱敏的常见类型

以下是一些常见的数据脱敏类型及其示例:

类型 原始数据 脱敏数据
USERNAME 若依 若*
PASSWORD 123456 ******
ID_CARD 430602198812136666 4306**********6666
PHONE 15888888888 158****8888
EMAIL ruoyi@163.com r****@163.com
BANK_CARD 6211222200008888666 *************8666
CAR_LICENSE 湘F88888 湘F8***8

# 二、如何实现数据脱敏

若依框架通过在字段上添加 @Sensitive 注解来实现数据脱敏,开发者只需定义脱敏策略并在需要脱敏的字段上应用该注解即可。

# 1. 在实体类字段上添加脱敏注解

在需要进行脱敏处理的字段上添加 @Sensitive 注解,并指定脱敏策略类型。

import com.ruoyi.common.annotation.Sensitive;
import com.ruoyi.common.enums.DesensitizedType;

public class User extends BaseEntity
{
    // 手机号码字段,使用PHONE类型脱敏策略
    @Sensitive(desensitizedType = DesensitizedType.PHONE)
    private String phonenumber;

    // 身份证号字段,使用ID_CARD类型脱敏策略
    @Sensitive(desensitizedType = DesensitizedType.ID_CARD)
    private String idCard;

    // 邮箱字段,使用EMAIL类型脱敏策略
    @Sensitive(desensitizedType = DesensitizedType.EMAIL)
    private String email;

    // 密码字段,使用PASSWORD类型脱敏策略
    @Sensitive(desensitizedType = DesensitizedType.PASSWORD)
    private String password;

    // Getter 和 Setter 方法
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

说明:

  • @Sensitive 注解用于标注需要脱敏的字段。
  • desensitizedType 参数指定脱敏的类型,例如 PHONE、ID_CARD 等。

# 2. 定义脱敏策略

若依框架在 DesensitizedType 枚举类中定义了多种脱敏策略,开发者可以根据需要扩展新的脱敏策略。

package com.ruoyi.common.enums;

/**
 * 数据脱敏类型
 * 
 * @author ruoyi
 */
public enum DesensitizedType
{
    // 用户名类型,显示首字
    USERNAME,
    
    // 密码类型,全部脱敏
    PASSWORD,
    
    // 身份证号,显示前4位和后4位
    ID_CARD,
    
    // 手机号码,显示前三位和后四位
    PHONE,
    
    // 邮箱地址,显示前一位和@后的域名
    EMAIL,
    
    // 银行卡号,显示后4位
    BANK_CARD,
    
    // 车牌号,显示前2位和最后1位
    CAR_LICENSE
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 3. 实现脱敏逻辑

在实现数据脱敏时,实际的脱敏逻辑通常是在数据序列化为JSON时生效的。若依框架通过在 Jackson 中自定义序列化器来实现脱敏。开发者可以自定义序列化器,也可以扩展现有的脱敏策略。

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.ruoyi.common.enums.DesensitizedType;
import java.io.IOException;

public class SensitiveSerializer extends JsonSerializer<String>
{
    private final DesensitizedType type;

    public SensitiveSerializer(DesensitizedType type) {
        this.type = type;
    }

    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException
    {
        String result = value;
        if (value != null && !value.isEmpty()) {
            switch (type) {
                case USERNAME:
                    result = value.charAt(0) + "*";
                    break;
                case PASSWORD:
                    result = "******";
                    break;
                case ID_CARD:
                    result = value.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1**********$2");
                    break;
                case PHONE:
                    result = value.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
                    break;
                case EMAIL:
                    result = value.replaceAll("(\\w?)(\\w+)(@.*)", "$1****$3");
                    break;
                case BANK_CARD:
                    result = value.replaceAll("\\d{12}(\\d{4})", "************$1");
                    break;
                case CAR_LICENSE:
                    result = value.replaceAll("(\\w{2})(\\w+)(\\w{1})", "$1***$3");
                    break;
                default:
                    break;
            }
        }
        gen.writeString(result);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

说明:

  • SensitiveSerializer 是一个自定义的序列化器,根据传入的脱敏类型对数据进行脱敏处理。
  • 通过匹配正则表达式的方式替换敏感数据,生成脱敏后的字符串。

# 4. 配置 Jackson 使用自定义序列化器

在 Spring Boot 项目中,通常通过配置 Jackson 的 ObjectMapper 来注册自定义的序列化器,以便在全局范围内应用脱敏逻辑。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.ruoyi.common.enums.DesensitizedType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(String.class, new SensitiveSerializer(DesensitizedType.PHONE));
        objectMapper.registerModule(module);
        return objectMapper;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 三、扩展脱敏策略

若依框架已经提供了常见的脱敏策略,但开发者可以根据业务需求,进一步扩展自定义的脱敏策略。

  1. 在 DesensitizedType 枚举中添加新的策略类型,例如添加 ADDRESS 类型用于脱敏地址信息。
public enum DesensitizedType
{
    // 其他类型省略...
    
    // 地址类型,显示前3位和最后2位
    ADDRESS
}
1
2
3
4
5
6
7
  1. 在 SensitiveSerializer 中实现新的脱敏逻辑。
switch (type) {
    // 其他类型省略...
    
    case ADDRESS:
        result = value.replaceAll("(\\S{3})\\S*(\\S{2})", "$1****$2");
        break;
}
1
2
3
4
5
6
7

通过以上步骤,便可以为新的字段类型实现定制化的数据脱敏。

# 四、总结

数据脱敏是保护用户隐私的关键措施,若依框架通过注解和 Jackson 自定义序列化器实现了简洁高效的数据脱敏机制。

  • 基础脱敏: 通过在字段上使用 @Sensitive 注解,结合内置的 DesensitizedType,可以轻松实现常见的脱敏需求。
  • 自定义扩展: 开发者可以通过扩展 DesensitizedType 枚举和自定义序列化器来实现特殊的脱敏逻辑。
  • 全局配置: 通过配置 Jackson 的 ObjectMapper,可以将脱敏逻辑全局化,确保数据在序列化为JSON时自动进行脱敏处理。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
参数验证详解
系统日志功能实现

← 参数验证详解 系统日志功能实现→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式