springboot项目中实现数据脱敏

1、什么是数据脱敏

数据脱敏(Data Masking)是一种数据保护技术,用于隐藏或替换敏感数据,以保护数据的隐私和安全性,同时尽量保持数据的可用性和一定的格式保留。

数据脱敏的目的是在数据使用和共享的过程中,对敏感数据进行保护,防止敏感信息泄露、滥用或未经授权的访问。常见的敏感数据包括个人身份证号码、姓名、手机号码、银行账号、社会保险号等。
例:

类型 原始数据 脱敏数据
手机 13248765917 132****5917
身份证 530321199204074611 530321**********11
银行卡 9988002866797031 998800********31

数据脱敏可以通过以下方式实现:

替换:将敏感数据替换为符合规定格式的伪造数据,如将真实姓名替换为随机生成的姓名、将手机号码替换为随机生成的手机号等。

屏蔽:对敏感数据进行屏蔽,只显示部分信息,如隐藏身份证号码的部分数字、隐藏银行账号的后几位等。

加密:对敏感数据进行加密处理,只有具备相应权限的用户才能解密并查看真实数据。

2、数据脱敏的主要目的和好处

  • 数据保护:通过脱敏技术,确保敏感数据在数据处理、存储和传输过程中得到有效保护,减少数据泄露和滥用的风险。

  • 合规要求:许多行业和法规对于敏感数据的保护有着严格的要求,如GDPR(通用数据保护条例)、HIPAA(医疗保险可移植性和责任法案)等。数据脱敏可以帮助组织遵守相关法规和合规要求。

  • 共享和分析:数据脱敏使得在共享数据或进行数据分析时,可以减少敏感信息的暴露,保护用户隐私,同时仍然能够进行有效的数据处理和分析。

  • 测试和开发:在测试和开发过程中,使用脱敏数据可以减少对真实敏感数据的依赖,保护数据安全性,同时仍能进行系统功能和性能测试。

3、实现数据脱敏

1)java的常用数据脱敏的第三方包

  1. Apache Commons Text:
    Apache Commons Text是Apache软件基金会的一个项目,提供了多种文本处理的工具类。其中的 RandomStringUtils 类可以用于生成随机字符串来替换敏感数据,实现数据脱敏。

    扫描二维码关注公众号,回复: 16276458 查看本文章
  2. Jasypt(Java Simplified Encryption):
    Jasypt是一个Java加密库,提供了数据脱敏的功能。它支持对敏感数据进行加密、解密和脱敏处理,包括替换、屏蔽、加密等操作。

  3. DataMasking:
    DataMasking是一个开源的Java库,专注于数据脱敏功能。它提供了一系列的注解和工具类,可用于对敏感数据进行替换、屏蔽、加密等处理。

  4. MaskFormatter(javax.swing.text.MaskFormatter):
    MaskFormatter是Java标准库中的一个类,用于格式化文本。它可以通过指定格式来对敏感数据进行脱敏,例如通过使用占位符或特定字符来替换敏感数据的部分或全部内容。

2)脱敏工具类

Hutool 提供了 DesensitizedUtil (opens new window)脱敏工具类,支持用户 ID、 中文名、身份证、座机号、手机号、 地址、电子邮件、 密码、车牌、银行卡号的脱敏处理。
使用方达,代码如下

DesensitizedUtil.desensitized(“100”, DesensitizedUtil.DesensitizedType.USER_ID)) = “0”
DesensitizedUtil.desensitized(“段正淳”, DesensitizedUtil.DesensitizedType.CHINESE_NAME)) = “段**”
DesensitizedUtil.desensitized(“51343620000320711X”, DesensitizedUtil.DesensitizedType.ID_CARD)) = “51X"
DesensitizedUtil.desensitized(“09157518479”, DesensitizedUtil.DesensitizedType.FIXED_PHONE)) = "0915
79"
DesensitizedUtil.desensitized(“18049531999”, DesensitizedUtil.DesensitizedType.MOBILE_PHONE)) = "180
1999"
DesensitizedUtil.desensitized(“北京市海淀区马连洼街道289号”, DesensitizedUtil.DesensitizedType.ADDRESS)) = "北京市海淀区马
**”
DesensitizedUtil.desensitized(“[email protected]”, DesensitizedUtil.DesensitizedType.EMAIL)) = “d*************@gmail.com.cn”
DesensitizedUtil.desensitized(“1234567890”, DesensitizedUtil.DesensitizedType.PASSWORD)) = “****"
DesensitizedUtil.desensitized(“苏D40000”, DesensitizedUtil.DesensitizedType.CAR_LICENSE)) = "苏D4
0"
DesensitizedUtil.desensitized(“11011111222233333256”, DesensitizedUtil.DesensitizedType.BANK_CARD)) = “1101 **** **** **** 3256”
DesensitizedUtil.desensitized(“192.168.1.1”, DesensitizedUtil.DesensitizedType.IPV4)) = "192.
.
.

3)实现自定义脱敏

  • 创建自定义脱敏枚举类:
    这里定义一个敏感字段的枚举,并设定各个字段的脱敏策略。
public enum SensitiveEnum {
    
    
    /**
     * 用户名
     */
    USERNAME(s -> s.replaceAll("\\S*(\\S)", "***$1")),
    /**
     * 身份证
     */
    ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")),
    /**
     * 手机号
     */
    PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
    /**
     * 地址
     */
    ADDRESS(s -> s.replaceAll("(\\S{3})\\S{2}(\\S*)\\S{2}", "$1****$2****"));


    private final Function<String, String> desensitizer;

    SensitiveEnum(Function<String, String> desensitizer) {
    
    
        this.desensitizer = desensitizer;
    }

    public Function<String, String> desensitizer() {
    
    
        return desensitizer;
    }
}
  • 创建序列化类:SensitiveSerializer:
public class SensitiveSerializer extends JsonSerializer<String> implements ContextualSerializer {
    
    
   private SensitiveEnum sensitiveEnum;

   @Override
   public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    
    
       gen.writeString(sensitivityEnum.desensitizer().apply(value));
   }

   @Override
   public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
    
    

       Sensitivity annotation = property.getAnnotation(Sensitivity.class);
       if (Objects.nonNull(annotation)&&Objects.equals(String.class, property.getType().getRawClass())) {
    
    
           this.sensitivityEnum = annotation.strategy();
           return this;
       }

       return prov.findValueSerializer(property.getType(), property);
   }
}

  • 定义SensitiveData注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveSerializer.class)
public @interface SensitiveData {
    
    
    SensitivityEnum strategy();
}
  • 定义返回结果实体类
    创建包含敏感数据字段的实体类,并在需要脱敏的字段上添加 @SensitiveData 注解。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserVO {
    
    
    private Integer id;

    @Sensitivity(strategy = SensitivityEnum.USERNAME)
    private String username;

    @Sensitivity(strategy = SensitivityEnum.PHONE)
    private String tel;

    private String email;

}

创建Conrtoller测试返回结果

    @GetMapping("test")
    public Object getTest(){
    
    
        UserVO u = new UserVO();
        u.setId(1);
        u.setUsername("张老三");
        u.setTel("13555551111");
        u.setEmail("[email protected]");
        //根据key查询对应的信息
        return u;
    }

在这里插入图片描述

通过以上步骤,你可以在 Spring Boot 中实现数据脱敏。

猜你喜欢

转载自blog.csdn.net/weixin_44727769/article/details/131102469