一文理解 JWT、JWS、JWE、JWA、JWK、JOSE

article/2025/9/22 21:40:02

原文收录

GitBook——统一接口认证解决方案

JsonWebToken

关于JsonWebToken的专业名词解释:

  • unsecured JWT:默认头部{“alg”: “none”}的jwt令牌
  • JWS(SignedJWT):已签名的jwt,包含标准jwt结构:header、payload、signature
  • JWE(EncryptedJWT):已加密的jwt,结构为:
  • JWA:所涉及的密码学算法
  • JWK:密码学算法所需的密钥

JsonWebToken主体分为三个部分:header、payload、signature

unsecured JWT结果示例:

eyJhbGciOiJub25lIn0.
eyJqdGkiOiJkZWJhNzhiZDZiNTI0ZTA2OWE4MmZjZTJlNzdmOTU2MSIsImlzcyI6Ik1hdGVNYXN0ZXIiLCJzdWIiOiLmnInmlYjotJ_ovb3mtYvor5UiLCJhdWQiOiJhdWRpZW5jZSIsImV4cCI6MTY3MDExNzIzMywibmJmIjoxNjcwMDMwODkzLCJpYXQiOjE2NzAwMzA4MzN9.
  • header
{"alg": "HS256","typ": "JWT","cty": ""
}

在这里插入图片描述

  • payload
    有效负载一般分为两类:用户自定义、标准注册负载(iss、sub、aud、exp、nbf、iat、jti)
    在这里插入图片描述
{"jti": "4a9813f957b84dda8091510402e7c33d","iss": "MateMaster","sub": "有效负载测试","aud": "audience","exp": 1670054958,"nbf": 1669968618,"iat": 1669968558
}

JWS

JWS(Signed JWT)compact序列化主要生成流程:
在这里插入图片描述
结果示例

eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.
eyJpc3MiOiJtYXRlbWFzdGVyIiwic3ViIjoiandzIiwiYXVkIjoiYXVkaWVuY2UiLCJleHAiOjE2NzAwMzQ4NjEsImlhdCI6MTY3MDAzNDgwMSwibmJmIjoxNjcwMDM0ODAxLCJqdGkiOiIzNTA3M2FhYmMxMmU0ZDUzOTBkNGNjOGFlYzVhNmVlYyJ9.
pKhj-QPDszduhet_SZW6BfsLX0n88D__YvIHvfj87OSitCRq1ybb7Bc3ClZZfhf_ewgrhVUL4d4WK0JuCkl0gA

难点:

  • 什么是JWS JSON Serialization?
  • JWS header claims的各个参数(除标准jwt之外的参数)作用?

JWS JSON序列化
JWS JSON 序列化形式(多个签名)

{"payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogIm h0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ","signatures": [{"protected": "eyJhbGciOiJSUzI1NiJ9","header": {"kid": "2010-12-29"},"signature": "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AA uHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAyn RFdiuB--f_nZLgrnbyTyWzO5vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB _eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6 IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlU PQGe77Rw"},{"protected": "eyJhbGciOiJFUzI1NiJ9","header": {"kid": "e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDx w5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"}]
}

扁平化JWS JSON 序列化形式(单个签名)

{"payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQog Imh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ","protected": "eyJhbGciOiJFUzI1NiJ9","header": {"kid": "e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFC gfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"
}

JSON 序列化与 compact序列化的区别:

  1. Json序列化结果为标准的json格式对象包含:payload、signatures 而compact序列化结果为 header.payload.signature
  2. json序列化支持两种header:protected和unprotected,compact只支持protected。ps:protected与unprotected代表这个header是否被签名验证
  3. json序列化支持多个签名,每个签名内容包含在signatures数组

JWS JSON字段含义
payload:base64编码的JWT负载字符串
protected:base64编码的JWS头部字符串,包含的声明受到签名保护
signatures:签名数组,header:不受签名保护的header,在unprotected header中是必须的,在protected中是可选的,signature:base64编码的JWS签名字符串

在这里插入图片描述
重点知识:
在JWS中,Share SecretKey,各方都可以验证和生成令牌。在公钥/私钥中,只有私钥可以验证、生成令牌,公钥只可以验证令牌,不能用于生成令牌
从生产者与消费者角度理解JWS
在这里插入图片描述
在这里插入图片描述

JWE

JWE(Encrypted JWT)compact序列化主要生成流程:

  1. 根据alg声明算法,生成所需的随机数
  2. 依据密钥管理方式确定CEK
  3. 依据密钥管理方式确定JWE Encrypt Key
  4. 计算初始化向量(如果需要)
  5. 压缩文本内容(如果需要)
  6. 使用CEK、IV或AAD加密数据

JWE(Encrypted JWT)compact序列化组成部分:

base64(header)
base64(encryptedKey) [step 2,3]
base64(initializationVector) [step 4]
base64(cipherText) [step 6]
base64(authenticationTag) [step 6]

eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.
Y2DxdVnvuDwo5vutvvPg4PpGQKFmRxWoDUCtfs58Gv5rJ4J1RkSOUQ.
-Iu2VusgO_w0uWrn0JWx3Q.
krW8miBqh5x3dZ6ktf0C_A.
HHYK0TxHth2949NDPpwTsw

重点知识:
在JWE中,Share SecretKey,各方都可以加密解密令牌。在对称加密中,只有公钥可以加密数据,私钥解密
从生产者与消费者角度理解JWE
在这里插入图片描述

JWK

JWK的出现旨在,为不同加密密钥提供一个统一的格式标准
JWK样例

{"kty": "EC","crv": "P-256","x": "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4","y": "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM","d": "870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE","use": "enc","kid": "1"
}

持续更新中…………


http://chatgpt.dhexx.cn/article/7hSgC5BS.shtml

相关文章

JWS入门

JWS简介 JWS主要用来通过网络部署你的应用程序,它具有安全、稳定、易维护、易使用的特点。用户访问用JWS部署应用程序的站点,下载发布的应用程序,既可以在 线运行,也可以通过JWS的客户端离线运行已下载的应用程序。对同一个应用程…

【C语言】判断一个数是否是完全平方数(两种解法)

题目: 判断一个数是否是完全平方数。 以下数字为完全平方数:42*2,93*3,14412*12,16913*13 有两个方法,可以求完全平方数: 方法一:输入一个数,遍历所有比这个数小的数,只要有其中一个数满足条件…

C语言 输入10个数,将其中最小的数与第一个数对换,将最大的数与最后一个数对换

#include <stdio.h> void input(int *number){ //定义输入10个数的函数int i;printf("请输入10个整数:\n");for(i0;i<10;i)scanf("%d",&number[i]); } void max_min_value(int *number){ //交换函数int *max,*min,*p,temp;maxminnumber; //开…

C语言判断一个数是奇数还是偶数

#include <stdio.h> void main() { int n; scanf("%d",&n); //运用scanf函数可以输入想要的数字 //也可以采用int n&#xff08;取一个数&#xff09;进行运算 if(n%20)//if函数注意&#xff0c;%是取余 printf("%d是一个偶…

python判断三位数水仙花数_Python如何判断一个数字是否为水仙花数

水仙花数是一个三位数,并且每一位数字的三次方的和还等于这个数字。 下面我们来看一下如何用Python判断这个数字是否为水仙花数 工具/原料 电脑 Python开发工具 方法/步骤 1 创建一个变量s,用input代码和用户交互,代码如下: s = input("请输入一个数字:"…

c语言判断一个数是否是素数

1&#xff1a;什么是素数 素数就是一个数只能被1和他本身整除的数我们称之为素数。例如13&#xff0c;17&#xff0c;19一类的数。 2&#xff1a;求出一个数是否是素数的思路 素数是只能被1和本身整除的数&#xff0c;那么如果设这个数为n&#xff0c;那么它就不能被2~n-1整…

python用函数判断一个数是否为素数,python分享是否为素数 python输入并判断一个数是否为素数...

python输入并判断一个数是否为素数 x=int(input("x\n")); i=2; for i in range(2,x+1): if(x%i==0): break;if(i==x and i。 用python 判断一个数是否是素数 小编觉得小编的程序是对的但为什么没办法运行,那个弹出来的窗口是啥意思小编曾千万次的请分享:不要逼小编…

python中判断一个数是否为素数_怎么用python判断一个数是否是素数

先来看下什么是质数&#xff1a; 质数(Prime number)&#xff0c;又称素数&#xff0c;指在大于1的自然数中&#xff0c;除了1和该数自身外&#xff0c;无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数)。 简单来说就是&#xff0c;只能除以1和自身的数(需要大…

取到一个数的各个位的方法

计算方式如下&#xff1a; 个位&#xff1a;用这个数除以1对10取余&#xff0c;num / 1 % 10; 因为1除以&#xff08;除了0以外&#xff09;任何数都等于这个数的倒数&#xff0c;所以计算个位可以直接对10取余&#xff08;num%10&#xff09; 来获得。 十位&#xff1a;除以…

得到一个数每一位数字的几种方法

1.&#xff08;最简单暴力&#xff09;直接将数字转换为字符串&#xff0c;然后转换为字符数组输出。 int n12345;char[] charsString.valueOf(n).toCharArray();for(int j0;j<chars.length;j){System.out.print(chars[j]" ");}2.整除法。 int n12345;List<Int…

Html5超链接重置为link状态,去除a标签下划线 html超链接更改颜色和去掉下划线

去掉a标签下划线&#xff1a; 对超链接下划线设置 使用代码"text-decoration" 语法&#xff1a; text-decoration : none || underline || blink || overline || line-through text-decoration参数&#xff1a; none : 无装饰 blink : 闪烁 underline : 下划线 line-…

html5 a标签去下划线,css中如何去掉a标签的下划线?

我们在HTML网页制作过程中&#xff0c;相信大家对css文本超链接这个概念并不陌生。我们都知道想要给某段文本或者指定元素添加一个锚点也就是超链接需要用到HTML中的a标签。 那么有的新手可能就会发现&#xff0c;在使用a标签时文本超链接会自动出现下划线&#xff01;从视觉美…

css中怎么消除a的下划线,如何使用css去掉a标签的下划线?(代码详解)

写html超链接的时候&#xff0c;超链接总是自带下划线&#xff0c;如果不需要下划线&#xff0c;我们需要将其去掉&#xff0c;下面我们就来说一下怎么去掉下划线。 我们在使用超链接的时候&#xff0c;下划线总是伴随着出现&#xff0c;从视觉上来说有着下划线的a标签总是感觉…

MySQL数据库常用命令

活动地址&#xff1a;CSDN21天学习挑战赛 1.对数据库常用命令 1.连接数据库 mysql -u用户名 -p密码 2.显示已有数据库 show databases; 3.创建数据库 create database sqlname; 4.选择数据库 use database sqlname; 5.显示数据库中的表&#xff08;先选择数据库&#xff09; sh…

mysql命令更新数据库_命令操作MySQL数据库

一、连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1、 连接到本机上的MYSQL。 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码. 如…

微信小程序小说阅读器/在线故事阅读丨可以android studio运行

《微信小程序小说阅读器后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统&#xff0c;该后台采用前后台前后分离的形式使用JavaVUE 微信小程序——前台涉及技术&#xff1a…

微信读书护眼版

微信读书是我目前发现的比较好用的读书平台之一&#xff0c;电子书资源丰富&#xff0c;界面风格还挺舒服&#xff0c;支持app和网页版&#xff0c;唯一难受的就是网页版的背景显示方案太少了&#xff0c;只能切换浅色和深色两种&#xff0c;上班想摸鱼看会书&#xff0c;直刺得…

微信读书产品体验报告

微信读书【5.0.5】产品体验报告 本文预览 微信读书凭借着简洁的风格、丰富的电子版权以及良好的推书、读书的阅读氛围获得了一大批粉丝&#xff0c;在现今短视频类应用占据用户大量时间的今天&#xff0c;为何微信读书像一股清流抓住了用户注意力&#xff0c;它又是怎么去实现…

微信小程序图书阅读项目 (:

获取项目源代码&#xff1a;扫码下方小程序获取或者加作者微信获取 1.简介 小程序图书阅读项目是使用uni-app编写的小程序图书阅读项目&#xff0c;项目前后端分离&#xff0c;小程序使用uni-app&#xff0c;后台管理使用vue2elementUI,后端使用SpringBootSpringCloudAlibaba编…

真的!?在阅读体验感上赢过微信读书?

把书读薄&#xff0c;是多少人读多少书都不一定能做到的事啊&#xff0c;在现在&#xff0c;学生无纸化学习&#xff0c;职场人无纸化办公&#xff0c;海量的图书文件全都存储在轻便的移动端上&#xff0c;不就是把书阅读越薄了。 电子书阅读APP微信读书注册用户数2.1亿&#…