当前位置: 首页 > news >正文

JWT一篇通

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 的机密性。



相关文章:

JWT一篇通

JWT 是什么? JWT(JSON Web Token)是一种开放的标准,标准的编号是RFC7591。用于在不同实体之间安全地传输信息。它是基于 JSON 编码的令牌。 JWT 的组成 JWT由三个部分组成:头部(Header)、载荷…...

【2023-09-01】vue中自定义按钮设置disabled属性后,异常触发click事件

vue中自定义按钮设置disabled属性后,异常触发click事件 项目中自定义按钮,使用a标签实现。设置disabled属性后,点击可以触发click事件。 由于各种原因,项目中并未使用成熟的第三方组件库,例如element-ui,a…...

nginx报错file not found解决

文章目录 一、nginx配置文件修改1.1 配置文件位置1.2 php fastcgi配置1.3 测试 二、nginxphp运行原理三、外网访问内网设置 采用nginxphp作为webserver的架构模式,在现如今运用相当广泛。然而第一步需要实现的是如何让nginx正确的调用php。由于nginx调用php并不是如…...

【力扣】96. 不同的二叉搜索树 <动态规划>

【力扣】96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n 3 输出:5 示例 2: 输入&am…...

Win11搭建 Elasticsearch 7 集群(一)

一: ES与JDK版本匹配一览表 elasticsearch从7.0开始默认安装了java运行环境,以便在没有安装java运行环境的机器上运行。如果配置了环境变量JAVA_HOME,则elasticsearh启动时会使用JAVA_HOME作为java路径,否则使用elasticsearch根目…...

哭了,python自动化办公,终于支持 Mac下载了

想了解更多精彩内容,快来关注程序员晚枫 大家好,这里是程序员晚枫,小红薯/小破站也叫这个名。 在我的主页发布的免费课程:给小白的《50讲Python自动化办公》,一直在更新中,昨晚12点多,有朋友在…...

【已更新建模代码】2023数学建模国赛B题matlab代码--多波束测线问题

一、 问题重述 1.1问题背景 海洋测深是测定水体深度与海底地形的重要任务,有两种主要技术:单波束测 深与多波束测深。单波束适用于简单任务,但多波束可提供更精确的地形数据。多 波束系统的关键在于覆盖宽度与重叠率的设计,以确保…...

GMSL技术让汽车数据传输更为高效(转)

目前,大部分车企都在其旗舰车型上配备了达到Level 2水平的自动驾驶技术,也就是高级自动驾驶辅助 ADAS系统。ADAS系统硬件主要由以下几部分组成,包括传感器、串行器、解串器、ADAS处理器等。 除了ADAS系统,包括传感器融合、音视频影…...

ARM+Codesys标准通用型控制器

整机工业级设计,通讯外设经过隔离保护 电源宽电压设计(9~36V DC ) 丰富的通讯接口,满足多种场合控制和通讯需求 四核工业级处理器,高性能,低功耗,高可靠性 机身无风扇设计,外壳小巧 搭载内核 100% 自主…...

YOLOV8从零搭建一套目标检测系统(修改model结构必看)附一份工业缺陷检测数据集

目录 1.YOLOV8介绍 2.YOLOV8安装 2.1环境配置 3.数据集准备 1.YOLOV8介绍 Yolov8结构图: YoloV8相对于YoloV5的改进点: Replace the C3 module with the C2f module. Replace the first 6x6 Conv with 3x3 Conv in the Backbone. Delete two Convs …...

Maven 的其它插件

文章目录 Maven 的其它插件dockerfile 插件Apache Maven Checkstyle Pluginp3c-pmd Maven 的其它插件 dockerfile 插件 dockerfile-maven-plugin 是 spotify 公司新提供的、用以替代 docker-maven-plugin 的插件,它同样是用于在 maven 中将当前项目打成一个 docke…...

系列十三、Java操作RocketMQ之带Key的消息

一、概述 RocketMQ中的消息,默认会有一个messageId当做消息的唯一标识,我们也可以给消息携带一个key,用作唯一标识或者业务标识,包括在控制面板(Dashboard,RocketMQ的一个可视化面板)中也可以使…...

C#调用Dapper

1-查询数据 string sql “查询语句”; using (SqlConnection con new SqlConnection(数据库连接信息)) { List<表结构实体类> list con.Query<表结构实体类>(sql).ToList(); } 2-执行sql string sql “UPDATE table1 SET column1 Name where id id”; using…...

2023高教杯数学建模1:ABC题目+初步想法

2023 ABC题目初步想法 写在最前面A题&#xff1a;定日镜场的优化设计问题1&#xff1a;建模将其抽象为数学公式问题2&#xff1a;固定部分参数&#xff0c;约束条件下的局部最优化问题可尝试方法 问题3&#xff1a;约束条件下的局部最优化问题附录&#xff1a;相关计算公式参考…...

ApachePulsar原理解析与应用实践(学习笔记一)

随着时代的发展&#xff0c;软件设计的理念也在不断发展&#xff0c;从单体服务、面向服务、微服务&#xff0c;发展到云原生以及无服务。其演变的过程是一个能力不断增强&#xff0c;领域边界不断微分细化的过程。比如无服务就是将函数作为服务&#xff0c;就类似dns模式的服务…...

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京财经大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京财经大学图书馆...

qt 信号与槽机制,登录界面跳转

登录界面跳转 配置文件 .pro QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # d…...

uniapp的两个跳转方式

uniapp内置多种跳转方式&#xff0c;我这里介绍两个最常用的跳转&#xff0c;uni.navigateTo和uni.switchTab&#xff0c;前者为跳转到非TabBar页面&#xff0c;后者为跳转到TabBar页面&#xff0c;所谓TabBar就是底部导航栏配置的页面&#xff0c;例如下方的index.vue。 在pa…...

【LeetCode】1654:到家的最少跳跃次数的解题思路 关于力扣无法return的BUG的讨论

文章目录 一、题目二、题解与代码三、神奇的BUG3.1 无法执行的 return 和 break 语句3.2 通过另一个 break 解决 一、题目 有一只跳蚤的家在数轴上的位置 x 处。请你帮助它从位置 0 出发&#xff0c;到达它的家。 跳蚤跳跃的规则如下&#xff1a; 它可以 往前 跳恰好 a 个位…...

Calico IP In IP模拟组网

Calico IP In IP模拟组网 网络架构 模拟组网 先在k8s-master-1节点执行如下命令&#xff1a; # 创建veth-pair设备对ip link add veth1 type veth peer name eth0# 创建ns1网络命名空间ip netns add ns1# 将eth0网卡插入ns1网络命名空间ip link set eth0 netns ns1# 为ns1网…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...