JWT是什么?它有什么用?

1. 什么是 JWT?

JWT是 JSON Web Token 的缩写,通过数字签名的方式,以 JSON 对象为载体,在不同的服务器终端之间安全传输的信息。

2. JWT 有什么用?

JWT 最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含 JWT,系统在每次处理用户请求之前,都先进行 JWT 安全效验,通过之后再进行处理。
JWT 就像是一个令牌,当我们去到一个公司,这个公司先回效验你的身份,效验成功后就会给你发一个身份卡,以后再见面,看见你的身份卡就知道你是这个公司的人了,就不需要再对你的身份进行认证了,上方的例子就是对 JWT 的简单解释。

3. JWT 的组成形式

JWT 主要是由三大部分组成:

3.1 Header

第一部分是头部分,一个是类型,一个是算法的名称;再通过 base64 编码进行编排

{'typ': 'JWT','alg': 'HS256'
}

3.2 Payload

第二部分是载荷,这里存储的就是有效信息的地方,这个部分又分为三个区域
1.标准中注册的声明

iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

在这里插入图片描述

2.公共的声明
公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息,但不建议添加敏感信息,因为该部分在客户端可解密
3.私有的声明
私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64 是对称解密的,意味着该部分信息可以归类为明文信息。

3.3 Signature

这个签名是:

var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var = signature = HMACSH256(encodedString,'secret';)

下面就是 JWT 的三部分
xxxxx.yyyyy.zzzz
x部分:由 Header 进行 base64编码生成
y部分:由 Payload base64编码生成
z部分:由 base64编码 Header + '.' + base64编码 Payload,再将前面的字符串使用 header 头中的算法加密生成。

4. 代码实现

4.1 生成 JWT 代码:

在创建 JwtBuilder 时,我们可以选择不创建头,当它判断 header 为空时,它会设置一个默认头,调用compact()方法的作用就是,他会将 JWT 的三部分拼接起来,拼接成xxxx.yyyy.zzzz 的形式

//有效期为public static final Long JWT_TTL = 24*60 * 60 *1000L;// 60 * 60 *1000  一个小时//设置秘钥明文public static final String JWT_KEY = "sangeng";/*** 生成jtw* @param subject token中要存放的数据(json格式)* @param ttlMillis token超时时间* @return*/public static String createJWT(String subject, Long ttlMillis) {JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间return builder.compact();}private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;SecretKey secretKey = generalKey();long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);if(ttlMillis==null){ttlMillis=JwtUtil.JWT_TTL;}long expMillis = nowMillis + ttlMillis;Date expDate = new Date(expMillis);return Jwts.builder().setId(uuid)              //唯一的ID.setSubject(subject)   // 主题  可以是JSON数据.setIssuer("zzq")     // 签发者.setIssuedAt(now)      // 签发时间.signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥.setExpiration(expDate);}/*** 生成加密后的秘钥 secretKey* @return*/public static SecretKey generalKey() {byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");return key;}

4.2解析

我们解析出来的 Claims 对象就是之前 存入的值,我再调用对象的getSubject()方法就可以得到我们原来所存储的值了。

    /*** 生成加密后的秘钥 secretKey* @return*/public static SecretKey generalKey() {byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");return key;}/*** 解析** @param jwt* @return* @throws Exception*/public static Claims parseJWT(String jwt) throws Exception {SecretKey secretKey = generalKey();return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系列八、VMWare无法启动CentOS7问题排查 解决

一、VMWare无法启动CentOS7 1.1、问题描述 今天在测试代码的时候,需要用到Linux,然后就打开VMWare进行启动,但是启动的时候发现无法启动起来,报了一个如下的错误: 出现了问题那就要解决问题,然后想起来前几…

Koordinator 支持 K8s 与 YARN 混部,小红书在离线混部实践分享

作者:索增增(小红书)、宋泽辉(小红书)、张佐玮(阿里云) 背景介绍 Koordinator 是一个开源项目,基于阿里巴巴在容器调度领域多年累积的经验孵化诞生,目前已经支持了 K8s…

【数据结构】线段树算法总结(单点修改)

知识概览 用作单点修改的线段树有4个操作: pushup:由子节点的信息计算父节点的信息build:初始化一棵树modify:修改一个区间query:查询一个区间 线段树用一维数组来存储: 编号是x的节点,它的父节…

【MySQL工具】pt-online-schema-change源码分析

通过阅读源码 更加深入了解原理,以及如何进行全量数据同步,如何使用触发器来同步变更期间的原表的数据更改。(^-^)V 目录 源码分析 Get configuration information. Connect to MySQL. Create --plugin. Setup la…

使用 ElementUI 组件构建无边框 Window 桌面应用(WinForm/WPF)

生活不可能像你想象得那么好,但也不会像你想象得那么糟。 我觉得人的脆弱和坚强都超乎自己的想象。 有时,我可能脆弱得一句话就泪流满面;有时,也发现自己咬着牙走了很长的路。 ——莫泊桑 《一生》 一、技术栈 Vite + Vue3 + TS + ElementUI(plus) + .NET Framework 4.7.2…

[管理者与领导者-129]:很多人对高情商的误解,工程师要扩展自己的情商吗?工程师如何扩展自己的情商?

目录 前言: 一、什么是高情商? 1.1 什么是高情商 1.2 情商的五大能力 1.3 高情商的层次 1.4 对高情商的误解? 二、工程师需要发展自己的高情商吗? 三、工程师如何扩展自己的情商? 四、什么样的“高情商”的管理者令人讨…

前端 JS 安全对抗原理与实践

作者:vivo 互联网安全团队- Luo Bingsong 前端代码都是公开的,为了提高代码的破解成本、保证JS代码里的一些重要逻辑不被居心叵测的人利用,需要使用一些加密和混淆的防护手段。 一、概念解析 1.1 什么是接口加密 如今这个时代,…

高德地图逆地理编码踩坑日志

本人是一枚Java小白,公司项目中用到根据经纬度反查该地址中文信息的场景,因为一开始调用的经纬度是能反查出区域编码的,以为towncode都是String返回结果,如下图: 没想到当没有名字任何一个城市区域的时候,…

管理 Jenkins 详细指南

目录 系统配置 安全 状态信息 故障 排除 工具和操作 系统配置 系统,配置全局设置和路径,端口更改,下载地址等。 工具,配置工具、其位置和自动安装程序。 插件,添加、删除、禁用或启用可以扩展 Jenkins 功能的插…

ssh远程管理服务

什么是ssh SSH是一种加密的网络协议,用于在不安全的网络中安全地传输数据。它允许用户通过一个安全的通道连接到远程计算机,并在该通道上执行各种网络服务,例如远程登录和文件传输。 SSH使用公钥加密技术来验证远程计算机的身份,并…

初识Stable Diffusion

界面选项解读 这是在趋动云上部署的Stable Diffusion txt2img prompt (1)分割符号:使用逗号 , 用于分割词缀,且有一定权重排序功能,逗号前权重高,逗号后权重低 (2)建议的通用范式…

【C++11特性篇】玩转C++11中的包装器(function&bind)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! 目录 一.为什么需要包装器function&#xff…

【Earth Engine】协同Sentinel-1/2使用随机森林回归实现高分辨率相对财富(贫困)制图

目录 1 简介与摘要2 思路3 效果预览4 代码思路5 完整代码6 后记 1 简介与摘要 最近在做一些课题,需要使用Sentinel-1/2进行机器学习制图。 然后想着总结一下相关数据和方法,就花半小时写了个代码。 然后再花半小时写下这篇博客记录一下。 因为基于多次拍…

通过windows cng api 实现rsa非对称加密

参考: 1,使用 CNG 加密数据 - Win32 apps | Microsoft Learn 2,不记得了 (下文通过cng api演示rsa加密,不做原理性介绍) 相对于aes等对称加密算法,rsa加密算法不可逆性更强。非对称加密在通常情况下,使…

前端传输formDate格式的数据,后端不能用@RequestBody接收

写了个接口,跟前端对接,前端说怎么一直415的报错 我寻思不对啊,我swagger都请求成功了,后来发现前端一直是以formdata格式提交的数据,这样我其实是可以不加RequestBody的; 知识点: RequestBody…

类和对象

1 类定义: class ChecksumAccumulator {// class definition goes here } 你就能创建 ChecksumAccumulator 对象:new CheckSumAccumulator 注:1scala类中成员默认是public类型,若设为私有属性则必须加private关键字。在scala中是…

基于Springboot的留守儿童爱心网站(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的留守儿童爱心网站(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring…

技术交底二维码的应用

二维码技术交底可以逐级落实、责任到人、有据可查、是目前最方便、实用的交底方式,下面我们讲解技术交底二维码的应用。 1、生成对应的技术交底二维码,将施工方案、技术资料、安全教育资料等内容上传到二维码里。打印出来现场粘贴,便于作业班…

java中线程相关的面试题

什么是线程安全,造成线程安全的本质是什么? 什么是线程安全呢? 咱们初步去理解话记住一句话就行:如果一个对象可以安全地被多个线程同时使用,那它就是线程安全的。 为什么并发编程会导致线程不安全? 可见…

用友U8CRM系统help2 任意文件读取漏洞复现

用友U8CRM系统的help2文件中接口存在任意文件读取漏洞,攻击者在未登录情况下即可进行漏洞利用。 1.1 漏洞级别 高危 1.2 快速检索 fofa语法: title"用友U8CRM"1.3 漏洞复现 该漏洞利用非常简单,只需构造get请求 访问该地址即可…