You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 11下ES256类型JWT正则添加排除项失败求助

解决Java 11中ES256 JWT正则误匹配及负向回溯失效问题

核心思路

ES256类型JWT有明确结构特征,可通过锁定Header的算法标识、签名段固定长度来减少误匹配;针对负向回溯失效问题,需用Java正则引擎支持的零宽度断言语法,精准排除包含指定关键词的内容。

优化后的正则表达式

(?<![A-Za-z0-9_-])(?!.*traceId)([A-Za-z0-9_-]*eyJhbGciOiJFUzI1Ni[A-Za-z0-9_-]*)\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]{86}(?![A-Za-z0-9_-])

规则拆解

  • (?<![A-Za-z0-9_-]):负向回溯断言,确保匹配的JWT前不是Base64URL字符,避免部分匹配
  • (?!.*traceId):负向预查断言,排除包含traceId的匹配项(可扩展为(?!.*(traceId|requestId))排除多关键词)
  • Header段:[A-Za-z0-9_-]*eyJhbGciOiJFUzI1Ni[A-Za-z0-9_-]*,锁定ES256算法的Base64URL编码核心片段(对应{"alg":"ES256"}的编码特征)
  • Payload段:[A-Za-z0-9_-]+,匹配任意合法Base64URL字符
  • 签名段:[A-Za-z0-9_-]{86},ES256签名为64字节,Base64URL无填充编码后固定86位,这是关键区分特征
  • (?![A-Za-z0-9_-]):正向预查断言,确保匹配的JWT后不是Base64URL字符,避免部分匹配

Java 11代码实现(日志掩码示例)

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Es256JwtMasker {
    public static void main(String[] args) {
        String logContent = "User authenticated with JWT: eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsIm5hbWUiOiJKb2huIERvZSJ9.7-MFhA-E8_Du637gW3gVbd6X79y4X8d4a9Z7x8y6W5v4U3t2S1r0Q-P-O-N-M-L-K-J-I-H-G-F-E-D-C-B-A\n"
                + "This line has traceId and should be ignored: traceId=abc123.xyz789.1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        
        System.out.println(maskEs256Jwt(logContent));
    }

    public static String maskEs256Jwt(String input) {
        String jwtRegex = "(?<![A-Za-z0-9_-])(?!.*traceId)([A-Za-z0-9_-]*eyJhbGciOiJFUzI1Ni[A-Za-z0-9_-]*)\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]{86}(?![A-Za-z0-9_-])";
        Pattern pattern = Pattern.compile(jwtRegex);
        Matcher matcher = pattern.matcher(input);

        return matcher.replaceAll(matchResult -> {
            // 保留Header前8位,其余段掩码处理
            String headerPrefix = matchResult.group(1).length() > 8 
                ? matchResult.group(1).substring(0, 8) + "****" 
                : "********";
            return headerPrefix + ".********.********";
        });
    }
}

常见问题修正

  1. 之前负向回溯失效:大概率是断言位置错误或使用了Java不支持的语法(如部分其他语言的负向语法)。Java仅支持(?<!...)(负向回溯)和(?!...)(负向预查),需确保断言放在匹配主体的正确位置。
  2. 兼容大小写场景:若日志中JWT编码存在大小写混合,可在编译正则时添加Pattern.CASE_INSENSITIVE标志。
  3. 签名长度例外:极少数库可能对签名做填充,若遇到此类情况,可将签名段规则调整为[A-Za-z0-9_-]{86,88}(兼容带1-2个填充符的场景)。

内容的提问来源于stack exchange,提问作者leonaugust

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 21:01:04