网易首页 > 网易号 > 正文 申请入驻

JWT、JWE、JWS 、JWK 都是什么鬼?还傻傻分不清?

0
分享至

作者:NinthDevilHunster
来源:www.freebuf.com/articles/web/180874.html

JWT 相信很多小伙伴都知道,JSON Web Token,如果在项目中通过 jjwt 来支持 JWT 的话,可能只需要了解 JWT 一个概念即可,但是现在很多时候我们可能不是使用 jjwt,而是选择 nimbus-jose-jwt 库,此时就有可能接触到一些新的概念,如 JWE、JWS。那么 JWE、JWS 以及 JWT 之间是什么关系呢?

最近看到一篇不错的文章讲这个,我们一起来看下,以下是正文。

JWT
























Private Claims 这些是为在同意使用它们的各方之间共享信息而创建的自定义声明,既不是注册声明也不是公开声明。上面的payload中,没有public claims只有private claims。最新面试题整理好了,点击小程序在线刷题。

JWS















"payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ",
"signatures":

"protected": "eyJhbGciOiJSUzI1NiJ9",
"header": { "kid": "2010-12-29" },
"signature":"signature1"
},
"protected": "eyJhbGciOiJSUzI1NiJ9",
"header": { "kid": "e9bc097a-ce51-4036-9562-d2ade882db0d" },
"signature":"signature2"
},

结构很容易理解。首先是payload字段,这个不用多讲,之后是signatures字段,这是一个数组,代表着多个签名。

点击关注公众号,Java干货及时送达


每个签名的结构如下:

  • protected:之前的头部声明,利用b64uri加密;

  • header:JWS的额外声明,这段内容不会放在签名之中,无需验证;

  • signature:也就是对当前header+payload的签名。

JWE JWE 相关概念

JWE是一个很新的概念,总之,除了jwt的官方手册外,很少有网站或者博客会介绍这个东西。也并非所有的库都支持JWE。这里记录一下自己看官方手册后理解下来的东西。

JWS是去验证数据的,而JWE(JSON Web Encryption)是保护数据不被第三方的人看到的。通过JWE,JWT变得更加安全。

JWE和JWS的公钥私钥方案不相同,JWS中,私钥持有者加密令牌,公钥持有者验证令牌。而JWE中,私钥一方应该是唯一可以解密令牌的一方。

在JWE中,公钥持有可以将新的数据放入JWT中,但是JWS中,公钥持有者只能验证数据,不能引入新的数据。因此,对于公钥/私钥的方案而言,JWS和JWE是互补的。

一个JWE,应该是如下形式的:

eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.
UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_
i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKxYxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8Otv
zlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTPcFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A.
AxY8DCtDaGlsbGljb3RoZQ.
KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.
9hH0vgRfYgPnAHOd8stkvw

如你所见JWE一共有五个部分,分别是:

  • The protected header,类似于JWS的头部;

  • The encrypted key,用于加密密文和其他加密数据的对称密钥;

  • The initialization vector,初始IV值,有些加密方式需要额外的或者随机的数据;

  • The encrypted data (cipher text),密文数据;

  • The authentication tag,由算法产生的附加数据,来防止密文被篡改。

JWE 密钥加密算法

一般来说,JWE需要对密钥进行加密,这就意味着同一个JWT中至少有两种加密算法在起作用。但是并非将密钥拿来就能用,我们需要对密钥进行加密后,利用JWK密钥管理模式来导出这些密钥。JWK的管理模式有以下五种,分别是:

  • Key Encryption

  • Key Wrapping

  • Direct Key Agreement

  • Key Agreement with Key Wrapping

  • Direct Encryption

并不是所有的JWA都能够支持这五种密钥管理管理模式,也并非每种密钥管理模式之间都可以相互转换。可以参考Spomky-Labs/jose中给出的表格:

https://github.com/Spomky-Labs/jose/blob/master/doc/operation/Encrypt.md

至于各个密钥管理模式的细节,还请看JWT的官方手册,解释起来较为复杂。另外,Java系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。

JWE Header

就好像是JWS的头部一样。JWE的头部也有着自己规定的额外声明字段,如下所示:

  • type:一般是 jwt

  • alg:算法名称,和JWS相同,该算法用于加密稍后用于加密内容的实际密钥

  • enc:算法名称,用上一步生成的密钥加密内容的算法。

  • zip:加密前压缩数据的算法。该参数可选,如果不存在则不执行压缩,通常的值为 DEF,也就是deflate算法

  • jku/jkw/kid/x5u/x5c/x5t/x5t#S256/typ/cty/crit:和JWS额额外声明一样。

JWE 的加密过程

步骤2和步骤3,更具不同的密钥管理模式,应该有不同的处理方式。在此只罗列一些通常情况。

推荐一个 Spring Boot 基础教程及实战示例:https://github.com/javastacks/spring-boot-best-practice

之前谈及,JWE一共有五个部分。现在来详细说一下加密的过程:

  1. 根据头部alg的声明,生成一定大小的随机数;

  2. 根据密钥管理模式确定加密密钥;

  3. 根据密钥管理模式确定JWE加密密钥,得到CEK;

  4. 计算初始IV,如果不需要,跳过此步骤;

  5. 如果ZIP头申明了,则压缩明文;

  6. 使用CEK,IV和附加认证数据,通过enc头声明的算法来加密内容,结果为加密数据和认证标记;

  7. 压缩内容,返回token。

base64(header) + '.' +base64(encryptedKey) + '.' + // Steps 2 and 3base64(initializationVector) + '.' + // Step 4base64(ciphertext) + '.' + // Step 6base64(authenticationTag) // Step 6
多重验证与JWE序列化

和JWS类似,JWE也定义了紧凑的序列化格式,用来完成多种形式的加密。大致格式如下所示:


"protected": "eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0",
"unprotected": { "jku":"https://server.example.com/keys.jwks" },
"recipients":[
"header": { "alg":"RSA1_5","kid":"2011-04-29" },
"encrypted_key":
"UGhIOguC7Iu...cqXMR4gp_A"
},
"header": { "alg":"A128KW","kid":"7" },
"encrypted_key": "6KB707dM9YTIgH...9locizkDTHzBC2IlrT1oOQ"
],
"iv": "AxY8DCtDaGlsbGljb3RoZQ",
"ciphertext": "KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY",
"tag": "Mz-VPPyU4RlcuYv1IwIvzw"

结构很容易理解,如下所示:

  • protected:之前的头部声明,利用b64uri加密;

  • unprotected:一般放JWS的额外声明,这段内容不会被b64加密;

  • iv:64加密后的iv参数;

  • add:额外认证数据;

  • ciphertext:b64加密后的加密数据;

  • recipients:b64加密后的认证标志-加密链,这是一个数组,每个数组中包含了两个信息;

  • header:主要是声明当前密钥的算法;

  • encrypted_key:JWE加密密钥。

JWT 的工作原理

这里通过juice shop来说下jwt是如何工作的。在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web令牌。如下所示:往此时,返回了jwt的令牌。

每当用户想要访问受保护的路由或资源时,用户将使用承载【bearer】模式发送JWT,通常在Authorization标头中。标题的内容应如下所示:

Authorization: Bearer

随后,服务器会取出token中的内容,来返回对应的内容。须知,这个token不一定会储存在cookie中,如果存在cookie中的话,需要设置为http-only,防止XSS。另外,还可以放在别的地方,比如localStorage、sessionStorage。如果使用vue的话,还可以存在vuex里面。

另外,如果在如Authorization: Bearer中发送令牌,则跨域资源共享(CORS)将不会成为问题,因为它不使用cookie。

此时,去访问认证页面,请求头如下所示,如预期所见,是利用Authorization:Bearer的请求头去访问的。

之前看JWT的时候看到论坛里的一个话题,觉得很有意思,用自己的理解来说一下:

https://stackoverflow.com/questions/38588319/understanding-rsa-signing-for-jwt。

首先,我们必须明确一点,无论用的是 HMAC,RSASSA,ECDSA;密钥,公钥,私钥都不会发送给客户端,仅仅会保留在服务端上。

对称的算法HMAC适用于单点登录,一对一的场景中。速度很快。

但是面对一对多的情况,比如一个APP中的不同服务模块,需要JWT登录的时候,主服务端【APP】拥有一个私钥来完成签名即可,而用户带着JWT在访问不同服务模块【副服务端】的时候,副服务端只要用公钥来验证签名就可以了。从一定程度上也减少了主服务端的压力。

当然,还有一种情况就是不同成员进行开发的时候,大家可以用统一的私钥来完成签名,然后用各自的公钥去完成对JWT的认证,也是一种非常好的开发手段。

因此,构建一个没有多个小型“微服务应用程序”的应用程序,并且开发人员只有一组的,选择HMAC来签名即可。其他情况下,尽量选择RSA。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
曾仕强:连蜜蜂和苍蝇都避开的食物,为什么我们却天天吃?

曾仕强:连蜜蜂和苍蝇都避开的食物,为什么我们却天天吃?

夸大其词的说
2026-07-02 16:48:06
普京1亿超级游艇突发北逃!两艘军舰死死护航,北约全线跟踪

普京1亿超级游艇突发北逃!两艘军舰死死护航,北约全线跟踪

一曲一场談
2026-07-04 16:25:26
玄学提醒:不要让任何人去你家,记住,是任何人

玄学提醒:不要让任何人去你家,记住,是任何人

背包旅行
2026-07-04 16:24:16
5场犯规66次!巴拉圭被讽世界杯最脏队 全队拒绝道歉:你们得接受

5场犯规66次!巴拉圭被讽世界杯最脏队 全队拒绝道歉:你们得接受

风过乡
2026-07-05 10:02:02
9.37吨战略物资偷运日本,这不是走私,是叛国!

9.37吨战略物资偷运日本,这不是走私,是叛国!

华山穹剑
2026-07-04 20:30:02
窦文涛戳破内娱访谈虚伪真相,录 5 分钟叫停顶流女星采访

窦文涛戳破内娱访谈虚伪真相,录 5 分钟叫停顶流女星采访

南万说娱26
2026-07-05 09:04:00
撕破脸了!郭德纲曝儿子猛料仅24小时,杨议怒骂,郭汾阳成赢家

撕破脸了!郭德纲曝儿子猛料仅24小时,杨议怒骂,郭汾阳成赢家

书慧我心
2026-07-04 13:55:59
榜眼首秀28分8失误!探花首秀15分4板4助!状元迪班萨没有退路

榜眼首秀28分8失误!探花首秀15分4板4助!状元迪班萨没有退路

世界体育圈
2026-07-05 11:40:35
中方代表团刚到德黑兰,就得到伊朗三号人物的接见

中方代表团刚到德黑兰,就得到伊朗三号人物的接见

共工之锚
2026-07-05 00:18:54
詹姆斯去向逐渐尘埃落定,布朗尼离开湖人后的下家也逐渐清晰

詹姆斯去向逐渐尘埃落定,布朗尼离开湖人后的下家也逐渐清晰

夜白侃球
2026-07-05 12:27:56
王楚钦也没想到,男单全军覆没不到24小时,樊振东传来重磅好消息

王楚钦也没想到,男单全军覆没不到24小时,樊振东传来重磅好消息

林子说事
2026-07-05 10:29:47
陈奕迅女儿首度回应父亲买1.8亿港元豪宅:没跟我说,可能送给他自己的,也可能是“扩张”我们的家;此前网友猜测是为女儿准备的“嫁妆”

陈奕迅女儿首度回应父亲买1.8亿港元豪宅:没跟我说,可能送给他自己的,也可能是“扩张”我们的家;此前网友猜测是为女儿准备的“嫁妆”

鲁中晨报
2026-07-03 17:58:17
魏银仓设局骗走董明珠26亿跑路!蛰伏7年铁娘子逆风翻盘狂赚百亿

魏银仓设局骗走董明珠26亿跑路!蛰伏7年铁娘子逆风翻盘狂赚百亿

奇思妙想生活家
2026-07-05 09:45:31
NBA夏联:爵士加时1分险胜老鹰 榜眼彼得森首秀28+8失误

NBA夏联:爵士加时1分险胜老鹰 榜眼彼得森首秀28+8失误

醉卧浮生
2026-07-05 07:03:55
江苏一家三口新疆“网红公路”自驾游突遇山洪,母子被冲走失联6天,孩子事发前一天刚过11岁生日,孩子父亲:只想尽快找到妻儿

江苏一家三口新疆“网红公路”自驾游突遇山洪,母子被冲走失联6天,孩子事发前一天刚过11岁生日,孩子父亲:只想尽快找到妻儿

台州交通广播
2026-07-04 22:06:55
0-3!输球不可怕,可怕的是加拿大主帅赛后这番话,发布会逆转!

0-3!输球不可怕,可怕的是加拿大主帅赛后这番话,发布会逆转!

田先生篮球
2026-07-05 06:59:16
风波升级!中国企业败诉法国LV,赔1030万只是开胃菜,网友支大招

风波升级!中国企业败诉法国LV,赔1030万只是开胃菜,网友支大招

小陆搞笑日常
2026-07-04 19:54:36
詹姆斯在阿克伦和高中队友重聚,骑士助理总经理在列

詹姆斯在阿克伦和高中队友重聚,骑士助理总经理在列

懂球帝
2026-07-05 14:29:07
“达赖”和“班禅”到底哪个地位更高,谁才是真正的掌权者?

“达赖”和“班禅”到底哪个地位更高,谁才是真正的掌权者?

南书房
2026-07-01 19:20:06
投资25万亿韩元,三星SDI扩产全固态、钠电池

投资25万亿韩元,三星SDI扩产全固态、钠电池

IT之家
2026-07-05 11:05:08
2026-07-05 15:04:49
奋斗在IT
奋斗在IT
聚焦IT风云,谱写奋斗历程
1557文章数 21612关注度
往期回顾 全部

科技要闻

华为:逻辑折叠将大幅提升麒麟CPU核心频率

头条要闻

日本史上最年轻民选女市长因休16周产假遭全国围攻

头条要闻

日本史上最年轻民选女市长因休16周产假遭全国围攻

体育要闻

姆巴佩点走巴拉圭:巴黎三代左锋传承

娱乐要闻

王力宏成都舞台受伤 仍然坚持三小时

财经要闻

揭秘跨境“对敲”换汇黑产

汽车要闻

方程豹钛9内饰曝光 用上了长联屏设计/下半年上市

态度原创

本地
亲子
旅游
游戏
军事航空

本地新闻

国内足球之旅?这座小城给你高分答案

亲子要闻

在@我是机灵姐家里,我看到有爱的家庭养出了孩子最好的模样。

旅游要闻

巴城正仪老街懒人玩法,必逛必吃全帮你排好

3年不登录PSN索尼删你账号!老条款被翻出再引争议

军事要闻

普京与特朗普通话85分钟 细节公布

无障碍浏览 进入关怀版