您的位置:

Hutool脱敏详解

在现代互联网应用中,随着大量敏感数据的处理,数据脱敏变得至关重要。Hutool作为一款Java工具类库,在不同的应用场景中都提供了全面的脱敏能力,便于开发人员神不知鬼不觉地解决敏感数据的处理问题。本文将介绍Hutool脱敏的功能和使用,以及对应的Java代码实现。

一、Hutool脱敏身份证

身份证号码是最常出现的敏感信息之一。脱敏身份证的需求很常见,因为在实际业务中身份证号码的真实性并不重要,重要的是保存数据的完整性和安全性。Hutool提供了默认的身份证脱敏策略,可以用于对身份证实现简单而高效的脱敏。

/**
 * 脱敏身份证测试
 */
@Test
public void testDesensitizeIdCard() {
    String idCard = "510124199306355456";
    String desensitizedIdCard = DesensitizedUtil.desensitizedIdCard(idCard);
    //输出结果为:510**********5456
    System.out.println(desensitizedIdCard);
}

上述代码中调用了Hutool提供的DesensitizedUtil类中的desensitizedIdCard()方法,该方法将会使用默认的身份证脱敏策略,返回对应的脱敏结果。

二、Hutool脱敏工具

除了身份证号码,其他类型的敏感数据通常没有特定的格式。对于这种情况,Hutool提供了通用的脱敏工具,可以根据数据类型对敏感数据进行脱敏。

/**
 * 脱敏工具测试
 */
@Test
public void testDesensitize() {
    String str = "15651234567";
    String email = "test@163.com";
    String idCard = "510124199306355456";
    String bankCard = "622202***********";
    String address = "四川省成都市高新区天府大道中段399号";
    String desensitizedStr = DesensitizedUtil.desensitized(SensitiveTypeEnum.MOBILE_PHONE, str);
    String desensitizedEmail = DesensitizedUtil.desensitized(SensitiveTypeEnum.EMAIL, email);
    String desensitizedIdCard = DesensitizedUtil.desensitized(SensitiveTypeEnum.ID_CARD, idCard);
    String desensitizedBankCard = DesensitizedUtil.desensitized(SensitiveTypeEnum.BANK_CARD, bankCard);
    String desensitizedAddress = DesensitizedUtil.desensitized(SensitiveTypeEnum.ADDRESS, address);
    //输出结果为:156****4567
    System.out.println(desensitizedStr);
    //输出结果为:t**t@163.com
    System.out.println(desensitizedEmail);
    //输出结果为:510**********5456
    System.out.println(desensitizedIdCard);
    //输出结果为:622202***********
    System.out.println(desensitizedBankCard);
    //输出结果为:四川省**********
    System.out.println(desensitizedAddress);
}

上述代码中调用了Hutool提供的DesensitizedUtil类中的desensitized()方法,并指定了对应的敏感数据类型和脱敏规则,返回对应的脱敏结果。

三、Hutool脱敏自定义

在实际应用过程中,数据的敏感程度和脱敏方式都有很大的差异。面对这种需求区别,Hutool提供了自定义脱敏策略的能力,根据不同的需求定义自己的脱敏规则。

/**
 * 自定义脱敏规则测试,脱敏姓名中间部分
 */
@Test
public void testCustomDesensitizer() {
    String name = "张三";
    DesensitizedUtil.addCustomDesensitizer("MyName", (data) -> {
        if (StringUtils.isBlank(data)) {
            return "default";
        }
        int len = data.length();
        if (len <= 2) {
            return data;
        } else {
            StringBuilder sb = new StringBuilder();
            sb.append(data.charAt(0));
            for (int i = 1; i < len - 1; i++) {
                sb.append("*");
            }
            sb.append(data.charAt(len - 1));
            return sb.toString();
        }
    });
    String desensitizedName = DesensitizedUtil.desensitized("MyName", name);
    //输出结果为:张*三
    System.out.println(desensitizedName);
}

上述代码中,我们自定义了一个名为"MyName"的脱敏规则,并按照自己的需求实现了该规则,然后利用Hutool提供的API进行了测试和验证。

四、Hutool脱敏还原

在某些场景下,需要将已脱敏的敏感数据还原为原始数据。Hutool提供了对应的API,可以方便地进行敏感数据还原。

/**
 * 脱敏数据还原测试
 */
@Test
public void testRecover() {
    String desensitizedStr = "156****4567";
    String desensitizedEmail = "t**t@163.com";
    String desensitizedIdCard = "510**********5456";
    String desensitizedBankCard = "622202***********";
    String desensitizedAddress = "四川省**********";
    String originalStr = DesensitizedUtil.recover(desensitizedStr);
    String originalEmail = DesensitizedUtil.recover(desensitizedEmail);
    String originalIdCard = DesensitizedUtil.recover(desensitizedIdCard);
    String originalBankCard = DesensitizedUtil.recover(desensitizedBankCard);
    String originalAddress = DesensitizedUtil.recover(desensitizedAddress);
    //输出结果为:15651234567
    System.out.println(originalStr);
    //输出结果为:test@163.com
    System.out.println(originalEmail);
    //输出结果为:510124199306355456
    System.out.println(originalIdCard);
    //输出结果为:622202***********
    System.out.println(originalBankCard);
    //输出结果为:四川省成都市高新区天府大道中段399号
    System.out.println(originalAddress);
}

上述代码中调用了Hutool提供的DesensitizedUtil类中的recover()方法,该方法将会使用默认的身份证脱敏策略,返回对应的原始数据。

五、Hutool数据脱敏选取

Hutool提供了多种脱敏方案,针对不同类型的数据,选择不同的脱敏方案可以让脱敏结果更加符合应用的实际需求。下面是Hutool支持的脱敏方案:

  • CHINESE_NAME:中文姓名
  • ID_CARD:身份证号码
  • FIXED_PHONE:固定电话
  • MOBILE_PHONE:手机号码
  • ADDRESS:地址
  • EMAIL:电子邮件
  • BANK_CARD:银行卡号码
  • CNAPS_CODE:中国银行联行号
  • DRIVING_LICENSE:机动车驾驶证号码
  • VEHICLE_LICENSE:机动车行驶证号码

根据不同的业务需求选择不同的脱敏方案可以使得敏感数据的安全处理更加科学和规范。