原创

Spring Boot如何实现数据脱敏?

1.什么是数据脱敏?

数据脱敏是一种数据安全技术,用于保护敏感数据,以防止未经授权的访问和使用。数据脱敏通过对敏感数据进行一定程度的修改或替换,以隐藏敏感信息,同时保留数据的完整性和可用性,通常应用于测试、开发和演示环境中。

数据脱敏的优势

数据脱敏具有以下优势:
  • 保护敏感数据:数据脱敏可以保护敏感数据,以防止未经授权的访问和使用,从而保护个人隐私和数据安全;
  • 遵守法规和合规要求:许多国家和地区的法规和合规要求对敏感数据进行保护和脱敏,数据脱敏可以帮助企业达到这些要求;
  • 提高数据安全性:数据脱敏可以降低数据泄露和数据盗窃的风险,从而提高数据安全性;
  • 支持开发和测试:数据脱敏可以在开发和测试环境中使用,以避免在这些环境中泄露敏感信息,同时保留数据的完整性和可用性;
  • 保护商业机密:数据脱敏可以帮助企业保护商业机密,例如客户列表、销售数据等。

数据脱敏有哪些常用的方法

常用的数据脱敏方法包括:
  • 随机化:通过将敏感数据替换为随机值或者伪随机值,保护原始数据的真实性。例如,将姓名替换为随机字符串;
  • 掩码:通过将敏感数据的一部分替换为掩码,隐藏部分敏感信息。例如,将电话号码的后四位替换为星号;
  • 加密:通过对敏感数据进行加密,保护数据的机密性。例如,对信用卡号码进行加密;
  • 截断:通过截断敏感数据的一部分或全部,限制访问敏感信息的范围。例如,只显示姓名的首字母;
  • 数据分区:将敏感数据分成多个区域,在不同的区域应用不同的脱敏技术,保护数据的隐私和机密性;
  • 虚拟化:在测试和开发环境中使用虚拟数据代替真实数据,虚拟数据可以是随机生成的、采样的或者是经过脱敏处理的;
  • 数据屏蔽:通过定义数据访问权限、角色和规则,限制用户访问敏感数据的范围和权限,保护数据的机密性和完整性;
  • 数据分类:将数据按照敏感程度分类,对不同级别的数据采用不同的脱敏技术和措施,保障数据的安全性。

数据脱敏需要注意哪些事项

在进行数据脱敏时,需要注意以下事项:
  • 数据完整性:数据脱敏可能会修改或删除原始数据,影响数据的完整性。因此,在进行数据脱敏时,需要确保脱敏操作不会影响数据的完整性和准确性;
  • 数据可用性:数据脱敏可能会使原始数据不可用,影响数据的可用性。因此,在进行数据脱敏时,需要确保脱敏操作不会影响数据的可用性和访问性;
  • 数据安全性:在进行数据脱敏时,需要注意保护脱敏过程中使用的算法、密钥和工具,以防止数据泄露和被攻击;
  • 脱敏方法的适用性:不同的脱敏方法适用于不同类型的数据和场景。在选择脱敏方法时,需要考虑数据类型、敏感程度和使用场景等因素,以确保脱敏方法的适用性和有效性;
  • 法规和合规要求:一些国家和地区的法规和合规要求对敏感数据进行保护和脱敏。在进行数据脱敏时,需要遵守当地的法规和合规要求。

desensitization简介

desensitization是基于Java反射api、零依赖、简单易用、支持各种复杂数据结构的数据脱敏库,包含但不限于以下类型的数据脱敏:
  • 邮箱
  • 手机号码
  • 中文名称
  • 身份证号码
  • 银行卡号码
  • 密码
  • 统一社会信用代码
  • 任意CharSequence类型的值
  • 级联脱敏

2.代码工程

实验目标

通过desensitization包实现对敏感数据脱敏处理

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>desensitization</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- data desensitization-->
        <dependency>
            <groupId>red.zyc</groupId>
            <artifactId>desensitization</artifactId>
            <version>2.4.3</version>
        </dependency>

    </dependencies>
</project>

controller

package com.et.desensization.controller;

import com.et.desensization.dto.Teacher;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import red.zyc.desensitization.Sensitive;

import java.util.HashMap;
import java.util.Map;

@RestController
public class HelloWorldController {
    @RequestMapping("/hello")
    public Teacher showHelloWorld(){

      Teacher teacher = Sensitive.desensitize(new Teacher(1,"Harries BLOG","400000000000000000","15900000000","1420000000@qq.com","123456789"));
      return teacher;
    }
}

dto

在对象上加上脱敏注解:
package com.et.desensization.dto;

import red.zyc.desensitization.annotation.*;

public class Teacher {

    private Integer id;
    
    @ChineseNameSensitive
    private String name;
    
    @IdCardNumberSensitive
    private String idCard;
    
    @PhoneNumberSensitive
    private String tel;
    
    @EmailSensitive
    private String email;
    
    @PasswordSensitive
    private String password;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Teacher() {
    }

    public Teacher(Integer id, String name, String idCard, String tel, String email, String password) {
        this.id = id;
        this.name = name;
        this.idCard = idCard;
        this.tel = tel;
        this.email = email;
        this.password = password;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", idCard='" + idCard + '\'' +
                ", tel='" + tel + '\'' +
                ", email='" + email + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

3.测试

  1. 启动Spring Boot应用
  2. 访问http://127.0.0.1:8088/hello
结果可以看到,
new Teacher(1,"Harries BLOG","400000000000000000","15900000000","1420000000@qq.com","123456789")
原始数据脱敏后变成如下加密的效果
{"id":1,"name":"H***********","idCard":"400000********0000","tel":"159****0000","email":"1*********@qq.com","password":"*********"}

4.引用

正文到此结束
Loading...