在使用JWT(JSON Web Token)进行用户认证和授权时,为了保障Token的安全性,我们通常会使用RSA256算法进行加密和签名。而hutool工具包则为我们提供了便捷的API来实现这一过程。
1. 导入依赖
首先,我们需要将hutool的maven依赖导入到项目中:
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>最新版本</version> <!-- 请注意替换为最新版本号 --> </dependency>
2.生成RSA256公私钥对
我们先介绍下如何使用hutool生成RSA256公私钥对,代码如下:
@Test public void generateKeyPair() { String id = "rs256"; KeyPair keyPair = KeyUtil.generateKeyPair(AlgorithmUtil.getAlgorithm(id)); System.out.println(Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded()));//私钥 System.out.println(Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded()));//公钥 }
这里我们将生成的KeyPair分别使用了Base64编码处理了,这样便于我们存储。
3.实现JWT签发与验证
接下来我们用已经生成的RSA256公私钥对(Base64加密后的)来实现JWT的签发与验证,代码如下:
@Test public void test() { String id = "rs256"; String privateKey = "MIIC省略.....=="; String publicKey = "MIG省略...."; RSA rsa = SecureUtil.rsa(privateKey, publicKey); final JWTSigner signer = JWTSignerUtil.rs256(rsa.getPrivateKey()); final JWTSigner signer2 = JWTSignerUtil.rs256(rsa.getPublicKey()); // 生成token final String token = JWT.create() .setNotBefore(DateUtil.date()) .sign(signer); System.out.println(token); // 验证算法 JWTValidator.of(token).validateAlgorithm(signer2); // 解析token JWT jwt = JWTUtil.parseToken(token); System.out.println(jwt.getHeader()); System.out.println(jwt.getPayload()); }
切记需要注意签名用privateKey(私钥),验证用publicKey(公钥),千万别搞反了,不然会报错的。
完整参考示例
接下来,我们使用hutool来生成RSA256的公私钥对。生成后,为了便于存储和传输,我们会对密钥进行Base64编码。
import cn.hutool.core.date.DateUtil; import cn.hutool.jwt.JWT; import cn.hutool.jwt.JWTSigner; import cn.hutool.jwt.JWTSignerUtil; import cn.hutool.jwt.JWTUtil; import cn.hutool.jwt.JWTValidator; import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.asymmetric.RSA; import org.junit.Test; public class JwtTest { @Test public void testJwtSignAndValidate() { String privateKeyStr = "MIIC省略.....=="; // 从存储中获取私钥 String publicKeyStr = "MIG省略...."; // 从存储中获取公钥 RSA rsa = SecureUtil.rsa(privateKeyStr, publicKeyStr); // 签名使用私钥 JWTSigner signer = JWTSignerUtil.rs256(rsa.getPrivateKey()); // 签发Token String token = JWT.create() .setIssuer("发行人") .setSubject("主题") .setAudience("观众") .setExpiration(DateUtil.offsetDay(DateUtil.date(), 1)) // 设置过期时间 .sign(signer); System.out.println("Token: " + token); // 验证使用公钥 JWTValidator validator = JWTValidator.of(token); validator.setPublicKey(rsa.getPublicKey()); // 设置公钥用于验证签名 // 验证Token boolean isValid = validator.validate(); System.out.println("Token是否有效: " + isValid); if (isValid) { // 解析Token并获取其内容 JWT jwt = JWTUtil.parseToken(token); System.out.println("Token Header: " + jwt.getHeader()); System.out.println("Token Payload: " + jwt.getPayload()); } else { System.out.println("Token验证失败"); } } }
注意事项
在实际生产环境中,私钥应当严格保密,只能由授权的服务端持有,用于签发Token。
公钥可以公开给客户端,用于验证Token的签名。
签名和验证时,务必确保使用正确的私钥和公钥,否则会导致验证失败或安全问题。文章来源:https://www.toymoban.com/diary/system/765.html
通过以上步骤,我们成功地使用hutool和RSA256算法实现了JWT Token的签发与验证。在实际应用中,还需要考虑Token的过期时间、刷新机制等安全问题,确保系统的安全性。文章来源地址https://www.toymoban.com/diary/system/765.html
到此这篇关于使用hutool和RSA256实现JWT Token签发与验证的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!