金融行业开发不可避免的会涉及到用户的敏感信息,但是为了保护用户隐私,并且根据央行合规要求,不管是数据库、日志还有页面都需要进行加密或者掩码,因此在这里分享一个掩码工具。
里面包括了,
/**
* 手机号显示首3末4位,中间用*号隐藏代替,如:138****4213
*/
/**
* 电话号码显示区号及末4位,中间用*号隐藏代替,如:010****4213
*/
/**
* 身份证号显示首6末4位,中间用4个*号隐藏代替,如:421002****1012
*/
/**
* 银行卡显示首6末4位,中间用4个*号隐藏代替,如:622202****4123
*/
/**
* 邮箱像是前两位及最后一位字符,及@后邮箱域名信息,如:ye****y@163.com
*/
/**
* 三个字掩码,如:张晓明 如:张*明
* 两个字掩码,如:小明 如:*明
* 多个字掩码,如:张小明明 如:张**明
*/
/**
* Cvv全隐藏,如: ***
*/
/**
* Expdate全隐藏,如: ****
*/
/**
* 类名称: DisplayUtil <br>
* 类描述: 敏感信息掩码规则<br>
*
* @author: hua.jin
* @since: 2018/1/8 下午4:18
* @version: 1.0.0
*/
public class DisplayUtil {
/**
* 手机号显示首3末4位,中间用*号隐藏代替,如:138****4213
*
* @param mobile
* @return
*/
public static String displayMobile(String mobile) {
if(StringUtils.isBlank(mobile) || mobile.length() <= 8) {
return mobile;
}
return wordMask(mobile, 3, 4, "*");
}
/**
* 电话号码显示区号及末4位,中间用*号隐藏代替,如:010****4213
*
* @param telephone
* @return
*/
public static String displayTelephone(String telephone) {
if(StringUtils.isBlank(telephone)) {
return telephone;
}
String result;
if (telephone.length() > 8) {
if (telephone.contains("-")) {
String[] temp = telephone.split("-");
result = temp[0] + "****" + temp[1].substring(temp[1].length() - 4, temp[1].length());
} else {
result = telephone.substring(0, 3) + "****" + telephone.substring(telephone.length() - 4, telephone.length());
}
} else {
result = "****" + telephone.substring(telephone.length() - 4, telephone.length());
}
return result;
}
/**
* 身份证号显示首6末4位,中间用4个*号隐藏代替,如:421002****1012
*
* @param idCard
* @return
*/
public static String displayIDCard(String idCard) {
if(StringUtils.isBlank(idCard)) {
return idCard;
}
return wordMask(idCard, 6, 4, "*");
}
/**
* 银行卡显示首6末4位,中间用4个*号隐藏代替,如:622202****4123
*
* @param cardNo
* @return
*/
public static String displayBankCard(String cardNo) {
if(StringUtils.isBlank(cardNo) || cardNo.length() < 10) {
return cardNo;
}
return wordMask(cardNo, 6, 4, "*");
}
/**
* 邮箱像是前两位及最后一位字符,及@后邮箱域名信息,如:ye****y@163.com
*
* @param email
* @return
*/
public static String displayEmail(String email) {
if(StringUtils.isBlank(email)) {
return email;
}
String[] temp = email.split("@");
return wordMask(temp[0], 1, 1, "*") + "@" + temp[1];
}
/**
* 三个字掩码,如:张晓明 如:张*明
* 两个字掩码,如:小明 如:*明
* 多个字掩码,如:张小明明 如:张**明
*
* @param name
* @return
*/
public static String displayName(String name) {
if(StringUtils.isBlank(name) || name.length() == 1) {
return name;
}
if (name.length() == 2) {
return "*" + name.substring(1, 2);
}
return wordMask(name, 1, 1, "*");
}
/**
* Cvv全隐藏,如: ***
*
* @param cvv
* @return
*/
public static String displayCvv(String cvv) {
if(StringUtils.isBlank(cvv)) {
return cvv;
}
return "***";
}
/**
* Expdate全隐藏,如: ****
*
* @param expdate
* @return
*/
public static String displayExpdate(String expdate) {
if(StringUtils.isBlank(expdate)) {
return expdate;
}
return "****";
}
/**
* 对字符串进行脱敏处理 --
*
* @param word 被脱敏的字符
* @param startLength 被保留的开始长度 前余n位
* @param endLength 被保留的结束长度 后余n位
* @param pad 填充字符
* */
public static String wordMask(String word,int startLength ,int endLength,String pad) {
if (startLength + endLength > word.length()) {
return org.apache.commons.lang3.StringUtils.leftPad("", word.length() - 1, pad);
}
String startStr = word.substring(0, startLength);
String endStr = word.substring(word.length() - endLength, word.length());
return startStr + org.apache.commons.lang3.StringUtils.leftPad("", word.length() - startLength - endLength, pad) + endStr;
}
public static void main(String[] args) {
System.out.println(displayMobile("13731999701"));
System.out.println(displayName("小华华华"));
System.out.println(displayName("小华华"));
System.out.println(displayName("小华"));
System.out.println(displayName("华"));
System.out.println(displayEmail("ff@123.com"));
System.out.println(displayEmail("fadc@123.com"));
}
}