java对银行卡号、手机号码、身份证号码进行脱敏

package com.yt.eos.common.utils;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;

/**
 * 日志辅助类,用来处理敏感信息,进行脱敏
 * @author tyg
 * @date   2018年5月5日下午4:01:22
 */
public class PrivacyUtil {

	//银行账户:显示前六后四,范例:622848******4568
	public static String encryptBankAcct(String bankAcct) {
		if (bankAcct == null) {
			return "";
		}
		return replaceBetween(bankAcct, 6, bankAcct.length() - 4, null);
	}

	//身份证号码:显示前六后四,范例:110601********2015
	public static String encryptIdCard(String idCard) {
		if (idCard == null) {
			return "";
		}
		return replaceBetween(idCard, 6, idCard.length() - 4, null);
	}

	//客户email:显示前二后四,范例:[email protected]
	public static String encryptEmail(String email) {
		//判断是否为邮箱地址
		if (email == null || !Pattern.matches(PatternUtil.EMAIL_REG, email)) {
			return "";
		}

		StringBuilder sb = new StringBuilder(email);
		//邮箱账号名只显示前两位
		int at_position = sb.indexOf("@");
		if (at_position > 2) {
			sb.replace(2, at_position, StringUtils.repeat("x", at_position - 2));
		}
		//邮箱域名隐藏
		int period_position = sb.lastIndexOf(".");
		sb.replace(at_position + 1, period_position, StringUtils.repeat("x", period_position - at_position - 1));
		return sb.toString();
	}

	//手机:显示前三后四,范例:189****3684
	public static String encryptPhoneNo(String phoneNo) {
		if (phoneNo == null) {
			return "";
		}
		return replaceBetween(phoneNo, 3, phoneNo.length() - 4, null);
	}

	/**
	 * @param object 待处理对象
	 * @param fieldNames 需要处理的属性
	 * @return 
	 * 将对象转换为字符串,并对敏感信息进行处理
	 */
	public static String encryptSensitiveInfo(Object object, String[] fieldNames) {
		return encryptSensitiveInfo(object, fieldNames, null);
	}

	/**
	 * @param object 待处理对象
	 * @param fieldNames 需要处理的属性
	 * @param excludes 不需要显示的属性
	 * @return 
	 * 将对象转换为字符串,并对敏感信息进行处理
	 */
	public static String encryptSensitiveInfo(Object object, String[] fieldNames, String[] excludes) {
		if (fieldNames == null) {
			fieldNames = new String[0];
		}
		//合并数组
		Set<String> set = new HashSet<String>(Arrays.asList(fieldNames));
		if (excludes != null) {
			for (int i = 0; i < excludes.length; i++) {
				set.add(excludes[i]);
			}
		}
		//将对象转换为字符串
		String str = ReflectionToStringBuilder.toStringExclude(object, set.toArray(new String[0]));

		//处理敏感信息
		StringBuilder sb = new StringBuilder(str);
		sb.deleteCharAt(sb.length() - 1);
		for (int i = 0; i < fieldNames.length; i++) {
			String fieldName = fieldNames[i];
			try {
				Field f = object.getClass().getDeclaredField(fieldName);
				f.setAccessible(true);
				String value = encryptSensitiveInfo(String.valueOf(f.get(object)));
				if (i != 0 || sb.charAt(sb.length() - 1) != '[') {
					sb.append(",");
				}
				sb.append(fieldName).append("=").append(value);
			} catch (Exception e) {
			}
		}
		sb.append("]");
		str = sb.toString();
		return str;
	}

	/**
	 * 对敏感信息进行处理。使用正则表达式判断使用哪种规则
	 * @param sourceStr 需要处理的敏感信息
	 * @return
	 * @return String
	 * @author tyg
	 * @date   2018年5月5日下午3:59:28
	 */
	public static String encryptSensitiveInfo(String sourceStr) {
		if (sourceStr == null) {
			return "";
		}
		if (Pattern.matches(PatternUtil.PHONE_REG, sourceStr)) {
			return encryptPhoneNo(sourceStr);
		} else if (Pattern.matches(PatternUtil.EMAIL_REG, sourceStr)) {
			return encryptEmail(sourceStr);
		} else if (Pattern.matches(PatternUtil.BANK_CARD_NUMBER, sourceStr)) {
			return encryptBankAcct(sourceStr);
		} else if (Pattern.matches(PatternUtil.ID_CARD, sourceStr)) {
			return encryptIdCard(sourceStr);
		} else {
			return sourceStr;
		}
	}

	/**
	 * 将字符串开始位置到结束位置之间的字符用指定字符替换
	 * @param sourceStr 待处理字符串
	 * @param begin	开始位置
	 * @param end	结束位置
	 * @param replacement 替换字符
	 * @return 
	 */
	private static String replaceBetween(String sourceStr, int begin, int end, String replacement) {
		if (sourceStr == null) {
			return "";
		}
		if (replacement == null) {
			replacement = "*";
		}
		int replaceLength = end - begin;
		if (StringUtils.isNotBlank(sourceStr) && replaceLength > 0) {
			StringBuilder sb = new StringBuilder(sourceStr);
			sb.replace(begin, end, StringUtils.repeat(replacement, replaceLength));
			return sb.toString();
		} else {
			return sourceStr;
		}
	}

	public static void main(String[] args) {
		System.out.println(PrivacyUtil.encryptBankAcct("6228482462893085616"));//622848*********5616
		System.out.println(PrivacyUtil.encryptPhoneNo("13228116626"));//132****6626
		System.out.println(PrivacyUtil.encryptCreditCardNo("622918008692044"));//622918*****2044
		System.out.println(PrivacyUtil.encryptIdCard("510658199107356847"));//510658********6847
		System.out.println(PrivacyUtil.encryptEmail("[email protected]"));//[email protected]
		System.out.println(PrivacyUtil.encryptSensitiveInfo("13228116626"));//
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_26365837/article/details/89926487