From d8c9f1a06f9e50edc2846d38d87ec0068447f4ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=94=E7=BA=B2?= Date: Fri, 23 May 2025 16:19:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20DesensitizedUtil=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=8A=A4=E7=85=A7=E5=8F=B7=E7=A0=81=E8=84=B1=E6=95=8F=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20feat:=20DesensitizedUtil=E6=96=B0=E5=A2=9E=E7=A4=BE?= =?UTF-8?q?=E4=BC=9A=E4=BF=A1=E7=94=A8=E4=BB=A3=E7=A0=81=E8=84=B1=E6=95=8F?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/util/DesensitizedUtil.java | 40 +++++++++++++++++++ .../core/util/DesensitizedUtilTest.java | 19 ++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/DesensitizedUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/DesensitizedUtil.java index 3f51ed895..f2b1b8f49 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/DesensitizedUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/DesensitizedUtil.java @@ -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); + } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/DesensitizedUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/DesensitizedUtilTest.java index b6ada5ad2..139fad05b 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/DesensitizedUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/DesensitizedUtilTest.java @@ -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")); + } }