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. Eureka 服务注册与发现01——单机版
  2. 全国计算机等级考试题库二级C操作题100套(第27套)
  3. portainer 启动mysql_docker 安装portainer容器后,启动/Portainer 安装MySQL并开启远程访问...
  4. Android版添加phonegap---为APP添加CNZZ统计插件教程
  5. WPF TreeView 绑定(demo 转)
  6. 如何使用 Spring 对数据库进行 CURD?
  7. block和代理小结
  8. 关于C#的sqlite数据库操作类
  9. Docker 数据管理
  10. html图标与文字对齐,如何实现css图标与文字对齐
  11. 计算机系统优化的方法.,20种优化电脑开机速度方法!
  12. 国科大学习资料--模式识别与机器学习(黄庆明)--期末复习题1(含答案)
  13. 打印1000张大概多少钱,打印费多少钱一张
  14. phpstudy php56 zend,phpstudy集成环境
  15. matlab中用if语句,matlab if语句如何使用
  16. 技术分享 | MySQL 突如其来的主从复制延迟
  17. 纹理 Texture
  18. 小程序导航栏透明,精准设置小程序自定义标题的高度和定位
  19. 六零导航页 (LyLme Spage)网址导航源码
  20. 满帮集团满身泥泞:市值蒸发近千亿元,戴文建等人减持“套现”

热门文章

  1. 深度学习之:使用 Hugging face 做知识蒸馏 teacher-bert 到 student-bert
  2. PHP8.1 的 fiber
  3. 将纸质的电话号码导入到手机通讯录(一):使用ABBYY FineReader进行数据识别
  4. html 调试502谷歌浏览器,谷歌浏览器网页提示Server Error 502 Bad Gateway
  5. PyQt5之音乐播放器
  6. 文化是什么?(上篇)
  7. 世界上最高效的笔记方法(改变你那老版的记笔记方法吧)
  8. 如果说Android是Google的特工Smith,那么谁是Neo?
  9. Python 计算符号
  10. 网页html5音频怎么提取,如何从HTML5中的音频标签获取FFT