最近项目需要用到类似access token进行加解密、验签的需求,本人在此做个小笔记记录一下,以供他人参考。

一共会用到2中加解密,HS256 和 RS256,本文只是对 HS256做个备注,好了直接上代码,先引入jar包

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

核心 Util 类代码如下:

  1. public class JwtUtil {
  2. /**
  3. * token 过期时间, 单位: 秒. 这个值表示 30 天
  4. */
  5. private static final long TOKEN_EXPIRED_TIME = 30 * 24 * 60 * 60;
  6. /**
  7. * jwt 加密解密密钥, 这里请自行赋值,本人暂且使用随机数16位
  8. */
  9. private static final String JWT_SECRET = "1AsdadSAS123daXX";
  10. public static final String jwtId = "tokenId";
  11. /**
  12. * 创建JWT
    * @param claims 这个是payLoad的部分内容, jwt格式:jwtHeader.jwtPayLoad.Signature
  13. */
  14. public static String createJWT(Map<String, Object> claims, Long time) {
  15. SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
  16. Date now = new Date(System.currentTimeMillis());
  17. SecretKey secretKey = generalKey();
  18. long nowMillis = System.currentTimeMillis();//生成JWT的时间
  19. //下面就是在为payload添加各种标准声明和私有声明了
  20. JwtBuilder builder = Jwts.builder() //这里其实就是new一个JwtBuilder,设置jwt的body
  21. .setClaims(claims) //如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
  22. //.setId(jwtId) //设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击。
  23. //.setIssuedAt(now) //iat: jwt的签发时间
    .setHeader("alg", "HS256") //设置header
  24. .signWith(signatureAlgorithm, secretKey);//设置签名使用的签名算法和签名使用的秘钥
  25. if (time >= 0) {
  26. long expMillis = nowMillis + time;
  27. Date exp = new Date(expMillis);
  28. builder.setExpiration(exp); //设置过期时间
  29. }
  30. return builder.compact();
  31. }
  32. /**
  33. * 验证jwt
  34. */
  35. public static Claims verifyJwt(String token) {
  36. //签名秘钥,和生成的签名的秘钥一模一样
  37. SecretKey key = generalKey();
  38. Claims claims;
  39. try {
  40. claims = Jwts.parser() //得到DefaultJwtParser
  41. .setSigningKey(key) //设置签名的秘钥
  42. .parseClaimsJws(token).getBody();
  43. } catch (Exception e) {
  44. claims = null;
  45. }//设置需要解析的jwt
  46. return claims;
  47. }
  48. /**
  49. * 由字符串生成加密key
  50. *
  51. * @return
  52. */
  53. public static SecretKey generalKey() {
  54. String stringKey = JWT_SECRET;
  55. byte[] encodedKey = Base64.decodeBase64(stringKey);
  56. SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "HS256");
  57. return key;
  58. }
  59. /**
  60. * 根据userId和openid生成token
  61. */
  62. public static String generateToken() {
  63. Map<String, Object> map = new HashMap<>();
  64. map.put("key1", 123ssaa”);
  65. map.put("ke2", "123321213");
  66. return createJWT(map, TOKEN_EXPIRED_TIME);
  67. }
  68. }

springboot-jjwt HS256加解密(PS:验证就是解密)的更多相关文章

  1. XJar: Spring-Boot JAR 包加/解密工具,避免源码泄露以及反编译

    XJar: Spring-Boot JAR 包加/解密工具,避免源码泄露以及反编译 <?xml version="1.0" encoding="UTF-8" ...

  2. SpringBoot实现基于token的登录验证

    一.SpringBoot实现基于token的登录验证 基于token的登录验证实现原理:客户端通过用户名和密码调用登录接口,当验证数据库中存在该用户后,将用户的信息按照token的生成规则,生成一个字 ...

  3. .NET Core 使用RSA算法 加密/解密/签名/验证签名

    前言 前不久移植了支付宝官方的SDK,以适用ASP.NET Core使用支付宝支付,但是最近有好几位用户反应在Linux下使用会出错,调试发现是RSA加密的错误,下面具体讲一讲. RSA在.NET C ...

  4. SpringBoot启动如何加载application.yml配置文件

    一.前言 在spring时代配置文件的加载都是通过web.xml配置加载的(Servlet3.0之前),可能配置方式有所不同,但是大多数都是通过指定路径的文件名的形式去告诉spring该加载哪个文件: ...

  5. Springboot使用自定义注解实现简单参数加密解密(注解+HandlerMethodArgumentResolver)

    前言 我黄汉三又回来了,快半年没更新博客了,这半年来的经历实属不易,疫情当头,本人实习的公司没有跟员工共患难, 直接辞掉了很多人.作为一个实习生,本人也被无情开除了.所以本人又得重新准备找工作了. 算 ...

  6. php接口数据加密、解密、验证签名代码实例

    php接口数据加密.解密.验证签名 代码非常easy,这里就不多废话了,直接奉上代码 <?php /** * 数据加密.解密.验证签名 * @edit http://www.lai18.com ...

  7. Java类加载机制(加载、验证、准备、解析、初始化)

    如下图所示,Java的类加载机制主要分为三个部分,分别为加载.链接.初始化.其中链接又分为三个小部分--验证.准备.解析. 加载--在经过对Java代码进行编译后,JVM将Java类编译后的二进制文件 ...

  8. SpringBoot注册登录(三):注册--验证账号密码是否符合格式及后台完成注册功能

    SpringBoot注册登录(一):User表的设计点击打开链接SpringBoot注册登录(二):注册---验证码kaptcha的实现点击打开链接      SpringBoot注册登录(三):注册 ...

  9. RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例

    前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密  私加 ===================== ...

  10. SpringBoot配置文件的加载位置

    1.springboot启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件 --file:/config/ - ...

随机推荐

  1. 微信小程序组件解读和分析:十三、radio单选项目

    radio单选项目组件说明: radio:单选项目. radio-group: 单项选择器,内部由多个<radio/>组成. radio单选项目示例代码运行效果如下: 下面是WXML代码: ...

  2. iOS Programming Dynamic Type 1

    iOS Programming Dynamic Type 1  Dynamic Type is a technology introduced in iOS 7 that helps realize ...

  3. 临时笔记 Protection

    如果操作系统不使用处理器的多任务机制,它仍然需要为栈创建至少一个TSS 当程序通过调用门改变特权级的时候,处理器执行下面的步骤切换栈,并且执行被调用的程序在新的特权级 1. 使用目标代码段的DPL从T ...

  4. windows SDK创建一个窗体

    #include <windows.h> /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, U ...

  5. 利用jquery制作滚动到指定位置触发动画

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>利用 ...

  6. hdfs深入:05、hdfs中的fsimage和edits的合并过程

    6.4.secondarynameNode如何辅助管理FSImage与Edits文件 ①:secnonaryNN通知NameNode切换editlog ②:secondaryNN从NameNode中获 ...

  7. pip install MySQL-python error "can't open config-win.h"

    http://blog.csdn.net/xxm524/article/details/48754139

  8. vue+VeeValidate 校验范围(部分校验,全部校验)

    搜索很久,没有发现有关于vue+VeeValidate部分校验的.自己写一个. 主要是两个场景: 1. 校验范围内,所有的字段. 2. 校验全局所有字段.主要方法: 1.validate(fields ...

  9. gdb 基础

    版权:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html 1. gdb 调试利器 GDB是一个由GNU开源组织发布的.UN ...

  10. [JOYOI] 1051 选课

    题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校 ...