JWT一篇通

news2024/11/26 12:16:58

JWT 是什么?

JWT(JSON Web Token)是一种开放的标准,标准的编号是RFC7591。用于在不同实体之间安全地传输信息。它是基于 JSON 编码的令牌。

JWT 的组成

JWT由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

  1. 头部(Header)包含了令牌的类型(typ)和所使用的签名算法(alg),通常使用 Base64 编码表示。示例如下:
{
  "alg": "HS256",
  "typ": "JWT"
}
  1. 载荷(Payload)是令牌的主要信息存储部分,包含了各种声明(claims),用于表示关于实体(用户、设备或其他主体)和其他补充数据的信息。载荷可以包含标准声明(例如:iss,sub,exp,nbf,iat,aud 等),也可以包含自定义声明。载荷同样会被进行 Base64 编码表示,并传输在令牌中。示例如下:
{
  "sub": "myapp",
  "name": "oscar",
  "role": "admin"
}
  1. 签名(Signature)是使用密钥对头部和载荷进行签名的哈希值,以确保令牌不会被篡改。签名通常使用头部中指定的算法(例如:HMAC、RSA 等)和密钥来生成,并以字符串形式附加在令牌的末尾。签名验证可以用于验证令牌的完整性和真实性。

以Java语言产生JWT的过程来看,步骤如下:

  1. 产生头部的Base64编码串
String header = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";
String encodedHeader = Base64.getEncoder().encodeToString(header.getBytes());
  1. 产生载体的Base64编码串
		String payload = "{\"sub\":\"myapp\",\"name\":\"oscar\"}";
		String encodedPayload = Base64.getEncoder().encodeToString(payload.getBytes());
  1. 使用点号. 连接头部和载体之后, 再使用签名算法进行签名, 将签名后的内容附加在整个字符串的后面
		Key secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
		String concatenated = encodedHeader + '.' + encodedPayload;

		Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
		sha256_HMAC.init(secretKey);
		byte[] signature = sha256_HMAC.doFinal(concatenated.getBytes("utf-8"));
		String compact = concatenated + '.' + Base64.getEncoder().encodeToString(signature);

产生后得到的完整字符串如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJteWFwcCIsIm5hbWUiOiJvc2NhciJ9.5z6NoiF7MR999wOPn2NU6HnyPODx66qm5yRT+n8pNHs=

通过 https://base64.us/ 解码之后获取的内容如下图:
在这里插入图片描述

从上面可以看出, JWT的令牌就是一串字符串。

JWT 的作用

JWT 适用于在网络请求中传输身份验证和授权信息,常用于构建无状态(stateless)的身份验证和访问控制机制。客户端在接收到令牌后,可以通过对令牌进行解码和验证来验证其有效性,并使用其中的信息进行授权和身份验证。

总结起来,JWT 是一种使用 JSON 编码的安全令牌,由头部、载荷和签名部分组成,可用于在实体之间传递信息和验证身份。它提供了一种简单、可扩展和自包含的机制,用于处理身份验证和授权相关的任务。
JWT也经常用于单点登录, 就是用户登录A系统之后,产生一个令牌, 之后访问其他系统都带上这个 Token,进而可以访问B,C,D等系统。

JWT优缺点

  1. 基于JSON,方便解析
  2. 可以在令牌中定义丰富的内容,易于扩展
  3. 通过非对称加密和数字签名,防篡改,安全性高
  4. 资源服务使用JWT就可以完成授权,不需要依赖授权服务器

缺点:

  • JWT令牌较长, 占用较多的存储空间。

JWT的加密解密

JWT 的加密和解密通常涉及到以下三个步骤:

  1. 创建 JWT:
    创建 JWT 需要准备三个部分:头部(Header)、载荷(Payload)和签名(Signature)。在创建 JWT 时,首先将头部和载荷进行 Base64 编码,并将这两个编码后的字符串用点号连接起来形成 JWT 的第一部分。接着,使用密钥和指定的签名算法对前面的字符串进行签名,生成签名字符串,并与前面的字符串用点号连接起来形成 JWT 的最终形式。

  2. 验证 JWT:
    验证 JWT 的过程通常包括以下几个步骤:首先,对 JWT 中的头部和载荷部分进行Base64解码,提取其所包含的信息。接下来,用与创建 JWT 相同的算法和密钥,对头部和载荷部分计算签名。最后,将计算得出的签名字符串与 JWT 中的签名部分进行比较。如果两者相等,则表明 JWT 未被篡改过,可以被信任。

  3. 解码 JWT:
    如果需要查看 JWT 中包含的数据,可以对 JWT 的第一部分进行 Base64 解码,以得到头部和载荷的信息。解码后的结果通常为 JSON 格式的字符串,可以通过相应的 JSON 解析库将其转换为对象。

需要注意的是,JWT 中的头部和载荷信息并没有加密,只进行了 Base64 编码。因此,这些信息可以被轻易地获取。为了保护数据的机密性,通常会使用加密算法加密载荷部分,即将其转换为 JWE(JSON Web Encryption)格式。JWE 提供了一种标准化的加密方式,以保护 JWT 中的敏感信息。加密 JWE 包括头部、密钥和加密后的密文等部分,需要使用相应的算法和密钥来进行解密。

总的来说,JWT 的加密和解密通常包括创建 JWT、验证 JWT 和解码 JWT 等步骤。其中,验证 JWT 可以用于验证 JWT 是否被篡改过,以保证 JWT 的完整性和可信度。而将载荷部分加密则可以保护 JWT 中的敏感信息,提高 JWT 的机密性。



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

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

相关文章

从C++98到C++26,经历了什么?

作为一名程序员,2023年最应该关注的话题就是C的标准更新。 C标准遵循3年开发周期,并以发布年份命名。C在临发布的一年前会进入“功能冻结期(feature freeze)”,即版本开发进入半稳定状态,不再添加重大功能及…

【C语言】入门——指针

目录 ​编辑 1.指针是什么 2.指针类型和指针运算 2.1指针-整数 2.2指针-指针 2.3指针的关系运算 3.野指针 3.1野指针成因 👍指针未初始化: 👍指针越界访问: 👍指针指向空间释放: 3.2如何规避野指针 …

PDF转Word的方法分享与注意事项。

PDF和Word是两种常用的文档格式,它们各有优点,适用于不同的场景。然而,有时候我们需要将PDF转换为Word,以便更好地进行编辑和排版。本文将介绍几种常用的PDF转Word的方法,并分享一些注意事项。 一、PDF转Word的方法 使…

性能炸裂c++20协程+iocp/epoll,超轻量高性能异步库开发实战

前言: c20出来有一段时间了。其中一大功能就是终于支持协程了(c作为行业大哥大级别的语言,居然到C20才开始支持协程,我也是无力吐槽了,让多少人等了多少年,等了多少青春)但千呼万唤他终于还是来…

python图书书籍管理系统及推荐评分系统vue

本系统提供给管理员对书籍分类、书籍信息、书籍评分、留言板等诸多功能进行管理。本系统对于用户输入的任何信息都进行了一定的验证,为管理员操作提高了效率,也使其数据安全性得到了保障。随着信息化时代的到来,网络系统都趋向于智能化、系统…

拿下数千万元A轮融资,这家HUD厂商驶入规模上车的“快车道”

进入2023年,AR HUD市场迎来了爆发式增长,一批本土HUD厂商开始备受资本市场的关注。 近日,深圳前海智云谷科技有限公司(以下简称“智云谷”)完成数千万元A轮融资,本轮融资由清新资本等投资方投资。智云谷表…

你以为的直线,在多维空间里是复杂的曲线

你以为的直线,在多维空间里是复杂的曲线 AI回答: 这句话是说,在多维空间中,我们的直觉和经验可能会误导我们,认为一条直线应该是简单直接的。然而,在高维空间中,直线可能会有很多突变和弯曲&am…

ES6中let和const关键字与var关键字之间的区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 变量作用域(Scope):⭐ 变量提升(Hoisting):⭐ 重复声明:⭐ 初始化:⭐ 全局对象属性:⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#…

41.SpringMVC实现下载和上传功能

SpringMVC实现下载和上传功能 下载 ResponseEntity用于控制器方法的返回值类型&#xff0c;该控制器方法的返回值就是响应到浏览器的响应报文 index.html <a th:href"{/testDown}">下载图片</a>使用ResponseEntity实现下载文件的功能FileUpAndDownCon…

MCS-51单片机温度控制系统的设计

一、项目介绍 注塑机是一种常用的制造设备&#xff0c;用于生产塑料制品。在注塑机的工作过程中&#xff0c;溶胶必须达到一定的温度才能被注入模具中进行成型。因此&#xff0c;在注塑机的生产过程中&#xff0c;温度控制是非常重要的一环。 本项目基于MCS-51单片机设计了一…

关于TE,PU邀请函

有人问我说客户让办理TE邀请函&#xff0c;具体步骤是哪些&#xff1f;我目前还没遇到过客户要求办理TE邀请函的&#xff0c;基本上都是普通的商务签证&#xff0c;只要写个邀请函给客户&#xff0c;剩下的事情客户就能自己搞定&#xff0c;他们来访的目的简单&#xff0c;要么…

虹科方案|HK-Edgility利用边缘计算和VNF降本增效

一、边缘计算和 VNF 在当今瞬息万变的数字环境中&#xff0c;边缘虚拟化网络功能&#xff08;VNF&#xff09;是一个既能够优化网络基础设施&#xff0c;又能控制成本的创新型解决方案。它使客户能够将多个基于软件的 VNF 整合到一个专用计算设备上。更值得高兴的是&#xff0c…

【开发】视频集中存储/直播点播平台EasyDSS点播文件分类功能优化

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 TSINGSEE青犀视频的EasyDSS平台具有点播文件分类展示方法&#xf…

LNMP架构搭建论坛

目录 一、LNMP简介&#xff1a; 二、LNMP搭建&#xff1a; 1.前提准备&#xff1a; 关闭防火墙和安全机制&#xff1a; 2.编译安装nginx&#xff1a; 3.编译安装mysql&#xff1a; 3.1 安装依赖环境&#xff1a; 3.2 创建mysql运行用户&#xff1a; 3.3 编译安装&#xff1a…

Vue.js核心技术深度解析与uni-app跨平台开发实战

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Vue.js是一款流行的Java…

算法训练day39|动态规划 part02(LeetCode62.不同路径、63. 不同路径 II)

文章目录 62.不同路径思路分析代码实现 63. 不同路径 II思路分析代码实现思考总结 62.不同路径 题目链接&#x1f525;&#x1f525; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步…

Lua语法结构

Lua基础 注释 print("hello.") -- 单行注释的写法 --[[ 多行注释的写法 --]]标识符 关键字 **and **break**do **else**elseif ****end **falsefor**function **ifinlocalnilnotorrepeatreturnthentrueuntil**while ** 数据类型 nil** boolean**** number**** st…

MyBatis-Plus排除不必要的字段

查询学生信息排除年龄列表 &#x1f4da;&#x1f50d; 使用MyBatis-Plus排除某些字段。如果你想要进行查询&#xff0c;但又不需要包含某些字段&#xff0c;那么这个功能将非常适合你。&#x1f50d;&#x1f393;&#x1f4dd; 1. 学生信息查询-排除年龄列表 在使用 MyBat…

Vue.js基础(一)

目录 1、{{ }} 文本插值 2、v-html原始html 3、v-bind Attribute&#xff08;属性&#xff09;绑定\三元运算符 4、v-for列表渲染 5、v-on监听事件 6、事件调用方法 7、v-model表单的输入绑定 8、Props组件交互 父传子 子传父 子传父总结 1、{{ }} 文本插值 <…

手写Spring:第3章-实现Bean的定义、注册、获取

文章目录 一、目标&#xff1a;实现Bean的定义、注册、获取二、设计&#xff1a;实现Bean的定义、注册、获取三、实现&#xff1a;实现Bean的定义、注册、获取3.1 工程结构3.2 实现Bean的定义、注册、获取类图3.3 定义Bean异常3.4 BeanDefinition定义和注册3.4.1 BeanDefinitio…