Advertisement

面试题:jwt 是什么?java-jwt 呢?

阅读量:

文章目录

  • JWT的核心机制是什么?
  • 在线生成过程是怎样的?
  • 它由哪几部分组成?各部分起什么作用?
  • 支持哪些编程语言?有哪些优势?
  • 如何访问JWT官方文档?
  • 推荐的Java-JWT库有哪些?
  • 如何生成一个加密Token?请详细说明步骤。
  • 如何解密Token以获取负载信息?请详细说明验证Token有效性的过程。

JWT概念

JWT , 全写JSON Web Token, 是开放的行业标准RFC7591,用来实现端到端安全验证.

简单来说, 就是通过一些算法对加密字符串和JSON对象之间进行加解密。

JSON格式编码后的JWT信息被存储于客户端端侧,并且该机制避免了服务端需要存储会话信息的需求。这种设计模式适用于前后端解耦的用户认证场景。通过后端进行加密处理生成tokens字符串,并将该tokens字符串附加至前端请求中完成身份验证流程。

JWT流程:

在这里插入图片描述

JWT的构成

JWT字符串:一段加密的JSON字符串。

包含了三类信息

  • Header头部:Token种类与加密机制。主要采用MD5、SHA与HMAC(Hash Message Authentication Code)作为常用的加密算法。
    • PayLoad负载:存储重要数据,并包含开发者使用的术语。这些内容类似于编程语言中的关键字。

issuser - 发行人
sub subject - 目标受众
audience - 接收方
expiration time - 过期时间戳
nbf - 不得早于, 开始生效时间戳
iat(Issued at) 签发时间
jti(JWT ID): 唯一标识符

公共的声明:一般添加业务相关的必要信息,因为可解密,不建议敏感信息。

私有的声明即为提供者与消费者共同制定的定义;Base64对称解密即为此方案中采用的技术;建议避免处理涉及敏感信息的内容。

Signature签证

签证信息包括三部分:

Base64加密的header

Base64加密的payload

采用header中定义的加密算法对Header及payload的连接字符串施加盐并进行秘密组合加密。该密钥存于服务端,在此位置上所述服务端能够基于该密钥执行解密验证过程。

JWT与开发语言

一种广泛采用的标准...可以由多种过时的开发语言实现...包括Java...Node.js...Python等。同一个编程语言中存在多个实现库...例如,在Java编程语言中就提供了java-jwt、?jose4j、nimbus-jose-jwt和jjwt等多种库。

JWT官网

https://jwt.io/

This website offers an online tool that utilizes various algorithms for converting strings and JSON objects, alongside a collection of implementation libraries in multiple languages.

java-jwt

java-jwt是Java语言中推荐的JWT实现库,使用Maven导入如下:

复制代码
    <dependency>
     <groupId>com.auth0</groupId>
     <artifactId>java-jwt</artifactId>
     <version>3.8.3</version>
    </dependency>

产生加密Token

复制代码
    String token = JWT.create()
      .withExpiresAt(newDate(System.currentTimeMillis()))  //设置过期时间
      .withAudience("user1") //设置接受方信息,一般时登录用户
      .sign(Algorithm.HMAC256("111111"));  //使用HMAC算法,111111作为密钥加密

解密Token获取负载信息并验证Token是否有效

复制代码
    String userId = JWT.decode(token).getAudience().get(0);
    Assertions.assertEquals("user1", userId);
    JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("111111")).build();
    jwtVerifier.verify(token);

全部评论 (0)

还没有任何评论哟~