数据脱敏工具类(包含手机号,银行卡号,邮箱,中文名称等)

本文介绍了一种用于保护个人隐私的脱敏处理方法,包括银行卡号、姓名、地址、电话号码和邮箱等敏感信息的处理策略。通过特定的算法,确保了数据的安全性和合规性。

针对客户一些敏感信息做脱敏特殊处理,直接上代码吧!

/**
 * @author harainye
 * @description 隐藏数据工具类
 * @date 2019年12月05日 11:20:35
 */
public class HideDataUtils {

    /**
     * [卡号] 前4位+********+后4位,其余隐藏为*号
     * <例子:6229**********1115>
     * @param cardNo 身份证号、银行卡号、证件编号
     * @return 小于等于8位的直接返回
     */
    public static String hideCarNo(String cardNo) {
        if (Utils.isEmpty(cardNo)) {
            return "";
        }
        if (cardNo.length() <= 8) {
            return cardNo;
        }
        int length = cardNo.length();
        return cardNo.substring(0, 4).concat(StringUtils.leftPad(cardNo.substring(cardNo.length() - 4), length - 4, "*"));
    }

    /**
     * [中文姓名] 只显示第一个汉字,其余隐藏为*号
     * <例子:何**>
     * @param name 中文姓名
     * @return
     */
    public static String chineseName (String name) {
        if (Utils.isEmpty(name)) {
            return "";
        }
        String showName = StringUtils.left(name, 1);
        return StringUtils.rightPad(showName, StringUtils.length(name), "*");
    }

    /**
     * [地址] 只显示前6个汉字,其余隐藏为*号
     * <例子:上海市浦东新****>
     * @param address 地址
     * @return 地址小于3位,直接返回;地址大于等于2小于等于6.隐藏前2位,其余隐藏为*号
     */
    public static String address (String address) {
        if (Utils.isEmpty(address)) {
            return "";
        }
        int length = address.length();
        if (length <= 2) {
            return address;
        }
        String showName = "";
        if (length >= 2 && length <= 6) {
            showName = StringUtils.left(address, 2);
            return StringUtils.rightPad(showName, StringUtils.length(address), "*");
        }
        showName = StringUtils.left(address, 6);
        return StringUtils.rightPad(showName, StringUtils.length(address), "*");
    }

    /**
     * [账户名称] 只显示前1个汉字,其余隐藏为*号
     * <例子:兴业银行股份有限公司 脱敏后显示为 兴*********>
     * @param acctName 地址
     * @return
     */
    public static String acctName (String acctName) {
        if (Utils.isEmpty(acctName)) {
            return "";
        }
        int length = acctName.length();
        String showName = StringUtils.left(acctName, 1);
        return StringUtils.rightPad(showName, length, "*");
    }

    /**
     * [手机号] 前3位+****+后4位,其余隐藏为*号
     * <例子:150****1115>
     * @param phoneNo 手机号
     * @return 小于等于8位的直接返回
     */
    public static String hidePhoneNo(String phoneNo) {

        if (Utils.isEmpty(phoneNo)) {
            return "";
        }
        if (phoneNo.length() <= 8) {
            return phoneNo;
        }
        int length = phoneNo.length();
        return phoneNo.substring(0, 3).concat(StringUtils.leftPad(phoneNo.substring(phoneNo.length() - 4), length - 4, "*"));
    }

    /**
     * 保留注册商,比如:qq.com
     *
     * @param email 邮箱
     * @return
     */
    public static String hideEmail(String email) {
        if (Utils.isEmpty(email)) {
            return "";
        }
        int index = StringUtils.indexOf(email, "@");
        int length = email.length();
        if (index <= 1) {
            return email;
        } else {
            String showName = StringUtils.left(email.substring(2, index), 0);
            return email.substring(0, 2).concat(StringUtils.rightPad(showName, index - 2, "*")).concat(StringUtils.mid(email, index, length));
        }
    }

    public static void main(String[] args) {
        String carNo = "35082312201111";
        String phoneNo = "1505912354";
        String emailNo = "15059121354@qq.com";
        System.out.println(hideCarNo(carNo));
        System.out.println(hidePhoneNo(phoneNo));
        System.out.println(hideEmail(emailNo));
        System.out.println(chineseName("张三"));
        System.out.println(address("上海市浦东新区来安路"));
        System.out.println(acctName("张三1"));
    }
}

PS:代码中Utils工具包请替换lang3包下的isEmpty方法。

<think>我们被要求编写一个Java工具,用于对多种数据型中的敏感信息进行脱敏处理。根据引用的内容,脱敏的常见数据型包括:中文名、身份证手机号、地址等。我们可以采用注解的方式标记需要脱敏的字段,然后在序列化时(如使用Jackson)进行脱敏处理,或者使用工具方法直接处理。设计思路:1.定义一个枚举型(SensitiveTypeEnum),列出需要脱敏数据型。2.定义一个注解(@Desensitized),用于标记字段,并指定脱敏型。3.创建一个脱敏工具(DesensitizedUtils),包含对不同数据型进行脱敏的具体方法。4.或者,结合Jackson序列化,通过自定义注解和序列化器实现脱敏(在序列化时自动处理)。这里我们提供两种方式:方式一:直接使用工具方法进行脱敏(适用于任何地方,不依赖序列化)方式二:使用Jackson自定义序列化器(适用于使用Jackson序列化的场景)我们先实现方式一:脱敏工具脱敏规则(参考常见做法):1.中文名:只显示第一个字,其余用*代替,例如:张**2.身份证:显示前1/3和后1/3,中间用*代替(或根据要求),例如:110***********123X3.手机号:显示前3位和后4位,中间用*代替,例如:138****12344.地址:只显示前几个字符,后面用*代替,例如:北京市海淀区****5.电子邮件:显示@符前面的第一个字符和最后一个字符,中间用***,以及@后面的内容,例如:a***@example.com6.银行卡:显示前6位和后4位,中间用*代替(通常前6位是发卡行标识,后4位便于识别)7.密码:全部用*代替具体实现:步骤1:定义枚举型SensitiveTypeEnum步骤2:编写工具DesensitizedUtils,提供静态方法,根据脱敏型和原始字符串进行脱敏处理。步骤3:还可以提供一个基于注解的处理器(如果需要对对象中的字段批量脱敏,可以利用反射,但注意反射可能影响性能)由于用户要求工具,我们先实现核心的脱敏方法,然后可以提供一个使用反射根据注解处理整个对象的方法(可选)。但是注意,引用的内容中提到了使用Jackson进行序列化时通过注解脱敏,这也是常见做法。我们可以同时提供这种方式,但用户明确要求工具,所以我们以工具方法为主。代码实现:1.枚举:SensitiveTypeEnum2.工具:DesensitizedUtils3.可选:基于反射的工具方法(这里先不实现,因为反射在工具中使用可能不是最佳实践,而且通常我们在序列化时处理更常见)下面我们编写代码:注意:由于这里只要求工具,所以重点放在DesensitizedUtils上。首先,我们定义枚举:</think> ### Java实现数据脱敏工具 以下是针对多种数据型的敏感信息脱敏工具实现方法: #### 1. 定义脱敏策略枚举 ```java public enum SensitiveType { CHINESE_NAME, // 中文姓名 ID_CARD, // 身份证 PHONE_NUMBER, // 手机号 ADDRESS, // 地址 EMAIL, // 电子邮箱 BANK_CARD, // 银行卡 PASSWORD // 密码 } ``` #### 2. 创建脱敏工具 ```java public class DataDesensitizer { /** * 通用脱敏方法 * @param value 原始数据 * @param type 脱敏型 * @return 脱敏后的数据 */ public static String desensitize(String value, SensitiveType type) { if (value == null || value.isEmpty()) { return value; } switch (type) { case CHINESE_NAME: return desensitizeChineseName(value); case ID_CARD: return desensitizeIdCard(value); case PHONE_NUMBER: return desensitizePhone(value); case ADDRESS: return desensitizeAddress(value); case EMAIL: return desensitizeEmail(value); case BANK_CARD: return desensitizeBankCard(value); case PASSWORD: return desensitizePassword(value); default: return generalDesensitize(value); } } // 中文姓名脱敏(显示首字) private static String desensitizeChineseName(String name) { if (name.length() <= 1) return name; return name.charAt(0) + "**"; } // 身份证脱敏(保留前3后4) private static String desensitizeIdCard(String idCard) { if (idCard.length() < 8) return "****"; return idCard.substring(0, 3) + "********" + idCard.substring(idCard.length() - 4); } // 手机号脱敏(保留前3后4) private static String desensitizePhone(String phone) { if (phone.length() != 11) return phone; return phone.substring(0, 3) + "****" + phone.substring(7); } // 地址脱敏(保留前5字符) private static String desensitizeAddress(String address) { if (address.length() <= 5) return "****"; return address.substring(0, 5) + "****"; } // 邮箱脱敏(保留@前1字符和域名) private static String desensitizeEmail(String email) { int atIndex = email.indexOf('@'); if (atIndex <= 1) return email; return email.charAt(0) + "***" + email.substring(atIndex); } // 银行卡脱敏(保留前4后4) private static String desensitizeBankCard(String card) { if (card.length() < 9) return "****"; return card.substring(0, 4) + "****" + card.substring(card.length() - 4); } // 密码脱敏(全替换) private static String desensitizePassword(String password) { return "********"; } // 通用脱敏(保留首尾各1字符) private static String generalDesensitize(String value) { if (value.length() <= 2) return "**"; return value.charAt(0) + "****" + value.charAt(value.length() - 1); } } ``` #### 3. 注解标记脱敏字段 ```java @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface SensitiveField { SensitiveType value() default SensitiveType.PHONE_NUMBER; } ``` #### 4. 实体应用示例 ```java public class User { @SensitiveField(SensitiveType.CHINESE_NAME) private String name; @SensitiveField(SensitiveType.PHONE_NUMBER) private String phone; @SensitiveField(SensitiveType.EMAIL) private String email; @SensitiveField(SensitiveType.ID_CARD) private String idCard; // 构造器/getters/setters省略 } ``` #### 5. 对象脱敏处理器 ```java public class DesensitizationUtil { public static void processSensitiveFields(Object object) { for (Field field : object.getClass().getDeclaredFields()) { SensitiveField sensitiveField = field.getAnnotation(SensitiveField.class); if (sensitiveField != null) { try { field.setAccessible(true); Object value = field.get(object); if (value instanceof String) { field.set(object, DataDesensitizer.desensitize((String)value, sensitiveField.value())); } } catch (IllegalAccessException e) { System.err.println("脱敏处理失败: " + e.getMessage()); } } } } } ``` #### 6. 使用示例 ```java public class Main { public static void main(String[] args) { // 1. 直接使用工具 System.out.println(DataDesensitizer.desensitize("13800138000", SensitiveType.PHONE_NUMBER)); // 输出: 138****8000 // 2. 对象字段脱敏 User user = new User("张三", "13800138000", "zhangsan@example.com", "110105199001011234"); DesensitizationUtil.processSensitiveFields(user); System.out.println(user.getPhone()); // 输出: 138****8000 System.out.println(user.getName()); // 输出: 张** } } ``` ### 关键设计要点 1. **统一接口**:提供通用`desensitize()`方法支持所有脱敏型 2. **开闭原则**:新增脱敏型只需扩展枚举和策略方法 3. **可扩展性**:支持注解标记实现自动脱敏 4. **边界处理**:包含空值、短字符串等异常情况处理 5. **灵活应用**:支持直接调用或结合注解反射处理 这种实现方式满足企业级数据脱敏需求,可通过自定义脱敏规则扩展功能,适用于日志打印、API响应等场景[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值