用户敏感信息掩码工具

金融行业开发不可避免的会涉及到用户的敏感信息,但是为了保护用户隐私,并且根据央行合规要求,不管是数据库日志还有页面都需要进行加密或者掩码,因此在这里分享一个掩码工具。

里面包括了,

/**
 * 手机号显示首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"));
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值