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

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

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

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

注意事项

  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

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

领支付宝红包 赞助服务器费用
VSCode中执行PNPM提示无法加载脚本文件的解决办法,Unable to load file pnpm.ps1
上一篇 2024年04月27日 09:29
好用免费开源的 IDE、数据库管理工具、SSH客户端和FTP客户端推荐大全
下一篇 2024年05月07日 10:01

相关文章

  • 使用JWT生成token实现权限验证

            点击登录按钮,后端验证账号密码是否通过,如果通过则生成token,把token发送给前端,前端保存到cookie(前后端分离是不能使用保存session,因为每次发送ajax请求响应后都会断开服务器,就会导致session生命周期就销毁掉,然后再发送请求时再重新连接服务器,s

    2023年04月08日
    浏览(15)
  • 封装hutool工具生成JWT token

    这一步非常重要,否则部署项目会发生JCE cannot authenticate the provider BC BouncyCastle类是一个加密的第三方类,关闭它使用jdk自带的加密算法 GlobalBouncyCastleProvider.setUseBouncyCastle(false);

    2024年02月15日
    浏览(35)
  • SpringBoot集成JWT token实现权限验证

    先在pom中引入 JWT依赖 然后引入一个生成的 token 的工具类         然后具体实现上有两种方式,一个是使用自定义注解配合拦截器,另外一个是使用拦截器。 方法一:         先自定义个注解,然后再定义一个自定义拦截器 JwtInterceptor 类,同时让 JwtInterceptor 类继承

    2024年02月10日
    浏览(18)
  • 【SpringBoot】1、SpringBoot整合JWT实现Token验证

    单点登录(Single Sign On), 简称为 SSO , 是目前比较流行的企业业务整合的解决方案之一. SSO的定义:在多个应用系统中, 用户只需要登录一次就可以访问所有相互信任的应用系统, 企业间需要相互授信 众所皆知, HTTP是 无状态的协议 , 这意味着 服务器无法确认用户的信息。 于是乎,

    2024年02月03日
    浏览(23)
  • Springboot实现websocket(连接前jwt验证token)

    用户连接服务器weksocket前,需经过jwt的token验证(token中包含账号信息),验证合法后,才可以于服务器正常交互。 一、配置依赖(pom.xml) 二、因为springboot的websocket连接时不会显示header信息,也就无法拿到cookie中的token信息,需要在连接前处理,新建一个WebSocketConfig.class,在

    2024年02月03日
    浏览(33)
  • SpringBoot(九)jwt + 拦截器实现token验证

        前面两篇文章的过滤器和拦截器,我们都提到过可以做诸如权限验证的事情。http/https是无状态的协议,当用户访问一个后端接口时,如何判断该用户有没有权限?当然,可以使用账号+密码去验证。但是,如果使用账号和密码,需要频繁访问数据库,很明显,会带来一些

    2024年02月04日
    浏览(20)
  • Java实现JSON Web Token(JWT)的生成、解码和验证

    JSON Web Token(JWT)是一种用于安全传输信息的开放标准。它可以用于认证和授权用户,以及在不同系统之间传输数据。在本文中,我们将介绍如何在 Java 中使用 jjwt 库来生成、解码和验证 JWT 引入 jjwt 库 首先,你需要在你的项目中引入 jjwt 库。如果你使用 Maven,可以在 pom.xm

    2024年02月10日
    浏览(18)
  • Jwt(Json web token)——使用token的权限验证方法 & 用户+角色+权限表设计 & SpringBoot项目应用

    1.认证鉴权服务,注册中心,认证中心,鉴权中心; 2.用户,角色,权限表设计,数据库视图的使用; 3.项目中的应用,使用自定义注解+拦截器; 4.枚举类型的json化, @JsonFormat(shape = JsonFormat.Shape.OBJECT) @Getter https://gitee.com/pet365/springboot-privs-token 用户和权限之间关系(多对多

    2024年02月14日
    浏览(16)
  • keycloak~jwt的rs256签名的验证方式

    keycloak开放接口地址:/auth/realms/fabao/.well-known/openid-configuration RSA算法是一种非对称加密算法,其安全性基于大整数分解的困难性。在RSA算法中,有以下几个关键参数: n(模数) :n 是一个大整数,通常为两个大素数 p 和 q 的乘积,即 n = p * q。n 用于生成公钥和私钥,并且决

    2024年04月22日
    浏览(20)
  • Java简单快速入门JWT(token生成与验证)

            简单来说,token就是一个将信息加密之后的密文,而jwt也是token的实现方式之一,用于服务器端进行身份验证和授权访问控制。由于是快速入门,这里简单介绍一下jwt的生成原理         jwt由三部分组成。分别是                 1.Header(标头),一般用于指明toke

    2024年02月04日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包