Java敏感数据脱敏

2020-08-12  本文已影响0人  千年的心

1.背景

在编码中,我们经常会对手机号,身份证号等数据进行脱敏处理,保护用户隐私,提高系统安全性。这边文章提供了xx*****xx格式的脱敏处理代码,希望对各位有所帮助。

2. 实现

1.定义接口,方便使用其它方式扩展

/**
 * 脱敏接口定义
 *
 * @author lieber
 */
public interface IDesensitization {

    String REPLACE_CHAR = "*";

    /**
     * 脱敏
     *
     * @param str   待脱敏字符串
     * @param left  左边保留多少位
     * @param right 右边保留多少位
     * @return 脱敏结果,除左右外,其余字符将被替换为*
     */
    String around(String str, int left, int right);

    /**
     * 身份证号脱敏
     *
     * @param cardNum 身份证号码
     * @return 脱敏后身份证号码,形如510**********1232
     */
    String idCard(String cardNum);

    /**
     * 电话号码脱敏
     *
     * @param phone 电话号码
     * @return 脱敏后电话号码,形如152****1232
     */
    String phone(String phone);

}

2.默认提供一种实现

使用正则表达式,保留左右长度,替换中间为*

import com.yugioh.core.util.words.desensitization.IDesensitization;

/**
 * 默认脱敏实现
 *
 * @author lieber
 */
public class DefaultDesensitizationImpl implements IDesensitization {

    @Override
    public String around(String str, int left, int right) {
        if (str == null || (str.length() < left + right + 1)) {
            return str;
        }
        String regex = String.format("(?<=\\w{%d})\\w(?=\\w{%d})", left, right);
        return str.replaceAll(regex, REPLACE_CHAR);
    }

    @Override
    public String idCard(String cardNum) {
        return this.around(cardNum, 3, 4);
    }

    @Override
    public String phone(String phone) {
        return this.around(phone, 3, 4);
    }
}

3.使用

3.1静态工具类

/**
 * 文字脱敏工具类
 *
 * @author lieber
 */
public class WordsDesensitizationUtil {

    private static IDesensitization desensitization = new DefaultDesensitizationImpl();

    /**
     * 脱敏
     *
     * @param str   待脱敏字符串
     * @param left  左边保留多少位
     * @param right 右边保留多少位
     * @return 脱敏结果,除左右外,其余字符将被替换为*
     */
    public static String around(String str, int left, int right) {
        return desensitization.around(str, left, right);
    }

    /**
     * 身份证号脱敏
     *
     * @param cardNum 身份证号码
     * @return 脱敏后身份证号码,形如510**********1232
     */
    public static String idCard(String cardNum) {
        return desensitization.idCard(cardNum);
    }

    /**
     * 电话号码脱敏
     *
     * @param phone 电话号码
     * @return 脱敏后电话号码,形如152****1232
     */
    public static String phone(String phone) {
        return desensitization.phone(phone);
    }
}

3.1交给Spring管理

@Bean
public IDesensitization desensitization() {
    return new DefaultDesensitizationImpl();
}
上一篇下一篇

猜你喜欢

热点阅读