!1347 feat: DesensitizedUtil新增护照号码脱敏功能

Merge pull request !1347 from konggang/v5-dev
This commit is contained in:
Looly 2025-05-23 13:36:41 +00:00 committed by Gitee
commit 8f0777eadd
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
2 changed files with 58 additions and 1 deletions

View File

@ -75,6 +75,14 @@ public class DesensitizedUtil {
* IPv6地址
*/
IPV6,
/**
* 护照号
*/
PASSPORT,
/**
* 统一社会信用代码
*/
CREDIT_CODE,
/**
* 定义了一个first_mask的规则只显示第一个字符
*/
@ -153,6 +161,12 @@ public class DesensitizedUtil {
case IPV6:
newStr = ipv6(String.valueOf(str));
break;
case PASSPORT:
newStr = passport(String.valueOf(str));
break;
case CREDIT_CODE:
newStr = creditCode(String.valueOf(str));
break;
case FIRST_MASK:
newStr = firstMask(String.valueOf(str));
break;
@ -397,4 +411,30 @@ public class DesensitizedUtil {
public static String ipv6(String ipv6) {
return StrUtil.subBefore(ipv6, ':', false) + ":*:*:*:*:*:*:*";
}
/**
* 护照号脱敏
* 规则前2后2长度不足时保留最小有效信息
* 示例PJ1234567 PJ*****67
*/
public static String passport(String passport) {
if (StrUtil.isBlank(passport)) return passport;
final int length = passport.length();
if (length <= 2) return StrUtil.hide(passport, 0, length);
return StrUtil.hide(passport, 2, length - 2);
}
/**
* 统一社会信用代码脱敏
* 规则前4后4长度不足时保留最小有效信息
* 统一社会信用代码由18位数字或大写英文字母组成
* 示例91110108MA01ABCDE7 9111**********CDE7
*
*/
public static String creditCode(String code) {
if (StrUtil.isBlank(code)) return code;
final int length = code.length();
if (length <= 4) return StrUtil.hide(code, 0, length);
return StrUtil.hide(code, 4, length - 4);
}
}

View File

@ -1,8 +1,10 @@
package cn.hutool.core.util;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
/**
* 脱敏工具类 DesensitizedUtils 安全测试
*
@ -102,4 +104,19 @@ public class DesensitizedUtilTest {
assertEquals("1234 **** **** **** 678", DesensitizedUtil.bankCard("1234 2222 3333 4444 678"));
}
@Test
public void passportTest(){
assertEquals(null, DesensitizedUtil.passport(null));
assertEquals("", DesensitizedUtil.passport(""));
assertEquals("EM*****67", DesensitizedUtil.passport("EM1234567"));
assertEquals("*", DesensitizedUtil.passport("3"));
}
@Test
public void creditCodeTest(){
assertEquals(null, DesensitizedUtil.creditCode(null));
assertEquals("", DesensitizedUtil.creditCode(""));
assertEquals("9111**********CDE7", DesensitizedUtil.creditCode("91110108MA01ABCDE7"));
}
}