• 3种常见的数据脱敏方案



    1.SQL数据脱敏实现

    MYSQL(电话号码,身份证)数据脱敏的实现

    1. -- CONCAT()、LEFT()和RIGHT()字符串函数组合使用,请看下面具体实现
    2.  
    3. -- CONCAT(str1,str2,…):返回结果为连接参数产生的字符串
    4. -- LEFT(str,len):返回从字符串str 开始的len 最左字符
    5. -- RIGHT(str,len):从字符串str 开始,返回最右len 字符
    6.  
    7. -- 电话号码脱敏sql:
    8.  
    9. SELECT mobilePhone AS 脱敏前电话号码,CONCAT(LEFT(mobilePhone,3), '********' ) AS 脱敏后电话号码 FROM t_s_user
    10.  
    11. -- 身份证号码脱敏sql:
    12.  
    13. SELECT idcard AS 未脱敏身份证, CONCAT(LEFT(idcard,3), '****' ,RIGHT(idcard,4)) AS 脱敏后身份证号 FROM t_s_user

    基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

    • 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

    • 视频教程:https://doc.iocoder.cn/video/

    2.JAVA数据脱敏实现

    可参考:海强 / sensitive-plus

    https://gitee.com/strong_sea/sensitive-plus

    数据脱敏插件,目前支持地址脱敏、银行卡号脱敏、中文姓名脱敏、固话脱敏、身份证号脱敏、手机号脱敏、密码脱敏 一个是正则脱敏、另外一个根据显示长度脱敏,默认是正则脱敏,可以根据自己的需要配置自己的规则。

    基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

    • 项目地址:https://gitee.com/zhijiantianya/yudao-cloud

    • 视频教程:https://doc.iocoder.cn/video/

    3.mybatis-mate-sensitive-jackson

    mybatisplus 的新作,可以测试使用,生产需要收费。

    根据定义的策略类型,对数据进行脱敏,当然策略可以自定义。

    1. # 目前已有
    2. package mybatis.mate.strategy;
    3.  
    4. public interface SensitiveType {
    5.     String chineseName = "chineseName";
    6.     String idCard = "idCard";
    7.     String phone = "phone";
    8.     String mobile = "mobile";
    9.     String address = "address";
    10.     String email = "email";
    11.     String bankCard = "bankCard";
    12.     String password = "password";
    13.     String carNumber = "carNumber";
    14. }

    Demo 代码目录

    1、pom.xml

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    3.     <parent>
    4.         <groupId>com.baomidougroupId>
    5.         <artifactId>mybatis-mate-examplesartifactId>
    6.         <version>0.0.1-SNAPSHOTversion>
    7.     parent>
    8.     <modelVersion>4.0.0modelVersion>
    9.     <artifactId>mybatis-mate-sensitive-jacksonartifactId>
    10.     <dependencies>
    11.         <dependency>
    12.             <groupId>mysqlgroupId>
    13.             <artifactId>mysql-connector-javaartifactId>
    14.         dependency>
    15.     dependencies>
    16.  
    17. project>

    2、appliation.yml

    1. # DataSource Config
    2. spring:
    3.   datasource:
    4. #    driver-class-name: org.h2.Driver
    5. #    schema: classpath:db/schema-h2.sql
    6. #    data: classpath:db/data-h2.sql
    7. #    url: jdbc:h2:mem:test
    8. #    username: root
    9. #    password: test
    10.     driver-class-namecom.mysql.cj.jdbc.Driver
    11.     url: jdbc:mysql://localhost:3306/mybatis_mate?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    12.     username: root
    13.     password: 123456
    14. # Mybatis Mate 配置
    15. mybatis-mate:
    16.   cert:
    17.     # 请添加微信wx153666购买授权,不白嫖从我做起! 测试证书会失效,请勿正式环境使用
    18.     grant: thisIsTestLicense
    19.     license: as/bsBaSVrsA9FfjC/N77ruEt2/QZDrW+MHETNuEuZBra5mlaXZU+DE1ZvF8UjzlLCpH3TFVH3WPV+Ya7Ugiz1Rx4wSh/FK6Ug9lhos7rnsNaRB/+mR30aXqtlLt4dAmLAOCT56r9mikW+t1DDJY8TVhERWMjEipbqGO9oe1fqYCegCEX8tVCpToKr5J1g1V86mNsNnEGXujnLlEw9jBTrGxAyQroD7Ns1Dhwz1K4Y188mvmRQp9t7OYrpgsC7N9CXq1s1c2GtvfItHArkqHE4oDrhaPjpbMjFWLI5/XqZDtW3D+AVcH7pTcYZn6vzFfDZEmfDFV5fQlT3Rc+GENEg==
    20.  
    21. # Logger Config
    22. logging:
    23.   level:
    24.     mybatis.mate: debug

    3、Appliation启动类

    1. package mybatis.mate.sensitive.jackson;
    2.  
    3. import org.springframework.boot.SpringApplication;
    4. import org.springframework.boot.autoconfigure.SpringBootApplication;
    5.  
    6. @SpringBootApplication
    7. public class SensitiveJacksonApplication {
    8.  
    9.     // 测试访问 http://localhost:8080/info ,http://localhost:8080/list
    10.     public static void main(String[] args) {
    11.         SpringApplication.run(SensitiveJacksonApplication.class, args);
    12.     }
    13. }

    4、配置类,自定义脱敏策略

    1. package mybatis.mate.sensitive.jackson.config;
    2.  
    3. import mybatis.mate.databind.ISensitiveStrategy;
    4. import mybatis.mate.strategy.SensitiveStrategy;
    5. import org.springframework.context.annotation.Bean;
    6. import org.springframework.context.annotation.Configuration;
    7.  
    8. @Configuration
    9. public class SensitiveStrategyConfig {
    10.  
    11.     /**
    12.      * 注入脱敏策略
    13.      */
    14.     @Bean
    15.     public ISensitiveStrategy sensitiveStrategy() {
    16.         // 自定义 testStrategy 类型脱敏处理
    17.         return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***");
    18.     }
    19. }

    5、业务类

    User,注解标识脱敏字段,及选用脱敏策略

    1. package mybatis.mate.sensitive.jackson.entity;
    2.  
    3. import lombok.Getter;
    4. import lombok.Setter;
    5. import mybatis.mate.annotation.FieldSensitive;
    6. import mybatis.mate.sensitive.jackson.config.SensitiveStrategyConfig;
    7. import mybatis.mate.strategy.SensitiveType;
    8.  
    9. @Getter
    10. @Setter
    11. public class User {
    12.     private Long id;
    13.     /**
    14.      * 这里是一个自定义的策略 {@link SensitiveStrategyConfig} 初始化注入
    15.      */
    16.     @FieldSensitive("testStrategy")
    17.     private String username;
    18.     /**
    19.      * 默认支持策略 {@link SensitiveType }
    20.      */
    21.     @FieldSensitive(SensitiveType.mobile)
    22.     private String mobile;
    23.     @FieldSensitive(SensitiveType.email)
    24.     private String email;
    25.  
    26. }

    UserController

    1. package mybatis.mate.sensitive.jackson.controller;
    2.  
    3. import mybatis.mate.databind.ISensitiveStrategy;
    4. import mybatis.mate.databind.RequestDataTransfer;
    5. import mybatis.mate.sensitive.jackson.entity.User;
    6. import mybatis.mate.sensitive.jackson.mapper.UserMapper;
    7. import mybatis.mate.strategy.SensitiveType;
    8. import org.springframework.beans.factory.annotation.Autowired;
    9. import org.springframework.web.bind.annotation.GetMapping;
    10. import org.springframework.web.bind.annotation.RestController;
    11.  
    12. import javax.servlet.http.HttpServletRequest;
    13. import java.util.HashMap;
    14. import java.util.List;
    15. import java.util.Map;
    16.  
    17. @RestController
    18. public class UserController {
    19.     @Autowired
    20.     private UserMapper userMapper;
    21.     @Autowired
    22.     private ISensitiveStrategy sensitiveStrategy;
    23.  
    24.     // 测试访问 http://localhost:8080/info
    25.     @GetMapping("/info")
    26.     public User info() {
    27.         return userMapper.selectById(1L);
    28.     }
    29.  
    30.     // 测试返回 map 访问 http://localhost:8080/map
    31.     @GetMapping("/map")
    32.     public Map<StringObjectmap() {
    33.         // 测试嵌套对象脱敏
    34.         Map<StringObject> userMap = new HashMap<>();
    35.         userMap.put("user", userMapper.selectById(1L));
    36.         userMap.put("test"123);
    37.         userMap.put("userMap"new HashMap<StringObject>() {{
    38.             put("user2", userMapper.selectById(2L));
    39.             put("test2""hi china");
    40.         }});
    41.         // 手动调用策略脱敏
    42.         userMap.put("mobile", sensitiveStrategy.getStrategyFunctionMap()
    43.                 .get(SensitiveType.mobile).apply("15315388888"));
    44.         return userMap;
    45.     }
    46.  
    47.     // 测试访问 http://localhost:8080/list
    48.     // 不脱敏 http://localhost:8080/list?skip=1
    49.     @GetMapping("/list")
    50.     public List<Userlist(HttpServletRequest request) {
    51.         if ("1".equals(request.getParameter("skip"))) {
    52.             // 跳过脱密处理
    53.             RequestDataTransfer.skipSensitive();
    54.         }
    55.         return userMapper.selectList(null);
    56.     }
    57. }

    UserMapper

    1. package mybatis.mate.sensitive.jackson.mapper;
    2.  
    3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    4. import mybatis.mate.sensitive.jackson.entity.User;
    5. import org.apache.ibatis.annotations.Mapper;
    6.  
    7. @Mapper
    8. public interface UserMapper extends BaseMapper {
    9.  
    10. }

    6、测试

    GET http://localhost:8080/list

    1. [
    2.   {
    3.     "id"1,
    4.     "username""Jone***test***",
    5.     "mobile""153******81",
    6.     "email""t****@baomidou.com"
    7.   },
    8.   {
    9.     "id"2,
    10.     "username""Jack***test***",
    11.     "mobile""153******82",
    12.     "email""t****@baomidou.com"
    13.   },
    14.   {
    15.     "id"3,
    16.     "username""Tom***test***",
    17.     "mobile""153******83",
    18.     "email""t****@baomidou.com"
    19.   }
    20. ]

    GET http://localhost:8080/list?skip=1

    1. [
    2.   {
    3.     "id"1,
    4.     "username""Jone",
    5.     "mobile""15315388881",
    6.     "email""test1@baomidou.com"
    7.   },
    8.   {
    9.     "id"2,
    10.     "username""Jack",
    11.     "mobile""15315388882",
    12.     "email""test2@baomidou.com"
    13.   },
    14.   {
    15.     "id"3,
    16.     "username""Tom",
    17.     "mobile""15315388883",
    18.     "email""test3@baomidou.com"
    19.   }
    20. ]
  • 相关阅读:
    日期分析处理
    sqrt函数的实现
    Spring基础之AOP和代理模式
    NGINX源码之:子请求与请求后置处理ngx_http_finalize_request
    2022年8月9日:用C#生成.NET应用程序--使用 Visual Studio Code 调试器,以交互方式调试 .NET 应用(不会,失败)
    QT中启动窗口QSplashScreen的使用
    使用dockerfile自定义Tomcat镜像
    springboot+自行车网上商城 毕业设计-附源码130948
    架构师选择题--计算机网络
    NGS基础---Plink文件格式ped/map和bed/bim/fam
  • 原文地址:https://blog.csdn.net/oBuKaoPu1/article/details/126178823