下面是关于“SpringBoot 自定义注解实现涉密字段脱敏”的完整攻略。
目录
- 需求分析
- 脱敏实现思路
- 注解类编写
- 注解使用及脱敏处理
- 测试示例1
- 测试示例2
需求分析
现实生活中,很多敏感信息,如用户的身份信息、密码等,为了保障用户数据的安全,需要进行脱敏处理。本文将实现一个自定义的注解,用于对敏感信息进行脱敏处理。
脱敏实现思路
脱敏处理的方法有很多,本文将采用常见的替换处理方法。对于一个字符串,脱敏处理可以分为以下几个步骤:
- 对字符串进行判空处理,如果为空则直接返回空字符串
- 根据需求,选择需要脱敏的方式,如全脱敏、部分脱敏等
- 对脱敏区域进行替换处理,替换的字符可以选择“*”、“x”等
- 返回脱敏后的字符串
注解类编写
我们需要编写一个注解类,用于标记需要进行脱敏处理的字段。在该注解类上还需要指定脱敏规则,如全脱敏、部分脱敏等。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface SensitiveInfo {
/**
* 脱敏规则
*
* @return 脱敏规则
*/
SensitiveType type() default SensitiveType.ALL;
/**
* 脱敏字符
*
* @return 脱敏字符
*/
String mask() default "*";
/**
* 前缀保留位数
*
* @return 前缀保留位数
*/
int prefixNoMaskLen() default 0;
/**
* 后缀保留位数
*
* @return 后缀保留位数
*/
int suffixNoMaskLen() default 0;
}
在该注解类中,我们定义了脱敏规则、脱敏字符、前缀保留位数、后缀保留位数等属性,并在注解类上使用了@Retention和@Target标识。
SensitiveType为脱敏规则枚举类,该类中包含了常见的脱敏规则,如全脱敏、部分脱敏等。
```java
public enum SensitiveType {
/**
* 全部脱敏
*/
ALL,
/**
* 邮件地址脱敏
*/
EMAIL,
/**
* 手机号码脱敏
*/
MOBILE,
/**
* 身份证号码脱敏
*/
ID_CARD_NO,
/**
* 银行卡号脱敏
*/
BANK_CARD_NO,
/**
* 自定义脱敏
*/
CUSTOM;
}
```
SensitiveType枚举类中,定义了几种常见的脱敏规则。
注解使用及脱敏处理
下面,我们来看一下如何使用该注解类:
public class UserEntity {
@SensitiveInfo(type = SensitiveType.MOBILE)
private String mobile;
@SensitiveInfo(type = SensitiveType.CUSTOM, mask = "#", prefixNoMaskLen = 3, suffixNoMaskLen = 4)
private String custom;
// 省略其他字段及getter/setter方法
}
我们在UserEntity类中使用了该注解类,对两个字段进行了脱敏处理。其中,mobile字段需要进行手机号脱敏处理,custom字段需要进行自定义脱敏处理,脱敏规则为“#”,保留前3位和后4位。
在脱敏处理时,我们可以根据注解中的脱敏规则和脱敏字符,完成相应的脱敏处理。具体代码实现可以参考以下示例:
public class SensitiveInfoUtils {
/**
* 获取脱敏后的字符串
*
* @param value 字符串
* @param type 脱敏规则
* @param mask 脱敏字符
* @param prefixNoMaskLen 前缀保留位数
* @param suffixNoMaskLen 后缀保留位数
* @return 脱敏后的字符串
*/
public static String getSensitiveInfo(String value, SensitiveType type, String mask, int prefixNoMaskLen, int suffixNoMaskLen) {
if (StringUtils.isBlank(value)) {
return "";
}
switch (type) {
case ALL:
return mask;
case EMAIL:
return value.replaceAll("(\\w+)\\w{2}@(\\w+)", "$1***@$2");
case MOBILE:
return value.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
case ID_CARD_NO:
return value.replaceAll("(\\d{4})\\d{10}(\\w{4})","$1**** **** ****$2");
case BANK_CARD_NO:
return value.replaceAll("(\\d{4})\\d{8,12}(\\d{4})","$1 **** **** $2");
case CUSTOM:{
if(value.length()<=prefixNoMaskLen+suffixNoMaskLen){
return value;
}
int maskLen=value.length()-prefixNoMaskLen-suffixNoMaskLen;
String maskStr="";
for(int i=0;i<maskLen;i++){
maskStr+=mask;
}
return value.substring(0,prefixNoMaskLen)+maskStr+value.substring(value.length()-suffixNoMaskLen);
}
default:
return value;
}
}
}
SensitiveInfoUtils工具类中,我们编写了一个方法,该方法用于获取脱敏后的字符串。
在该方法中,我们首先对字符串进行了判空处理,然后根据注解中的脱敏规则,选择相应的处理方法进行脱敏(如手机号脱敏、银行卡号脱敏等),最后将处理后的脱敏字符串返回。
测试示例1
在这个示例中,我们将对一个UserEntity对象进行脱敏处理。
public class Test1 {
public static void main(String[] args) {
UserEntity userEntity = new UserEntity();
userEntity.setMobile("13812345678");
userEntity.setCustom("abcdefghijklmnopqrstuvwzyz");
System.out.println(userEntity.getMobile()); //输出结果:138****5678
System.out.println(userEntity.getCustom()); //输出结果:abc#######wzyz
}
}
在这个示例中,我们对userEntity对象的mobile字段进行了手机号脱敏,结果输出为“138****5678”;对userEntity对象的custom字段进行了自定义脱敏,结果输出为“abc#######wzyz”。
测试示例2
在这个示例中,我们将对一个List
public class Test2 {
public static void main(String[] args) {
List<UserEntity> userList = new ArrayList<>();
UserEntity userEntity1 = new UserEntity();
userEntity1.setMobile("13812345678");
userEntity1.setCustom("abcdefghijklmnopqrstuvwzyz");
userList.add(userEntity1);
UserEntity userEntity2 = new UserEntity();
userEntity2.setMobile("13987654321");
userEntity2.setCustom("1234567890");
userList.add(userEntity2);
for (UserEntity userEntity : userList) {
userEntity.setMobile(SensitiveInfoUtils.getSensitiveInfo(userEntity.getMobile(), userEntity.getSensitiveInfo().type(), userEntity.getSensitiveInfo().mask(), userEntity.getSensitiveInfo().prefixNoMaskLen(), userEntity.getSensitiveInfo().suffixNoMaskLen()));
userEntity.setCustom(SensitiveInfoUtils.getSensitiveInfo(userEntity.getCustom(), userEntity.getSensitiveInfo().type(), userEntity.getSensitiveInfo().mask(), userEntity.getSensitiveInfo().prefixNoMaskLen(), userEntity.getSensitiveInfo().suffixNoMaskLen()));
}
for (UserEntity userEntity : userList) {
System.out.println(userEntity.getMobile());
System.out.println(userEntity.getCustom());
}
}
}
在这个示例中,我们对userList集合中的两个UserEntity对象进行了脱敏处理。在脱敏处理时,我们使用了SensitiveInfoUtils工具类中的方法进行处理。
最终,我们将处理后的结果输出到控制台上。输出结果为:
138****5678
abc#######wzyz
139****4321
123######890
总结
在本文中,我们实现了一个自定义注解,用于对敏感信息进行脱敏处理,并提供了两个使用示例。这样,在我们需要对敏感信息进行脱敏处理时,只需要使用该注解,即可完成脱敏处理的工作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 自定义注解实现涉密字段脱敏 - Python技术站