Просмотр исходного кода

Add 增加脱敏工具类支持灵活配置可见长度和掩码长度

Yue 1 неделя назад
Родитель
Сommit
e96ade9a4e

+ 87 - 0
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/core/utils/DesensitizedUtils.java

@@ -0,0 +1,87 @@
+package com.vber.common.core.utils;
+
+import cn.hutool.core.util.DesensitizedUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+/**
+ * 脱敏工具类
+ *
+ * @author Iwb
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class DesensitizedUtils extends DesensitizedUtil {
+
+    /**
+     * 灵活脱敏方法
+     *
+     * @param value         原始字符串
+     * @param prefixVisible 前面可见长度
+     * @param suffixVisible 后面可见长度
+     * @param maskLength    中间掩码长度(固定显示多少 *,如果总长度不足则自动缩减)
+     * @return 脱敏后字符串
+     */
+    public static String mask(String value, int prefixVisible, int suffixVisible, int maskLength) {
+        if (StrUtil.isBlank(value)) {
+            return value;
+        }
+
+        int len = value.length();
+        int prefixMaskLimit = prefixVisible + maskLength;
+        int fullLimit = prefixMaskLimit + suffixVisible;
+
+        // 规则 1:长度 <= 中间掩码长度 → 全掩码
+        if (len <= maskLength) {
+            return StrUtil.repeat('*', len);
+        }
+        String mask = StrUtil.repeat('*', maskLength);
+
+        // 规则 2:长度 <= 前缀 + 中间掩码
+        if (len <= prefixMaskLimit) {
+            return value.substring(0, len - maskLength) + mask;
+        }
+
+        String prefix = value.substring(0, prefixVisible);
+
+        // 规则 3:长度 <= 前缀 + 中间掩码 + 后缀
+        if (len <= fullLimit) {
+            int suffixLen = len - prefixMaskLimit;
+            return prefix + mask + value.substring(len - suffixLen);
+        }
+
+        // 规则 4:标准形态
+        return prefix + mask + value.substring(len - suffixVisible);
+    }
+
+    /**
+     * 高安全级别脱敏方法(Token / 私钥)
+     *
+     * @param value         原始字符串
+     * @param prefixVisible 前面可见长度(推荐0~4)
+     * @param suffixVisible 后面可见长度(推荐0~4)
+     * @return 脱敏后字符串
+     */
+    public static String maskHighSecurity(String value, int prefixVisible, int suffixVisible) {
+        if (StrUtil.isBlank(value)) {
+            return value;
+        }
+        int len = value.length();
+
+        // 规则1:长度 <= 前缀可见长度 → 全部掩码
+        if (len <= prefixVisible) {
+            return StrUtil.repeat('*', len);
+        }
+
+        // 规则2:长度 <= 前缀 + 后缀可见长度 → 优先掩码后面
+        if (len <= prefixVisible + suffixVisible) {
+            return value.substring(0, len - prefixVisible) + StrUtil.repeat('*', prefixVisible);
+        }
+
+        // 规则3:标准形态 → 前后可见,中间全部掩码
+        return value.substring(0, prefixVisible)
+                + StrUtil.repeat('*', len - prefixVisible - suffixVisible)
+                + value.substring(len - suffixVisible);
+    }
+
+}

+ 14 - 1
SERVER/VberAdminPlusV3/vber-common/vber-common-core/src/main/java/com/vber/common/sensitive/core/SensitiveStrategy.java

@@ -6,6 +6,8 @@ import lombok.AllArgsConstructor;
 
 import java.util.function.Function;
 
+import com.vber.common.core.utils.DesensitizedUtils;
+
 /**
  * 脱敏策略
  *
@@ -79,6 +81,17 @@ public enum SensitiveStrategy {
      * 只显示第一个字符
      */
     FIRST_MASK(DesensitizedUtil::firstMask),
+    /**
+     * 通用字符串脱敏
+     * 可配置前后可见长度和中间掩码长度
+     * 默认示例:前4位可见,后4位可见,中间固定4个*
+     */
+    STRING_MASK(s -> DesensitizedUtils.mask(s, 4, 4, 4)),
+
+    /**
+     * 高安全级别脱敏(Token / 私钥):前2位可见,后2位可见,中间全部掩码
+     */
+    MASK_HIGH_SECURITY(s -> DesensitizedUtils.maskHighSecurity(s, 2, 2)),
 
     /**
      * 清空为""
@@ -90,7 +103,7 @@ public enum SensitiveStrategy {
      */
     CLEAR_TO_NULL(s -> DesensitizedUtil.clearToNull());
 
-    //可自行添加其他脱敏策略
+    // 可自行添加其他脱敏策略
 
     private final Function<String, String> desensitizer;