|
@@ -0,0 +1,54 @@
|
|
|
|
|
+package org.dromara.common.sensitive.utils;
|
|
|
|
|
+
|
|
|
|
|
+import cn.hutool.core.util.DesensitizedUtil;
|
|
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
|
|
+import lombok.AccessLevel;
|
|
|
|
|
+import lombok.NoArgsConstructor;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 脱敏工具类
|
|
|
|
|
+ *
|
|
|
|
|
+ * @author AprilWind
|
|
|
|
|
+ */
|
|
|
|
|
+@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();
|
|
|
|
|
+
|
|
|
|
|
+ // 总长度小于等于前后可见长度 → 全部掩码
|
|
|
|
|
+ if (len <= prefixVisible + suffixVisible) {
|
|
|
|
|
+ return StrUtil.repeat('*', len);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 可用长度 = 总长度 - 前后可见长度
|
|
|
|
|
+ int available = len - prefixVisible - suffixVisible;
|
|
|
|
|
+
|
|
|
|
|
+ // 中间掩码长度不能超过可用长度
|
|
|
|
|
+ int actualMaskLength = Math.min(maskLength, available);
|
|
|
|
|
+
|
|
|
|
|
+ // 剩余字符尽量显示在中间掩码旁
|
|
|
|
|
+ int remaining = available - actualMaskLength;
|
|
|
|
|
+ String middleChars = remaining > 0 ? value.substring(prefixVisible, prefixVisible + remaining) : "";
|
|
|
|
|
+ String middleMask = StrUtil.repeat('*', actualMaskLength);
|
|
|
|
|
+
|
|
|
|
|
+ String prefix = value.substring(0, prefixVisible);
|
|
|
|
|
+ String suffix = value.substring(len - suffixVisible);
|
|
|
|
|
+
|
|
|
|
|
+ return prefix + middleChars + middleMask + suffix;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|