使用hutool和RSA256实现JWT Token签发与验证

21,484次阅读
没有评论

共计 3616 个字符,预计需要花费 10 分钟才能阅读完成。

在使用 JWT(JSON Web Token)进行用户认证和授权时,为了保障 Token 的安全性,我们通常会使用 RSA256 算法进行加密和签名。而 hutool 工具包则为我们提供了便捷的 API 来实现这一过程。

使用 hutool 和 RSA256 实现 JWT Token 签发与验证

1. 导入依赖

首先,我们需要将 hutool 的 maven 依赖导入到项目中:

      
    cn.hutool      
    hutool-all      
         最新版本        

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 验证失败");
        }
    }
}

注意事项

  1. 在实际生产环境中,私钥应当严格保密,只能由授权的服务端持有,用于签发 Token。

  2. 公钥可以公开给客户端,用于验证 Token 的签名。

  3. 签名和验证时,务必确保使用正确的私钥和公钥,否则会导致验证失败或安全问题。

通过以上步骤,我们成功地使用 hutool 和 RSA256 算法实现了 JWT Token 的签发与验证。在实际应用中,还需要考虑 Token 的过期时间、刷新机制等安全问题,确保系统的安全性。 文章来源地址 https://www.toymoban.com/diary/system/765.html

到此这篇关于使用 hutool 和 RSA256 实现 JWT Token 签发与验证的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!

原文地址:https://www.toymoban.com/diary/system/765.html

如若转载,请注明出处:如若内容造成侵权 / 违法违规 / 事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计3616字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)