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
相关产品推荐
相关产品推荐

