JJWT生成token

  • jjwt 0.9.0版本
  • jjwt0.11.2版本
  • 版本区别
    • 第一个问题
    • 第二个问题
    • 第三个问题

最近在一个项目中不经意间升级了jjwt的版本(0.9.0升级到0.11.2),随之遇到了一些问题。主要问题如下:

  • The signing key’s algorithm ‘AES’ does not equal a valid HmacSHA* algorithm name and cannot be used with HS256.
  • The signing key’s size is 16 bits which is not secure enough for the HS256 algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used with HS256 MUST have a size >= 256 bits (the key size must be greater than or equal to the hash output size). Consider using the io.jsonwebtoken.security.Keys class’s ‘secretKeyFor(SignatureAlgorithm.HS256)’ method to create a key guaranteed to be secure enough for HS256. See https://tools.ietf.org/html/rfc7518#section-3.2 for more information.
  • Unable to find an implementation for interface io.jsonwebtoken.io.Serializer using java.util.ServiceLoader. Ensure you include a backing implementation .jar in the classpath, for example jjwt-impl.jar, or your own .jar for custom implementations.

jjwt 0.9.0版本

package com.example;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.DefaultClaims;
import org.apache.commons.codec.binary.Base64;import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;public class JwtTest {/*** 生成SecretKey* @param secret* @return*/private static SecretKey generateKey(String secret) {byte[] encodedKey = Base64.decodeBase64(secret);return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");}/*** 新生成token** @param clientId* @param exp* @return* @throws IOException*/public static String createToken(String clientId, Long exp) throws IOException {Claims claims = new DefaultClaims();// milliseconds是毫秒  1000毫秒=1秒long expVal = System.currentTimeMillis() + exp*1000;claims.setExpiration(new Date(expVal));try {claims.setSubject(clientId);} catch (Exception e) {e.printStackTrace();}String compactJws = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, generateKey("jinan_20220511")).compact();return compactJws;}public static void main( String[] args ){try {String token = createToken("18605318888", 15*24*60*60L);System.out.println(token);} catch (IOException e) {e.printStackTrace();}}}

jjwt0.11.2版本

package com.example;import com.google.gson.Gson;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.gson.io.GsonSerializer;
import io.jsonwebtoken.impl.DefaultClaims;
import org.apache.commons.codec.binary.Base64;import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.util.Date;public class JwtTest11 {/*** 生成SecretKey* @param secret* @return*/private static SecretKey generateKey(String secret) {byte[] encodedKey = Base64.decodeBase64(secret);return new SecretKeySpec(encodedKey, 0, encodedKey.length, "HmacSHA256");}/*** 新生成token** @param clientId* @param exp* @return* @throws IOException*/public static String createToken(String clientId, Long exp) throws IOException {Claims claims = new DefaultClaims();// milliseconds是毫秒  1000毫秒=1秒long expVal = System.currentTimeMillis() + exp*1000;claims.setExpiration(new Date(expVal));try {claims.setSubject(clientId);} catch (Exception e) {e.printStackTrace();}String compactJws = Jwts.builder().setClaims(claims).signWith(generateKey("jinan_20220511jinan_20220511jinan_20220511jinan_20220511"), SignatureAlgorithm.HS256).serializeToJsonWith(new GsonSerializer<>(new Gson())).compact();return compactJws;}public static void main( String[] args ){try {String token = createToken("18605318888", 15*24*60*60L);System.out.println(token);} catch (IOException e) {e.printStackTrace();}}}

版本区别

第一个问题

The signing key’s algorithm ‘AES’ does not equal a valid HmacSHA* algorithm name and cannot be used with HS256

    // jjwt 0.9.0版本private static SecretKey generateKey(String secret) {byte[] encodedKey = Base64.decodeBase64(secret);return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");}// jjwt 0.11.2版本private static SecretKey generateKey(String secret) {byte[] encodedKey = Base64.decodeBase64(secret);return new SecretKeySpec(encodedKey, 0, encodedKey.length, "HmacSHA256");}

AES改为HmacSHA256

第二个问题

The signing key’s size is 16 bits which is not secure enough for the HS256 algorithm.

// jjwt 0.9版本
String compactJws = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, generateKey("jinan_20220511")).compact();
// jjwt 0.11.2版本
String compactJws = Jwts.builder().setClaims(claims).signWith(generateKey("jinan_20220511jinan_20220511jinan_20220511jinan_20220511"), SignatureAlgorithm.HS256).serializeToJsonWith(new GsonSerializer<>(new Gson())).compact();

密钥位数不够,必须大于256位,一个字符按照8位算,至少32个字符。

第三个问题

Unable to find an implementation for interface io.jsonwebtoken.io.Serializer using java.util.ServiceLoader.
代码参考第二个问题。

没找到序列化的实现,添加序列化相关依赖和代码。

    <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-gson</artifactId><version>0.11.2</version></dependency>
String compactJws = Jwts.builder().setClaims(claims).signWith(generateKey("jinan_20220511jinan_20220511jinan_20220511jinan_20220511"), SignatureAlgorithm.HS256)// 添加序列化相关.serializeToJsonWith(new GsonSerializer<>(new Gson())).compact();

jjwt生成jwt token相关推荐

  1. Java笔记-使用jjwt生成jwt

    jwt的全称为: JSON WEB TOKEN 程序运行截图如下: maven添加: <dependency><groupId>io.jsonwebtoken</grou ...

  2. 任务37:生成 JWT Token

    实现给用户办法token 默认是可以访问valuesController的,返回的状态是200 http://localhost:5429/api/values 返回的状态码是200 把ValuesC ...

  3. JWT Token在线编码生成

    JWT Token在线编码生成 JWT Token在线编码生成 JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案.本工具提供在线编码的功能 JSON Web Token(缩写 ...

  4. 一文详解jwt token以及sprig boot如何整合实现 jwt token操作

    文章目录 1. jwt是什么 2. jwt的来源 2.1 传统的session认证 2.2 基于token的鉴权机制 3. JWT的构成 3.1 header 3.2 playload 3.3 sig ...

  5. Spring Security Jwt Token 自动刷新

    token的自动刷新 一.功能需求 二.功能分析 1.token 的生成 2.token 的自动延长 3.系统资源的保护 4.用户如何传递 token 三.实现思路 1.生成 token 和 refr ...

  6. jwt的token自动续约_SpringSecurity Jwt Token 自动刷新的实现

    功能需求 最近项目中有这么一个功能,用户登录系统后,需要给 用户 颁发一个 token ,后续访问系统的请求都需要带上这个 token ,如果请求没有带上这个 token 或者 token 过期了,那 ...

  7. Java Token登录验证 使用jjwt生成和解析JWT

    Java jjwt生成和解析Token 参考 依赖 流程 生成和解析Jwt 生成jwt 解析Jwt 实例 后端 前端 刚学会了点使用Jwt来验证登录,记录下来 参考 JSON Web Tokens官网 ...

  8. JWT/JJWT JSON WEB TOKEN介绍和使用

    JSON web Token,简称JWT,本质是一个token,是一种紧凑的URL安全方法(注意是方法,博主刚开始接触一直以为是一种像shiro一样的),用于在网络通信的双方之间传递.一般放在HTTP ...

  9. JWT详解、JJWT使用、token 令牌

    前言 在正式讲解JWT之前,我们先重温一下用户身份认证相关的一些概念: 有状态登录(session认证) 服务器当中记录每一次的登录信息,从而根据客户端发送的数据来判断登录过来的用户是否合法. 缺点: ...

最新文章

  1. java人工洗牌窗口程序_求解,用JAVA写洗牌与发牌模拟程序
  2. python如何获取多个excel单元格的值
  3. 代码UITableView点击cell跳转
  4. Android NDK学习笔记3:JNI访问Java属性、方法
  5. EIGRP的基本配置
  6. 力扣——字符串转换整数 (atoi)
  7. Win32下对多个的线程句柄的关闭的控制(上)
  8. CocurrentHashMap和Hashtable的区别
  9. C 语言中的结构体(数据结构)
  10. 【原创】【2021 android逆向系列】番外:oppo A57手机刷官方纯净版ROM且ROOT
  11. jquery 实现四级联动
  12. informatic动态变量的创建和使用
  13. Arcgis操作系列一:shp矢量数据的面积计算
  14. moments音标_moment  是什么意思_moment  的翻译_音标_读音_用法_例句_爱词霸在线词典...
  15. 双十一数码好物指南,双十一不踩坑推荐
  16. 阜阳市计算机学校助学金申请书,计算机专业学生助学金申请书范文
  17. python超市进销存管理系统
  18. 七牛云成功通过 CMMI3 认证
  19. 华为软开云2--玩转代码托管
  20. 计算机系高考激励的句子,高考激励人心的句子及图片

热门文章

  1. 关于添加pdf水印那些事
  2. java实现搜索附近地点或人的功能
  3. typescript ts参数展开运算符:形参展开和实参展开及as const的用法示例
  4. C++ 类中函数指针的使用
  5. 3GPP TS 29244-g30 中英文对照 | 5.26.3 Transfer of 5GS bridge port management information
  6. Fikkernbsp;反向代理服务器nbsp;…
  7. python自动回帖,批量回帖
  8. 阿里云负载均衡SLB网络型NLB负载均衡架构性能详解
  9. 进阶渲染系列(七)——三向贴图(任意表面纹理化)【进阶篇完结】
  10. python pip3 install_python3安装pip3(install pip3 for python 3.x)