赞
踩
数据脱敏(Data Masking)是一种数据保护技术,用于隐藏或替换敏感数据,以保护数据的隐私和安全性,同时尽量保持数据的可用性和一定的格式保留。
数据脱敏的目的是在数据使用和共享的过程中,对敏感数据进行保护,防止敏感信息泄露、滥用或未经授权的访问。常见的敏感数据包括个人身份证号码、姓名、手机号码、银行账号、社会保险号等。
例:
类型 | 原始数据 | 脱敏数据 |
---|---|---|
手机 | 13248765917 | 132****5917 |
身份证 | 530321199204074611 | 530321**********11 |
银行卡 | 9988002866797031 | 998800********31 |
数据脱敏可以通过以下方式实现:
替换:将敏感数据替换为符合规定格式的伪造数据,如将真实姓名替换为随机生成的姓名、将手机号码替换为随机生成的手机号等。
屏蔽:对敏感数据进行屏蔽,只显示部分信息,如隐藏身份证号码的部分数字、隐藏银行账号的后几位等。
加密:对敏感数据进行加密处理,只有具备相应权限的用户才能解密并查看真实数据。
数据保护:通过脱敏技术,确保敏感数据在数据处理、存储和传输过程中得到有效保护,减少数据泄露和滥用的风险。
合规要求:许多行业和法规对于敏感数据的保护有着严格的要求,如GDPR(通用数据保护条例)、HIPAA(医疗保险可移植性和责任法案)等。数据脱敏可以帮助组织遵守相关法规和合规要求。
共享和分析:数据脱敏使得在共享数据或进行数据分析时,可以减少敏感信息的暴露,保护用户隐私,同时仍然能够进行有效的数据处理和分析。
测试和开发:在测试和开发过程中,使用脱敏数据可以减少对真实敏感数据的依赖,保护数据安全性,同时仍能进行系统功能和性能测试。
Apache Commons Text:
Apache Commons Text是Apache软件基金会的一个项目,提供了多种文本处理的工具类。其中的 RandomStringUtils 类可以用于生成随机字符串来替换敏感数据,实现数据脱敏。
Jasypt(Java Simplified Encryption):
Jasypt是一个Java加密库,提供了数据脱敏的功能。它支持对敏感数据进行加密、解密和脱敏处理,包括替换、屏蔽、加密等操作。
DataMasking:
DataMasking是一个开源的Java库,专注于数据脱敏功能。它提供了一系列的注解和工具类,可用于对敏感数据进行替换、屏蔽、加密等处理。
MaskFormatter(javax.swing.text.MaskFormatter):
MaskFormatter是Java标准库中的一个类,用于格式化文本。它可以通过指定格式来对敏感数据进行脱敏,例如通过使用占位符或特定字符来替换敏感数据的部分或全部内容。
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)) = "091579"
DesensitizedUtil.desensitized(“18049531999”, DesensitizedUtil.DesensitizedType.MOBILE_PHONE)) = "1801999"
DesensitizedUtil.desensitized(“北京市海淀区马连洼街道289号”, DesensitizedUtil.DesensitizedType.ADDRESS)) = "北京市海淀区马**”
DesensitizedUtil.desensitized(“duandazhi-jack@gmail.com.cn”, DesensitizedUtil.DesensitizedType.EMAIL)) = “d*************@gmail.com.cn”
DesensitizedUtil.desensitized(“1234567890”, DesensitizedUtil.DesensitizedType.PASSWORD)) = “****"
DesensitizedUtil.desensitized(“苏D40000”, DesensitizedUtil.DesensitizedType.CAR_LICENSE)) = "苏D40"
DesensitizedUtil.desensitized(“11011111222233333256”, DesensitizedUtil.DesensitizedType.BANK_CARD)) = “1101 **** **** **** 3256”
DesensitizedUtil.desensitized(“192.168.1.1”, DesensitizedUtil.DesensitizedType.IPV4)) = "192...”
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;
}
}
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);
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveSerializer.class)
public @interface SensitiveData {
SensitivityEnum strategy();
}
@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("13555551111@126.com");
//根据key查询对应的信息
return u;
}
通过以上步骤,你可以在 Spring Boot 中实现数据脱敏。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。