Hutool JWT 签名工具- JWTSignerUtil
# Hutool JWT 签名工具- JWTSignerUtil
介绍
JWT 的签名算法有很多,主要分为对称加密算法和非对称加密算法。Hutool 提供的 JWTSignerUtil
封装了常见的签名算法,简化了 JWT 签名器的创建和使用过程。算法定义在 SignAlgorithm
中,可以根据需求选择合适的签名算法。
# 常见签名算法
# 对称签名算法
- HS256 (HmacSHA256)
- HS384 (HmacSHA384)
- HS512 (HmacSHA512)
# 非对称签名算法
- RS256 (SHA256withRSA)
- RS384 (SHA384withRSA)
- RS512 (SHA512withRSA)
- ES256 (SHA256withECDSA)
- ES384 (SHA384withECDSA)
- ES512 (SHA512withECDSA)
# 依赖 BouncyCastle 的算法
- PS256 (SHA256WithRSA/PSS)
- PS384 (SHA384WithRSA/PSS)
- PS512 (SHA512WithRSA/PSS)
# 创建预定义算法签名器
Hutool 提供了一些常见算法的快捷方法来创建签名器。例如,创建 HS256 签名器的代码如下:
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;
public class JwtSignerUtilExample {
public static void main(String[] args) {
// 创建 HS256 签名器,参数为密钥(字节数组)
final JWTSigner signer = JWTSignerUtil.hs256("123456".getBytes());
// 使用签名器生成 JWT
JWT jwt = JWT.create().setSigner(signer);
// 打印生成的 JWT
System.out.println("Generated JWT: " + jwt.sign());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
关键点解析:
JWTSignerUtil.hs256(byte[] key)
:用于生成 HS256 签名器,密钥参数是必需的,且需要为字节数组类型。JWT.create().setSigner(signer)
:创建一个JWT
实例并设置签名器,使用此签名器对 JWT 进行签名。
# 创建自定义算法签名器
通过 JWTSignerUtil.createSigner
方法,可以动态创建指定算法的签名器。以 PS256 为例:
- 首先,确保引入 BouncyCastle 依赖:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk18on</artifactId>
<version>${bouncycastle.version}</version>
</dependency>
1
2
3
4
5
2
3
4
5
- 创建 PS256 签名器:
import cn.hutool.crypto.KeyUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;
import cn.hutool.crypto.AlgorithmUtil;
import java.security.KeyPair;
public class JwtSignerUtilExample {
public static void main(String[] args) {
// 算法 ID,PS256 是基于 RSA 的算法
String algorithmId = "ps256";
// 生成密钥对,用于签名和验证
KeyPair keyPair = KeyUtil.generateKeyPair(AlgorithmUtil.getAlgorithm(algorithmId));
// 创建自定义算法签名器
final JWTSigner signer = JWTSignerUtil.createSigner(algorithmId, keyPair);
// 使用签名器生成 JWT
JWT jwt = JWT.create().setSigner(signer);
// 打印生成的 JWT
System.out.println("Generated JWT: " + jwt.sign());
}
}
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
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
关键点解析:
JWTSignerUtil.createSigner(String algorithmId, KeyPair keyPair)
:动态创建签名器。algorithmId
是算法的标识,keyPair
是密钥对,适用于非对称加密算法。KeyUtil.generateKeyPair(String algorithm)
:根据算法生成密钥对。适用于 RSA、ECDSA 等非对称加密算法。
# 自行实现算法签名器
如果需要自定义算法,可以实现 JWTSigner
接口。该接口包含了签名和验证的通用方法,适合需要特殊加密算法的场景。
import cn.hutool.jwt.JWTSigner;
public class CustomJwtSigner implements JWTSigner {
@Override
public byte[] sign(byte[] header, byte[] payload) {
// 自定义签名逻辑
return new byte[0];
}
@Override
public boolean verify(byte[] header, byte[] payload, byte[] signature) {
// 自定义验证逻辑
return false;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
关键点解析:
- 实现
JWTSigner
接口后,需要定义签名和验证的具体逻辑,适用于自定义加密需求的场景。
总结
JWTSignerUtil
提供了多种签名算法的快捷创建方式,并支持根据需求自定义签名器。通过封装常用的对称和非对称加密算法,简化了 JWT 的签名和验证过程。在实际使用中,需根据应用场景选择合适的签名算法,同时注意密钥的管理和安全性。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08