2022年的开工福利已经发布,点击下面按钮获取最新PDF。

移动端兴起和OAuth2的流行导致JWT这几年火得一塌糊涂。今天要介绍另一个规范集JOSE[1],全称Javascript Object Signing and Encryption,它和JWT有莫大的关系。

JOSE简介

JOSE是一个Javascript对象签名和加密协议,目的是提供一种在各个通讯方之间安全传输声明( claims,例如授权信息 )的方法,它特意构建在JSONBASE64之上,以便在 Web应用程序中轻松使用。目前该规范还在不断地发展,我们常用的包含以下几个由RFC文档定义的概念:

JOSE规范集

JWT就可以用JWSJWE表示,稍后我会详细介绍这一方面的知识。

JWS

JSON Web签名,基于JSON数据结构、使用数字签名技术或者消息认证码技术保护的内容(MAC)都可以称为JWS。该规范使用的密码算法和标识符在另一个规范JWA中定义。规则是比较多的参见RFC7515[2],这里我们通过序列化来感受一下即可。

JWS 序列化

JWS的序列化分为JWS Compact SerializationJWS JSON Serialization两种。

JWS Compact Serialization

该序列化表示为一种URL安全的、紧凑的字符串。格式为:

BASE64URL(UTF8(JWS Protected Header)) || '.' ||BASE64URL(JWS Payload) || '.' ||BASE64URL(JWS Signature)

例如:

eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q

JWT通常就是这种格式。

JWS JSON Serialization

该序列化表示为一个JSON对象,有两种格式。一般格式为:

{"payload":"<payload contents>","signatures":[{"protected":"<integrity-protected header 1 contents>","header":"<non-integrity-protected header 1 contents>“,"signature":"<signature 1 contents>"},{"protected":"<integrity-protected header N contents>","header":"<non-integrity-protected header N contents>","signature":"<signature N contents>"}]}

平铺格式为:

{"payload":"<payload contents>","protected":"<integrity-protected header contents>","header":"<non-integrity-protected header contents>","signature":"<signature contents>"}

举个一般格式的例子:

{"payload":"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ","signatures":[{"protected":"eyJhbGciOiJSUzI1NiJ9","header":{"kid":"2010-12-29"},"signature":"cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"},{"protected":"eyJhbGciOiJFUzI1NiJ9","header":{"kid":"e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature":"DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"}]
}

JWE

JWS 仅仅是对声明(claims)作了签名,保证了其不被篡改,但是其 payload(中段负载) 信息是暴露的。也就是 JWS 仅仅能保证数据的完整性而不能保证数据不被泄露。它不适合传递敏感数据。JWE 的出现就是为了解决这个问题的。具体的可以看下图:

JWE示意图

从上面可以看出 JWE 的生成非常繁琐,作为 Token 可能比较消耗资源和耗时。用作安全的数据传输途径应该不错。举个例子:

eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGeipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDbSv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaVmqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je81860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi6UklfCpIMfIjf7iGdXKHzg.48V1_ALb6US04U3b.5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6jiSdiwkIr3ajwQzaBtQD_A.XFBoMYUZodetZdvTiFvSkQ

一共有五个部分,被四个英文句号隔开。

其实JWE也有对应的JSON格式,同样具有JWS的两种序列化方式,参见RFC7516[3]

JWT和JWS、JWE的关系

以下是RFC7519[4]JWT的说明:

JWT的定义

从上面可以得出一些结论:

  • JWT有特定的 claims,这些claims以JSON的形式组成Payload

  • JWT的结构可以是JWS或者JWE

  • JWT的序列化方式只能使用Compact Serialization,不能是JSON Serialization

简而言之,JWT是包含了特定claimsJWS或者JWE字符串。我们常见的大部分都属于JWS

另外,我们通常读作JWT,实际建议读作jot(角特),关于JWT的定义和规范请参阅RFC7519[5]

JWK

JWK是本文最重要的知识点,这对我们后面学习资源服务器(Resource Server)非常重要。

场景描述

我相信签名公私钥这个大家都不陌生。JWT本身也要做使用私钥进行签名防止信息被篡改,公钥用来发给下游消费方来验证JWT的可靠性。通常情况下,公钥的配置方式为静态文件集成,这有一个弊端,当上游公私钥进行了改动,下游就无法动态进行公钥适配。这就是JWK要解决的问题,它对密码算法和标识符进行了规范设计,它紧凑的JSON数据结构非常方便在上下游之间传输。

JWK 格式

JWK是表示加密密钥的JSON对象。该对象包含的key名称必须是唯一的,在此基础上JWK可以包含一些自定义字段。下面是一个P-256 EC(椭圆曲线离散密码)密钥的JWK表示:

{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","kid":"Public key used in JWS spec Appendix A.3 example"}

按照RFC7517[6]的定义,JWK JSON对象可能包含以下属性:

JWK的定义属性

根据不同的算法JWK还可能包含其它的属性。

JWK Set

JWK Set 表示一组具有不同kidJWK,这非常容易理解。它也是一个JSON对象,唯一的key就是keys。举个例子:

{"keys":[{"kty":"EC","crv":"P-256","x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4","y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM","use":"enc","kid":"1"},{"kty":"RSA","n": "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw","e":"AQAB","alg":"RS256","kid":"2011-04-29"}]}

OAuth2配置中的JWK Set URL就是输出JWK Set的端点。

JWA

JWA规范规定了哪些算法可以作为JWS和JWE的密码算法。还规定了这些算法对应的JWK中的alg属性,以及特定算法在JWK包含的属性例如前面EC算法中的crvxy,这些属性并不是一成不变的,它们会根据算法的迭代进行调整。如果你对JWA的细节感兴趣,请参阅RFC7518[7]

你可以通过JWK生成器[8]自行使用一些算法生成JWK观察不同算法之间的区别。

小结

今天对JOSE规范进行简单的介绍了解,对你学习OAuth2OIDC相关的知识非常有帮助。不要求深入但是一定要了解相关的知识。

参考资料

[1]

JOSE: https://datatracker.ietf.org/wg/jose/documents/

[2]

RFC7515: https://datatracker.ietf.org/doc/rfc7515/

[3]

RFC7516: https://datatracker.ietf.org/doc/rfc7516/

[4]

RFC7519: https://datatracker.ietf.org/doc/rfc7519/

[5]

RFC7519: https://datatracker.ietf.org/doc/rfc7519/

[6]

RFC7517: https://datatracker.ietf.org/doc/rfc7517/

[7]

RFC7518: https://datatracker.ietf.org/doc/rfc7518/

[8]

JWK生成器: https://mkjwk.org/

Spring Security即将弃用配置类WebSecurityConfigurerAdapter

2022-02-22

Spring Security的内置过滤器是如何维护的

2022-02-21

欢迎加入胖哥技术内卷群

2022-02-22

只知道JWT,那JWE、JWS、JWK、JWA呢?相关推荐

  1. JJWT:JWS, JWE, JWK, JWA, JWT

    JWS, JWE, JWK, JWA, JWT JWS:JSON Web Signature,Digital signature/HMAC specification(签名) JWE:JSON Web ...

  2. JWT、JWE、JWS 、JWK 到底是什么?该用 JWT 还是 JWS?

    JWT 相信很多小伙伴都知道,JSON Web Token,如果在项目中通过 jjwt 来支持 JWT 的话,可能只需要了解 JWT 一个概念即可,但是现在很多时候我们可能不是使用 jjwt,而是选择 ...

  3. 面试官: 你知道 JWT、JWE、JWS 、JWK嘛?

    想起了 之前做过的 很多 登录授权 的项目 它相比原先的session.cookie来说,更快更安全,跨域也不再是问题,更关键的是更加优雅 ,所以今天总结了一篇文章来介绍他 JWT 指JSON Web ...

  4. java开发中JWT、JWE、JWS 、JWK 都是干啥的

    什么是 JWT 一个JWT,应该是如下形式的: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ik ...

  5. JWT,JWE,JWS和RSA2

    JWT,以及与JWS和JWE之间的关系 简而言之,JWT是一种安全规范,主要用于在双方之间传递安全数据.而JWS和JWE是实现安全传输的两种方式,JWS用于对传输报文的签名与验签,JWE用于对敏感数据 ...

  6. 100个相见恨晚的Python库(建议收藏)

    大家好,我是一行 在python程序员成为大神之前,都不可避免的都要做一段时间的调包侠 那就算是调包侠也都会有自己调包秘籍,拿出来能让他人感叹"相见恨晚"的那种 Awesome P ...

  7. 100个相见恨晚的Python库

    大家好,我是一行 在python程序员成为大神之前,都不可避免的都要做一段时间的调包侠 那就算是调包侠也都会有自己调包秘籍,拿出来能让他人感叹"相见恨晚"的那种 Awesome P ...

  8. Python 第三方库大全看这一篇就够了(1000+工具包)

    awesome-python 是 vinta 发起维护的 Python 资源列表,内容包括:Web 框架.网络爬虫.网络内容提取.模板引擎.数据库.数据可视化.图片处理.文本处理.自然语言处理.机器学 ...

  9. 又在放大招!这个 Github 项目针对 Python 初学者!

    欢迎关注 ,专注 Python.数据分析.数据挖掘.好玩工具! 大家好,最近逛 Github 发现一个非常不错的项目,今天分享给大家.项目名称:awesome-python,它是一个 Python 资 ...

最新文章

  1. 基于空间数据库MongoDB实现全国电影票预定系统
  2. 32.3. redis-cli - Command-line client to redis-server
  3. icd植入是大手术吗_白内障手术为何要植入人工晶体?便宜的人工晶体会影响视力吗?...
  4. 网易2016年研发project师编程题(2)
  5. Swift基本语法学习笔记
  6. vi或vim查找替换
  7. ssis 列转换_SSIS中的术语提取转换
  8. 学术论文海报模板_论文深耕 | 第一次写学术论文无从下手?阅读写作套路来了!...
  9. 医疗器械信号输入输出部分,以及电气绝缘图,环境试验后的标准
  10. 愤怒的导数:一点可导和邻域内可导能推出来什么?
  11. CPU和内存的电路设计09-计数器的内部电路实现
  12. 中国大学MOOC测验爬取(下)
  13. 【计算机网络】第六部分 应用层(26) 远程登录、电子邮件与文件传输
  14. Spring中循环依赖详解
  15. 正方教务隐藏入口_正方教务系统小功能操作手册
  16. 5G+边缘计算 物联网嵌入式边缘计算平台
  17. 项目在使用easyui时遇到的问题
  18. lyse-building otp applications
  19. Spring自动装配及自动注入
  20. win10完整安装xgboost流程和截图,解决报错(dmlc-core、python setup.py install)(外加pip下载链接)

热门文章

  1. (极光推送)短信验证码
  2. Unity打包后窗口在PC端不按照设置的大小显示
  3. [Luogu P2597] [BZOJ 2815] [ZJOI2012]灾难
  4. oracle 提取中文字符串拼音首字母函数,拼音简码提取函数
  5. maven文件彻底修改名字 Java文件修改名字
  6. 【ZJOI2005】沼泽鳄鱼
  7. 如何从零起步学习AI
  8. CTF解题基本思路步骤(misc和web)
  9. STM8L051之通过ADC1与DMA读取内部参考电压,求取VDD电源电压---库函数版
  10. Java-Tomcat的请求参数解析分析