字符串脱敏两种方法比较哪个好?

方法一: 

package com.ifp.channel.enterprise.action;


import org.springframework.util.StringUtils;
import com.ifp.core.context.BlogicContext;
import com.ifp.core.data.DataList;
import com.ifp.core.data.DataMap;
import com.ifp.core.exception.BaseException;
import com.ifp.core.flow.action.AbstractAction;
/**
 * 数据字段脱敏
 * @author mlynet01
 *
 */
public class SetFieldDesensitization extends AbstractAction {

	@SuppressWarnings("rawtypes")
	@Override
	public int execute(BlogicContext context, DataMap confMap) throws BaseException {
		DataMap dataMap= context.getDataMap();
		DataList dataList = (DataList)dataMap.get("desensitizationFieldList");
		for(int i = 0;i<dataList.size();i++){
			DataMap dtMap = (DataMap) dataList.get(i);
			//certNo,contact_tel,mobile_phone,email
			//certNo,contactTel,mobilePhone,email
			String certNo=dtMap.getElementValue("certNo");//证件号码
			String contactTel=dtMap.getElementValue("contactTel");//联络电话号码
			String mobilePhone=dtMap.getElementValue("mobilePhone");//手提电话
			String email=dtMap.getElementValue("email");//邮箱
			//证件号码留前3位	留后3位
			certNo = stringIntercept(certNo,3,3);
			//联络电话号码留前3位	留后2位
			contactTel = stringIntercept(contactTel,3,2);
			//手提电话留前3位	留后2位
			mobilePhone = stringIntercept(mobilePhone,3,2);
			//邮箱@前两位屏蔽
			email = emailStringIntercept(email, 2);

			dtMap.setElementValue("certNo", certNo);
			dtMap.setElementValue("contactTel", contactTel);
			dtMap.setElementValue("mobilePhone", mobilePhone);
			dtMap.setElementValue("email", email);
		}
		return 0;
	}
	/**
	 * 对证件、电话脱敏
	 * 脱敏规则:保留字符串的前几位和后几位
	 * 如:str="123456789"; prefix=3;suffix=2;
	 * 脱敏后:123***89 
	 * @param str:原字符串
	 * @param prefix:保留前几位的位数
	 * @param suffix:保留后几位的位数
	 * @return
	 */
	public static String stringIntercept(String str,int prefix,int suffix){
		if(!(StringUtils.hasText(str))){
			str = "";
		}
		StringBuilder sbStr  = new StringBuilder(str);
		int num = sbStr.length()-prefix-suffix;
		if(num<1){
			return str;
		}
		StringBuilder sbx= new StringBuilder("");
		for(int i = 0;i<num;i++){
			sbx.append("*");
		}
		sbStr.replace(prefix, sbStr.length()-suffix, sbx.toString());
		return sbStr.toString();
	}
	/**
	 * 对邮箱脱敏
	 * 脱敏规则:对邮箱@符号前几位脱敏
	 * @param email:邮箱
	 * @param num :@符号前几位
	 * @return
	 */
	public static String emailStringIntercept(String email,int num){
		if(!(StringUtils.hasText(email))){
			email = "";
		}
		StringBuilder sbEmail= new StringBuilder(email);
		int index = sbEmail.indexOf("@");
		if(index==-1){
			return email;
		}
		if(index<=1){
			num=1;
		}
		StringBuilder sbx= new StringBuilder("");
		for(int i = 0;i<num;i++){
			sbx.append("*");
		}
		sbEmail.replace(index-num, index, sbx.toString());
		return sbEmail.toString();
	}


}

方法二:

package com.ifp.channel.enterprise.action;


import org.springframework.util.StringUtils;
import com.ifp.core.context.BlogicContext;
import com.ifp.core.data.DataList;
import com.ifp.core.data.DataMap;
import com.ifp.core.exception.BaseException;
import com.ifp.core.flow.action.AbstractAction;
/**
 * 数据字段脱敏
 * @author mlynet01
 *
 */
public class SetFieldDesensitization extends AbstractAction {

	@SuppressWarnings("rawtypes")
	@Override
	public int execute(BlogicContext context, DataMap confMap) throws BaseException {
		DataMap dataMap= context.getDataMap();
		DataList dataList = (DataList)dataMap.get("desensitizationFieldList");
		for(int i = 0;i<dataList.size();i++){
			DataMap dtMap = (DataMap) dataList.get(i);
			//一条数据脱敏
			oneDataDesensitization(dtMap);
		}
		return 0;
	}

	/**
	 * 一条数据脱敏
	 * @param dtMap
	 */
	@SuppressWarnings("rawtypes")
	private void oneDataDesensitization(DataMap dtMap) {
		//证件号脱敏
		String certNo=dtMap.getElementValue("certNo");
		certNoDesen(certNo);
		//联络电话号码脱敏
		String contactTel=dtMap.getElementValue("contactTel");//联络电话号码
		contactTelDesen(contactTel);
		//手提电话脱敏
		String mobilePhone=dtMap.getElementValue("mobilePhone");//手提电话
		mobilePhoneDesen(mobilePhone);
		//邮箱脱敏
		String email=dtMap.getElementValue("email");//邮箱
		emailDesen(email);
	}

	/**
	 * 证件号码留前3位	留后3位
	 * @param certNo
	 */
	private void certNoDesen(String certNo) {
		numberStringIntercept(certNo,3,3);
	}
	/**
	 * 联络电话号码 ,留前3位	留后2位
	 * @param contactTel
	 */
	private void contactTelDesen(String contactTel) {
		numberStringIntercept(contactTel,3,2);
	}
	/**
	 * 手提电话留前3位	留后2位
	 * @param contactTel
	 */
	private void mobilePhoneDesen(String mobilePhone) {
		numberStringIntercept(mobilePhone,3,3);
	}
	/**
	 * 邮箱@前两位屏蔽
	 * @param contactTel
	 */
	private void emailDesen(String email) {
		emailStringIntercept(email,2);
	}
	/**
	 *脱敏优化
	 * 对证件、电话脱敏
	 * 脱敏规则:保留字符串的前几位和后几位
	 * 如:str="123456789"; prefix=3;suffix=2;
	 * 脱敏后:123***89 
	 * @param str:原字符串
	 * @param prefix:保留前几位的位数
	 * @param suffix:保留后几位的位数
	 * @return
	 */
	public static String numberStringIntercept(String number,int prefix,int suffix){
		if(!(StringUtils.hasText(number))){
			return "";
		}
		//如果前缀和后缀之和等于字符串的位数那么返回改字符串
		int num = number.length()-prefix-suffix;
		if(num<1){
			return number;
		}
		StringBuilder sbNumber  = new StringBuilder();
		char[] numberArray = number.toCharArray();
		for(int i=0;i<numberArray.length;i++){
			//返回trrue就替换原有字符
			if(isReplaceNumberChar(i,prefix,suffix,number.length())){
				sbNumber.append('*');
			}else {
				//返回false就不替换
				sbNumber.append(numberArray[i]);
			}
		}
		return sbNumber.toString();
	}
	/**
	 * 对邮箱脱敏
	 * 脱敏规则:对邮箱@符号前几位脱敏
	 * @param email:邮箱
	 * @param num :@符号前几位
	 * @return
	 */
	public static  String emailStringIntercept(String email,int num){
		if(!(StringUtils.hasText(email))){
			return "";
		}
		int index = email.indexOf('@');
		//如果'@'前只有1位或者@开头的垃圾数据就返回原有的值
		if(index<=1){
			return email;
		}
		char[] emailArray = email.toCharArray();
		StringBuilder emailSb= new StringBuilder();
		for(int i=0;i<emailArray.length;i++){
			//在范围之内返回trrue就替换原有字符
			if(isReplaceEmailChar(i,index,num)) {
				emailSb.append('*');
			}else {	
				//在范围之外返回false就不替换
				emailSb.append(emailArray[i]);
			}	
		}
		return emailSb.toString();
	}


	/**
	 * 是否替换数字字符为'*'
	 * 前后缀保留判断
	 * @param i
	 * @param prefix
	 * @param suffix
	 * @param numLength
	 * @return
	 */
	private static  boolean isReplaceNumberChar(int i, int prefix, int suffix, int numLength) {
		//保留前缀
		if(i<prefix){
			return false;
		//保留后缀	
		}else if(i>numLength-suffix){
			return false;
		//中间部分打码	
		}else{
			return true;
		}
	}

	/**
	 * 是否替换邮件字母字符为'*'
	 * 邮箱字符替换判断
	 * @param c :字符下标
	 * @param index ‘@’的下标
	 * @param num 要替换‘@’的前几位
	 * @return true :替换,false:不替换
	 */
	private static  boolean isReplaceEmailChar(int c, int index, int num) {
		//当前下表小于index-num 返回原字符
		if(c<(index-num)){
			return false;
			//'@'之后保留
		}else if(c>index){
			return false; 
			//'@'的前num位
		}else {
			return true;
		}
	}

}

大神们可以留言比较!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从码农到码到成功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值