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

Java中使用JJWT生成JWE时找不到encryptWith方法的问题咨询

JJWT生成JWE时找不到encryptWith方法的解决方案

问题根源

你当前的依赖缺少了JJWT的JWE功能模块。在JJWT 0.11.x版本中,JWE相关的实现被拆分到单独的jjwt-jwe模块里,仅引入jjwt-api、jjwt-impl和jjwt-jackson不足以支持JWE加密功能。

修复依赖配置

在你的依赖中添加jjwt-jwe模块,更新后的依赖如下:

implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jwe:0.11.5'

替换为JWE生成代码

JWE是对整个JWT进行加密,不再需要signWith方法,而是使用encryptWith。你需要准备一个符合加密算法要求的密钥(比如AES-256需要256位的密钥),示例代码如下:

首先,添加一个生成加密密钥的方法:

import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;

private SecretKey getEncryptionKey() {
    // 生产环境中密钥应从安全配置中心读取,禁止硬编码
    // AES-256需要32字节(256位)的密钥
    String secret = "your-32-byte-long-secret-key-here-12345678";
    return Keys.hmacShaKeyFor(secret.getBytes());
}

然后修改原有的Token生成代码,替换为JWE逻辑:

import io.jsonwebtoken.EncryptionAlgorithm;

String token = Jwts.builder()
        .setClaims(claims)
        .setIssuer(jwtIssuer)
        .setIssuedAt(Date.from(currentTime.atZone(ZoneId.systemDefault()).toInstant()))
        .setExpiration(Date.from(currentTime.plusMinutes(accessTokenExpiryMin).atZone(ZoneId.systemDefault()).toInstant()))
        .encryptWith(getEncryptionKey(), EncryptionAlgorithm.AES_256_GCM)
        .compact();

注意事项

  • 加密算法要和密钥长度匹配:比如AES_256_GCM需要256位(32字节)的密钥,AES_128_GCM需要128位(16字节)的密钥。
  • 生产环境中绝对不能硬编码密钥,应使用安全的密钥管理方案(如环境变量、专业密钥管理服务)。
  • JWE生成的Token是加密后的,只有持有密钥的接收方能解密获取Claims信息,相比JWS的签名验证,安全性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:17:04