广丰卷烟厂数采质量分析系统
zhuguifei
2026-03-02 80ff784bf60637cd348ae665fc907f7b1e527dd8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package org.dromara.common.core.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();
        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);
    }
 
}