前言
开发过程中,对于一些比较敏感的数据,比如用户证件号码,手机号这些私密的个人信息,需要对接口中的这些参数进行脱敏设置和处理;
脱敏工具类处理
👋例如:对用户的人员编号和证件号码脱敏显示
🚩规则:
- 人员编号前三后三位之间的数字脱敏显示;
- 证件号长度大于8时保留前6位和后2位;
⬇️代码如下:
脱敏方法入口
private void fieldDes(List<? extends AccountInfo> accountInfos) {
if (DesensitizationUtil.isNotNeedDesc(accountInfos)) {
return;
}
for (AccountInfo accountInfo : accountInfos) {
accountInfo.setPerCode(DesensitizationUtil.fieldDes(accountInfo.getPerCode(), ProductConstants.DesensitizationFieldType.PERCODE));
accountInfo.setIdNo(DesensitizationUtil.fieldDes(accountInfo.getIdNo(), ProductConstants.DesensitizationFieldType.IDNO));
}
}
/**
* 根据字段类型对数据脱敏
* @param originStr 待脱敏数据
* @param desType 字段类型
* @return java.lang.String
*/
public static String fieldDes(String originStr, ProductConstants.DesensitizationFieldType desType) {
UserSession userSession = SessionManager.getUserSession();
// 操作员设置不脱敏 或 字段类型未设置或类型无效 则返回原数据
if (null == userSession.getDescFields() || !userSession.getDescFields().contains(desType.getValue())) {
return originStr;
}
switch (desType) {
case PERCODE:
return perCodeDes(originStr);
case IDNO:
return idNoDes(originStr);
default:
return originStr;
}
}
人员编号脱敏
/**
* 人员编号脱敏
* 规则: 前三后三
* @param perCode 人员编号
* @return java.lang.String
*/
private static String perCodeDes(String perCode) {
if (StringUtil.isBlank(perCode)) {
return "";
}
if (6 < perCode.length()){
return replaceBetween(3, perCode.length() - 3, perCode);
}
return replaceBetween(0,perCode.length(),perCode);
}
证件号码脱敏
/**
* 证件号脱敏
* 规则:证件号长度大于8时保留前6位和后2位
* 否则全部隐藏
* @param idNo 证件号
* @return java.lang.String
*/
private static String idNoDes(String idNo) {
if (StringUtil.isBlank(idNo)) {
return "";
}
if (8 < idNo.length()) {
return replaceBetween(6, idNo.length() - 2, idNo);
}
return replaceBetween(0, idNo.length(), idNo);
}
/**
* 转换方法,将start到end位置的字符都转换成replaceStr字符
* @param start 起始位置(包括)
* @param end 结束为止(不包括)
* @param replaceStr 要替换的字符串
* @return java.lang.String
*/
private static String replaceBetween(int start, int end, String replaceStr) {
if (StringUtil.isBlank(replaceStr)) {
return "";
}
int length = end - start;
if (StringUtils.isNotBlank(replaceStr) && length > 0) {
StringBuilder sb = new StringBuilder(replaceStr);
//StringBuffer的replace方法可以start到end位置的字符串替换为它方法中的第三个参数
//StringUtils的repeat方法可以指定将一个string字符重复多少次
sb.replace(start, end, StringUtils.repeat(SYMBOL, length));
return sb.toString();
} else {
return replaceStr;
}
}