精华内容
下载资源
问答
  • Java脱敏工具类

    2020-12-25 15:51:07
    前言: 好像没有什么要描述的… ...import java.util.HashMap; /** * 关键字脱敏规则 * @date 2020/12/25 10:23 * @author wei.heng */ public class KeyWordPatterns extends HashMap<String, String> {

    前言:

    好像没有什么要描述的…
    就是关键信息需要脱敏处理
    设想是在网关的response拦截里对需要拦截的接口需要脱敏的属性值进行统一处理
    拦截的接口和属性配置到nacos的网关配置中

    import java.util.HashMap;
    
    /**
     * 关键字脱敏规则
     * @date 2020/12/25 10:23
     * @author wei.heng
     */
    public class KeyWordPatterns extends HashMap<String, String> {
    
    	/**
    	 * 增加脱敏规则
    	 * @param key 需要做脱敏处理的字段 - 与入参,对象属性名或map的key 能做equals匹配
    	 * @param pattern 脱敏规则,如:3-6(第四个字符到第六个字符,进行模糊处理,替换为*号)
    	 * @date 2020/12/25 11:28
    	 * @author wei.heng
    	 */
    	public void addPattern(String key, String pattern){
    		super.put(key, pattern);
    	};
    }
    
    
    
    /**
     *
     * 关键信息脱敏规则异常
     * @date 2020/12/25 11:41
     * @author wei.heng
     */
    public class UnsupportedKeyWordsPattern extends RuntimeException {
    
    	private static final long serialVersionUID = 1L;
    
    	private Integer code = HttpStatus.ERROR;
    
    	private String message = "脱敏规则配置有误";
    
    	public UnsupportedKeyWordsPattern() {
    	}
    
    	public Integer getCode() {
    		return code;
    	}
    
    	public void setCode(Integer code) {
    		this.code = code;
    	}
    
    	@Override
    	public String getMessage() {
    		return message;
    	}
    
    	public void setMessage(String message) {
    		this.message = message;
    	}
    }
    
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.lang.reflect.Field;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.regex.Pattern;
    
    /**
     * 关键信息脱敏处理
     * 设计思路:nacos的网关里配置需要拦截的接口,需要脱敏的属性值,注入到代码中,再以参数形式使用该脱敏工具类进行统一处理
     * 个人感觉这样会比较灵活
     * @author wei.heng
     * @date 2020/12/25 10:15
     */
    public class KeyWordsFilterUtil {
    
    	private Logger log = LoggerFactory.getLogger(this.getClass());
    
    	/** 脱敏数据类型 */
    	private final String CAN_BE_MODIFY_TYPE = "String";
    	/** 用于替换敏感信息的字符 */
    	private final String REPLACE_CHAR = "*";
    
    	public void filter(Object data, KeyWordPatterns patterns) {
    		if (data instanceof List) {
    			List<Object> list = (List) data;
    			for (Object o : list) {
    				filter(o, patterns);
    			}
    		} else if (data instanceof Map) {
    			// 不推荐接口间交互以map的形式
    			resetMapValue((Map) data, patterns);
    		} else {
    			resetObjectProperties(data, patterns);
    		}
    	}
    
    	/**
    	 *
    	 * 重设map里需要模糊处理的value值
    	 * @param data map数据对象
    	 * @param patterns 模糊匹配规则
    	 * @date 2020/12/25 14:12
    	 * @author wei.heng
    	 */
    	private void resetMapValue(Map data, KeyWordPatterns patterns) {
    		Set<String> filterKeys = patterns.keySet();
    		Map<String, Object> map = data;
    		Set<String> objKeys = map.keySet();
    		for (String objKey : objKeys) {
    			if(!filterKeys.contains(objKey)){
    				continue;
    			}
    			Object objValue = map.get(objKey);
    			if(objValue instanceof String){
    				String replacedStr = getReplacedString(patterns.get(objKey), objValue.toString());
    				// 用模糊处理后的数据,覆盖原有值
    				map.put(objKey, replacedStr);
    			} else {
    				// 当做对象进行处理
    				resetObjectProperties(objValue, patterns);
    			}
    		}
    	}
    
    	/**
    	 *
    	 * 重设对象需要模糊处理的属性值
    	 * @param data 数据对象
    	 * @param patterns 模糊处理匹配规则
    	 * @date 2020/12/25 14:12
    	 * @author wei.heng
    	 */
    	private void resetObjectProperties(Object data, KeyWordPatterns patterns) {
    
    		if(data == null){
    			return;
    		}
    
    		// 取需要过滤的关键字key
    		Set<String> keys = patterns.keySet();
    		Class<?> clazz = data.getClass().getSuperclass();
    		Field[] fields = clazz.getDeclaredFields();
    		for (int i = 0; i < fields.length; i++) {
    			Field field = fields[i];
    			field.setAccessible(true);
    			// 获取对象属性名称
    			String attributeName = field.getName();
    			// 获取对象属性类型
    			String simpleName = field.getType().getSimpleName();
    			try {
    				// 是否复杂数据对象
    				Object valObj = field.get(data);
    				if(isComplexType(simpleName)) {
    					// 如果是复杂数据对象,执行递归操作
    					resetObjectProperties(valObj, patterns);
    				};
    				// 不是字符串,不做过滤
    				if (!CAN_BE_MODIFY_TYPE.equals(simpleName)) {
    					continue;
    				}
    				// 不属于要过滤的字段,不做过滤
    				if (!keys.contains(attributeName)) {
    					continue;
    				}
    				// 前面已做过类型判断了,走到这里必须是String类型
    				String valStr = valObj.toString();
    				String pattern = patterns.get(attributeName);
    				String replacedStr = getReplacedString(pattern, valStr);
    
    				field.set(data, replacedStr);
    			} catch (IllegalAccessException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    	/**
    	 *
    	 * 
    	 * @param pattern 脱敏规则,如:3-6(第四个字符到第六个字符,进行模糊处理,替换为*号)
    	 * @param valStr 需要做脱敏处理的字符串
    	 * @return java.lang.String
    	 * @date 2020/12/25 13:59
    	 * @author wei.heng
    	 */
    	private String getReplacedString(String pattern, String valStr) {
    
    		// 是否符合脱敏规则
    		final String regexPattern = "\\d+-\\d+";
    		boolean isMatch = Pattern.matches(regexPattern, pattern);
    		if(!isMatch){
    			// 不符合规则,不进行匹配
    			log.error("脱敏规则配置异常:{}", pattern);
    			throw new UnsupportedKeyWordsPattern();
    		}
    		String[] patternArr = pattern.split("-");
    		int startIndex = Integer.parseInt(patternArr[0]);
    		int endIndex = Integer.parseInt(patternArr[1]);
    		if(startIndex > endIndex){
    			log.error("脱敏规则配置异常:{}", pattern);
    			throw new UnsupportedKeyWordsPattern();
    		}
    		int replaceLength = endIndex - startIndex;
    		String replaceStr = "*";
    		for (int j = 1; j < replaceLength; j++) {
    			replaceStr += REPLACE_CHAR;
    		}
    		return valStr.substring(0,startIndex) + replaceStr + valStr.substring(endIndex);
    	}
    
    	/**
    	 *
    	 * 是否复杂数据对象 - 该属性不是 int、byte、long、double、float、char、boolean、Decimal、String 类型
    	 * @param classSimpleName 数据类型
    	 * @date 2020/12/25 14:28
    	 * @author wei.heng
    	 */
    	public static boolean isComplexType(String classSimpleName) {
    		return !classSimpleName.equals("int") &&
    			!classSimpleName.equals("Integer") &&
    			!classSimpleName.equals("Byte") &&
    			!classSimpleName.equals("byte") &&
    			!classSimpleName.equals("Long") &&
    			!classSimpleName.equals("long") &&
    			!classSimpleName.equals("Double") &&
    			!classSimpleName.equals("double") &&
    			!classSimpleName.equals("Float") &&
    			!classSimpleName.equals("float") &&
    			!classSimpleName.equals("Character") &&
    			!classSimpleName.equals("char") &&
    			!classSimpleName.equals("Short") &&
    			!classSimpleName.equals("short") &&
    			!classSimpleName.equals("Boolean") &&
    			!classSimpleName.equals("boolean") &&
    			!classSimpleName.equals("BigDecimal") &&
    			!classSimpleName.equals("Date") &&
    			!classSimpleName.equals("String");
    	}
    
    //	public static void main(String[] args) {
    //
    //		// 测试场景1 - object:
    //		AppUser appUser = new AppUser() {{
    //			setIdNumber("500225198810010011");
    //		}};
    //		new KeyWordsFilterUtil().filter(appUser, new KeyWordPatterns() {{
    //			addPattern("idNumber", "3-16");
    //		}});
    //		System.out.println("replacedInfo:" + JSON.toJSONString(appUser));
    //		// replacedInfo:{"idNumber":"500*************11"}
    //
    //		// 测试场景2 - List:
    //		AppUser appUser2 = new AppUser() {{
    //			setIdNumber("511225198810010011");
    //		}};
    //		List<AppUser> objects = new ArrayList<>();
    //		objects.add(appUser);
    //		objects.add(appUser2);
    //		new KeyWordsFilterUtil().filter(objects, new KeyWordPatterns() {{
    //			addPattern("idNumber", "3-16");
    //		}});
    //		System.out.println("replacedInfo2:" + JSON.toJSONString(objects));
    //		// replacedInfo2:[{"idNumber":"500*************11"},{"idNumber":"511*************11"}]
    //
    //		// 测试场景3 - 复杂对象
    //		appUser.setGasStudent(new GasStudent(){{
    //			setIdCard("500660198810010011");
    //		}});
    //		new KeyWordsFilterUtil().filter(objects, new KeyWordPatterns() {{
    //			addPattern("idNumber", "3-16");
    //			addPattern("idCard", "4-15");
    //		}});
    //		System.out.println("replacedInfo3:" + JSON.toJSONString(objects));
    //		//replacedInfo3:[{"gasStudent":{"idCard":"5006***********011"},"idNumber":"500*************11","sex":0},{"idNumber":"511*************11","sex":0}]
    //
    //		// 测试场景4 - jsonObject
    //		JSONObject jsonObj = (JSONObject)JSONObject.toJSON(appUser);
    //		new KeyWordsFilterUtil().filter(jsonObj, new KeyWordPatterns() {{
    //			addPattern("idNumber", "3-16");
    //			addPattern("idCard", "4-15");
    //		}});
    //		System.out.println("replacedInfo jsonObj:" + JSON.toJSONString(jsonObj));
    //		// replacedInfo jsonObj:{"idNumber":"500*************11","gasStudent":{"idCard":"5006***********011"}}
    //
    //		// 测试场景3 - map:
    //		// 这个不测了,不推荐走map参数...
    //	}
    
    }
    
    
    展开全文
  • java 脱敏工具类

    2020-10-14 14:01:34
    public class SensitiveInfoUtil { /** * [中文姓名] 只显示第一个汉字,其他隐藏为星号<例子:李**> * * @param name 姓名 * @return */ public static String chineseName(String fullName) {...
    public class SensitiveInfoUtil {
    
    	/**
    	 * [中文姓名] 只显示第一个汉字,其他隐藏为星号<例子:李**>
    	 * 
    	 * @param name 姓名
    	 * @return
    	 */
    	public static String chineseName(String fullName) {
    		if (StringUtils.isBlank(fullName)) {
    			return "";
    		}
    		String name = StringUtils.left(fullName, 1);
    		return StringUtils.rightPad(name, StringUtils.length(fullName), "*");
    	}
    
    	/**
    	 * [中文姓名] 只显示姓氏,其他隐藏为星号<例子:欧阳娜娜 : 欧阳**>
    	 * 
    	 * @param familyName 姓氏
    	 * @param givenName  名字
    	 * @return
    	 */
    	public static String chineseName(String familyName, String givenName) {
    		if (StringUtils.isBlank(familyName) || StringUtils.isBlank(givenName)) {
    			return "";
    		}
    		if (familyName.length() > 1) {
    			String name = StringUtils.left(familyName, familyName.length());
    			return StringUtils.rightPad(name, StringUtils.length(familyName + givenName), "*");
    		}
    		return chineseName(familyName + givenName);
    	}
    
    	/**
    	 * [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>
    	 * 
    	 * @param id
    	 * @return
    	 */
    	public static String idCardNum(String id) {
    		if (StringUtils.isBlank(id)) {
    			return "";
    		}
    		String num = StringUtils.right(id, 4);
    		return StringUtils.leftPad(num, StringUtils.length(id), "*");
    	}
    
    	/**
    	 * [身份证号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:451002********1647>
    	 * 
    	 * @param carId
    	 * @return
    	 */
    	public static String idCard(String carId) {
    		if (StringUtils.isBlank(carId)) {
    			return "";
    		}
    		return StringUtils.left(carId, 6).concat(StringUtils.removeStart(
    				StringUtils.leftPad(StringUtils.right(carId, 4), StringUtils.length(carId), "*"), "******"));
    	}
    
    	/**
    	 * [固定电话] 后四位,其他隐藏<例子:****1234>
    	 * 
    	 * @param num
    	 * @return
    	 */
    	public static String fixedPhone(String num) {
    		if (StringUtils.isBlank(num)) {
    			return "";
    		}
    		return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");
    	}
    
    	/**
    	 * [手机号码] 前三位,后四位,其他隐藏<例子:138******1234>
    	 * 
    	 * @param num
    	 * @return
    	 */
    	public static String mobilePhone(String num) {
    		if (StringUtils.isBlank(num)) {
    			return "";
    		}
    		return StringUtils.left(num, 3).concat(StringUtils
    				.removeStart(StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*"), "***"));
    	}
    	
    	/**
    	 * [沃账户企业用户号] 前三位,后四位,其他隐藏<例子:301******1234>
    	 * 
    	 * @param num
    	 * @return
    	 */
    	public static String userId(String num) {
    		if (StringUtils.isBlank(num)) {
    			return "";
    		}
    		return StringUtils.left(num, 3).concat(StringUtils
    				.removeStart(StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*"), "***"));
    	}
    	
    	/**
    	 * [手机号码] 前三位,后两位,其他隐藏<例子:138********34>
    	 * 
    	 * @param num
    	 * @return
    	 */
    	public static String phoneNo(String num) {
    		if (StringUtils.isBlank(num)) {
    			return "";
    		}
    		return StringUtils.left(num, 3).concat(StringUtils
    				.removeStart(StringUtils.leftPad(StringUtils.right(num, 2), StringUtils.length(num), "*"), "***"));
    	}
    	
    
    	/**
    	 * [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护<例子:北京市海淀区****>
    	 * 
    	 * @param address
    	 * @param sensitiveSize 敏感信息长度
    	 * @return
    	 */
    	public static String address(String address, int sensitiveSize) {
    		if (StringUtils.isBlank(address)) {
    			return "";
    		}
    		int length = StringUtils.length(address);
    		return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");
    	}
    
    	/**
    	 * [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示<例子:g**@163.com>
    	 * 
    	 * @param email
    	 * @return
    	 */
    	public static String email(String email) {
    		if (StringUtils.isBlank(email)) {
    			return "";
    		}
    		int index = StringUtils.indexOf(email, "@");
    		if (index <= 1)
    			return email;
    		else
    			return StringUtils.rightPad(StringUtils.left(email, 1), index, "*")
    					.concat(StringUtils.mid(email, index, StringUtils.length(email)));
    	}
    
    	/**
    	 * [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:6222600**********1234>
    	 * 
    	 * @param cardNum
    	 * @return
    	 */
    	public static String bankCard(String cardNum) {
    		if (StringUtils.isBlank(cardNum)) {
    			return "";
    		}
    		return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(
    				StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));
    	}
    
    	/**
    	 * [公司开户银行联号] 公司开户银行联行号,显示前两位,其他用星号隐藏,每位1个星号<例子:12********>
    	 * 
    	 * @param code
    	 * @return
    	 */
    	public static String cnapsCode(String code) {
    		if (StringUtils.isBlank(code)) {
    			return "";
    		}
    		return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");
    	}
    }
    
    
    展开全文
  • Java 数据脱敏工具类

    2020-08-19 17:59:36
    数据脱敏工具类 DesensitizationUtils.java import org.apache.commons.lang3.StringUtils; import java.util.Objects; /** * 数据脱敏工具类 * * @Author: Neo * @Date: 2020/8/19 16:21 * @Version: 1.0 *...

    SensitiveInfoUtils.java

    import org.apache.commons.lang3.StringUtils;
    
    import java.util.Objects;
    
    /**
     * 数据脱敏工具类
     *
     * @Author: Neo
     * @Date: 2020/8/19 16:21
     * @Version: 1.0
     */
    public class SensitiveInfoUtils {
    
        /**
         * 默认填充字符
         */
        public static final String DEFAULT_PAD_STR = "*";
    
    
        /**
         * 数据脱敏
         * 当字符创为空串或字符串长度小于等于 2 时,直接返回
         * 当【字符串总长度】减 {@code leftLen} 减 {@code rightLen} 小于等于 【字符串总长度】的三分之一时,则左右各展示【字符串总长度】的三分之一
         *
         * @param data     需要脱敏的数据
         * @param leftLen  左边展示几位
         * @param rightLen 右边展示几位
         * @param padStr   填充字符串,如果长度为 1, 则按位填充;否则否则直接填充,可用于颜文字填充场景
         * @return
         */
        public static String process(String data, Integer leftLen, Integer rightLen, String padStr) {
            int length = StringUtils.length(data);
            if (StringUtils.isBlank(data) || length <= 2) {
                return data;
            }
    
            int oneThird = length / 3;
    
            // 设置默认值
            leftLen = Objects.isNull(leftLen) ? oneThird : leftLen;
            rightLen = Objects.isNull(rightLen) ? oneThird : rightLen;
            padStr = StringUtils.isBlank(padStr) ? DEFAULT_PAD_STR : padStr;
    
            if (length - leftLen - rightLen <= oneThird) {
                leftLen = oneThird;
                rightLen = oneThird;
            }
    
    
            String left = StringUtils.left(data, leftLen);
            String right = StringUtils.right(data, rightLen);
            if (StringUtils.length(padStr) == 1) {
                return StringUtils.rightPad(left, data.length() - rightLen, padStr).concat(right);
            }
            return left + padStr + right;
        }
    
        /**
         * 数据脱敏
         * 
         * @Author: Neo
         * @Date: 2020/8/19 16:59
         * @Version: 1.0
         */
        public static String process(String data, Integer leftLen, Integer rightLen) {
            return process(data, leftLen, rightLen, DEFAULT_PAD_STR);
        }
    
        /**
         * 证件号码脱敏,输出【前六后四】: 422824********8732
         *
         * @Author: Neo
         * @Date: 2020/8/19 16:23
         * @Version: 1.0
         */
        public static String idcard(String idcard) {
            return process(idcard, 6, 4);
        }
    
        public static void main(String[] args) {
            System.out.println(process("110101199003070513", 6, 4));
            System.out.println(process("1234567890", 6, 4));
            System.out.println(process("1234567890", 6, 4, "(*^▽^*)"));
        }
    }
    

    测试结果

    110101********0513
    123****890
    123(*^▽^*)890
    
    展开全文
  • Java 数据脱敏 工具类

    2019-05-13 17:19:00
    * 敏感信息屏蔽工具 */ public final class SensitiveInfoUtils { // private final static Logger logger = Logger.getLogger(SensitiveInfoUtils.class); /** * [中文姓名] 只显示第一个汉字...

    一、项目导入Apache的commons的Jar包。

      Jar包Maven下载地址:https://mvnrepository.com/artifact/org.apache.commons/commons-lang3

    package com.taiping.touming;
    
    import org.apache.commons.lang3.StringUtils;
     
    /* * 
     *    敏感信息屏蔽工具
     */
    public final class SensitiveInfoUtils {
     
    //    private final static Logger logger = Logger.getLogger(SensitiveInfoUtils.class);
        
        /**
         * [中文姓名] 只显示第一个汉字,其他隐藏为星号<例子:李**>
         * 
         * @param name 姓名
         * @return
         */
        public static String chineseName(String fullName) {
            if (StringUtils.isBlank(fullName)) {
                return "";
            }
            String name = StringUtils.left(fullName, 1);
            return StringUtils.rightPad(name, StringUtils.length(fullName), "*");
        }
     
        /**
         * [中文姓名] 只显示姓氏,其他隐藏为星号<例子:欧阳娜娜  : 欧阳**>
         * 
         * @param familyName  姓氏
         * @param givenName   名字
         * @return
         */
        public static String chineseName(String familyName, String givenName) {
            if (StringUtils.isBlank(familyName) || StringUtils.isBlank(givenName)) {
                return "";
            }
            if(familyName.length()>1){
                String name = StringUtils.left(familyName, familyName.length());
                return StringUtils.rightPad(name, StringUtils.length(familyName+givenName), "*");
            }
            return chineseName(familyName + givenName);
        }
     
        /**
         * [身份证号] 显示最后四位,其他隐藏。共计18位或者15位。<例子:*************5762>
         * 
         * @param id
         * @return
         */
        public static String idCardNum(String id) {
            if (StringUtils.isBlank(id)) {
                return "";
            }
            String num = StringUtils.right(id, 4);
            return StringUtils.leftPad(num, StringUtils.length(id), "*");
        }
        
        
        /**
         * [身份证号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:451002********1647>
         * 
         * @param carId
         * @return
         */
        public static String idCard(String carId){
             if (StringUtils.isBlank(carId)) {
                 return "";
             }
             return StringUtils.left(carId, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(carId, 4), StringUtils.length(carId), "*"), "******"));
        }
     
        /**
         * [固定电话] 后四位,其他隐藏<例子:****1234>
         * 
         * @param num
         * @return
         */
        public static String fixedPhone(String num) {
            if (StringUtils.isBlank(num)) {
                return "";
            }
            return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*");
        }
     
        /**
         * [手机号码] 前三位,后四位,其他隐藏<例子:138******1234>
         * 
         * @param num
         * @return
         */
        public static String mobilePhone(String num) {
            if (StringUtils.isBlank(num)) {
                return "";
            }
            return StringUtils.left(num, 3).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), "*"), "***"));
        }
     
        /**
         * [地址] 只显示到地区,不显示详细地址;我们要对个人信息增强保护<例子:北京市海淀区****>
         * 
         * @param address
         * @param sensitiveSize
         *            敏感信息长度
         * @return
         */
        public static String address(String address, int sensitiveSize) {
            if (StringUtils.isBlank(address)) {
                return "";
            }
            int length = StringUtils.length(address);
            return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");
        }
     
        /**
         * [电子邮箱] 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示<例子:g**@163.com>
         * 
         * @param email
         * @return
         */
        public static String email(String email) {
            if (StringUtils.isBlank(email)) {
                return "";
            }
            int index = StringUtils.indexOf(email, "@");
            if (index <= 1)
                return email;
            else
                return StringUtils.rightPad(StringUtils.left(email, 1), index, "*").concat(StringUtils.mid(email, index, StringUtils.length(email)));
        }
     
        /**
         * [银行卡号] 前六位,后四位,其他用星号隐藏每位1个星号<例子:6222600**********1234>
         * 
         * @param cardNum
         * @return
         */
        public static String bankCard(String cardNum) {
            if (StringUtils.isBlank(cardNum)) {
                return "";
            }
            return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), "*"), "******"));
        }
     
        /**
         * [公司开户银行联号] 公司开户银行联行号,显示前两位,其他用星号隐藏,每位1个星号<例子:12********>
         * 
         * @param code
         * @return
         */
        public static String cnapsCode(String code) {
            if (StringUtils.isBlank(code)) {
                return "";
            }
            return StringUtils.rightPad(StringUtils.left(code, 2), StringUtils.length(code), "*");
        }
     
    }

     

    转载于:https://www.cnblogs.com/sinosoft/p/10857788.html

    展开全文
  • package ... import org.apache.commons.lang3.StringUtils; /** * @author Thinking * @date 2019/12/10 10:23 * @description 数据脱敏工具类 */ public final class DesensitizationUtil { ...
  • Java字符串脱敏工具类

    千次阅读 2019-05-17 16:42:07
     Java工具类: import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.commons.io....
  • 脱敏工具类

    2020-11-17 14:01:38
    import java.util.regex.Matcher;... * 功能描述:脱敏工具类 * @Date 2020/11/17 **/ public class EncryptUtil { public static final String MOBILE_REG = "^\\d{11}$"; public static final Strin.
  • Java编程:常用的字段脱敏工具类

    千次阅读 2019-12-16 20:13:56
    import org.apache.commons.lang.StringUtils;...import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author zhibo * @date 2019-12-12 15:10 */ public class EncryptUtil { public s...
  • 信息脱敏工具类

    2021-01-13 16:11:51
    DesensitizationUtil.java ... * 通用脱敏工具类 * 可用于: * 用户名 * 手机号 * 邮箱 * 地址等 */ public class DesensitizationUtil { private static final int SIZE = 6; private static final String
  • package utils; import com.google.common.base.Charsets; import ... import java.io.File; import java.io.IOException; import java.util.List; import java.util.regex.Matcher; im...
  • 普通的基于工具类方法的方式,对代码的入侵性太强。编写起来又特别麻烦。 本项目提供基于注解的方式,并内置了常见的脱敏方式,便于开发。 用户也可以基于自己的实际需要,自定义注解。 日志脱敏 为了金融交易的安全...
  • 于是,就写了一个基于 java 注解的日志脱敏工具。项目介绍日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强。编写起来又特别麻烦。本项目提供基于注解的方式,并且内置了常见的脱敏方式,...
  • 这篇文章主要介绍了简单了解Java日志脱敏框架sensitive,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习...于是,就写了一个基于 java 注解的日志脱敏工具。项目介绍日志脱敏是常见的安全...
  • import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @description: * @author: *** * @create: 2019-10-04 */ public class Test { ... * 身份证号:年月日脱敏,前6后...
  • 在我们平时开发java企业项目,尤其是web项目时,返回给前端的数据中,许多敏感数据要进行脱敏处理,譬如手机号,银行卡号,身份证等,一般都会抽成一个util来处理脱敏逻辑,之前看过一篇【递归对JSONObject每一个...
  • java注解式脱敏

    2021-01-17 21:31:54
    java注解式脱敏简述代码讲解脱敏枚举类注解类编写脱敏工具类脱敏AOP的实现实战演练友情链接 简述 随着互联网时代普及,用户的信息越来越重要,我们开发软件过程中也需要对用户的信息进行脱敏处理活着加密处理,针对...
  • java 日志脱敏框架 sensitive,优雅的打印脱敏日志

    万次阅读 热门讨论 2019-01-03 11:05:56
    于是,就写了一个基于 java 注解的日志脱敏工具。 github sensitive 项目介绍 日志脱敏是常见的安全需求。普通的基于工具类方法的方式,对代码的入侵性太强。编写起来又特别麻烦。 本项目提供基于注解的方式,并且...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

java脱敏工具类

java 订阅