JJWT 使用ES256签名算法

JWT使用最多的是用HS256签名算法,所以文档比较多,在此记录一下使用ES256签名算法时遇到的问题。

背景

使用自己的私钥对jwt需要的header和claim进行签名,有两个小点需要注意:一是hash算法,所以必须要保证字符串的顺序;二是ES256Key的生成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static String getJWTToken() {

SignatureAlgorithm al = SignatureAlgorithm.ES256;
long nowMillis = System.currentTimeMillis() / 1000;//生成JWT的时间
Map<String,Object> claims = new HashMap<>();
claims.put("iss", teamId);
claims.put("iat", nowMillis);

byte[] bytes = Base64.getDecoder().decode(authKey);
try {
PrivateKey privateKey = KeyFactory.getInstance("EC").generatePrivate(new PKCS8EncodedKeySpec(bytes));
JwtBuilder builder = Jwts.builder()
.setHeaderParam("alg", "ES256")
.setHeaderParam("kid", authKeyId)
.setClaims(claims)
.signWith(privateKey, al);
return builder.compact();
} catch (Exception e) {
e.printStackTrace();
return null;
}

}

authKey是私钥,使用的是jjwt库(https://github.com/jwtk/jjwt)