【Java工具类】- 接口字段参数脱敏

119 阅读2分钟

前言

开发过程中,对于一些比较敏感的数据,比如用户证件号码,手机号这些私密的个人信息,需要对接口中的这些参数进行脱敏设置和处理;

脱敏工具类处理

👋例如:对用户的人员编号和证件号码脱敏显示

🚩规则:

  • 人员编号前三后三位之间的数字脱敏显示;
  • 证件号长度大于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;
    }
}