15-JOSE规范

网友投稿 575 2022-10-07

15-JOSE规范

15-JOSE规范

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

JOSE简介

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

JWS

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

JWS 序列化

JWS的序列化分为JWS Compact Serialization和JWS 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":"", "signatures":[ {"protected":"", "header":"“, "signature":""}, {"protected":"", "header":"", "signature":""} ] }

平铺格式为:

{ "payload":"", "protected":"", "header":"", "signature":"" }

举个一般格式的例子:

{ "payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjE", "signatures":[ {"protected":"eyJhbGciOiJSUzI1NiJ9", "header":{"kid":"2010-12-29"}, "signature":"cC4hiUPoj9Eetdgtv3hF80EGrhu" }, {"protected":"eyJhbGciOiJFUzI1NiJ9", "header": {"kid":"e9bc097a-ce51-4036-9562-d2ade882db0d"}, "signature":"DtEhU3ljbEg8L38VWAfUAqOyKAM" } ]}

JWE

JWE 的出现就是为了解决这个问题的。具体的可以看下图:

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

eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ. OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8 1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi 6UklfCpIMfIjf7iGdXKHzg. 48V1_ALb6US04U3b. 5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji SdiwkIr3ajwQzaBtQD_A. XFBoMYUZodetZdvTiFvSkQ

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

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

JWT和JWS、JWE的关系

以下是​​RFC7519​​对JWT的说明:

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

JWT有特定的​​claims​​​,这些​​claims​​以JSON的形式组成​​Payload​​。JWT可以是JWS或者JWE。JWT的序列化方式只能使用Compact Serialization方式序列化为字符串,不能是JSON Serialization。

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

另外,我们通常读作​​J​​​、​​W​​​、​​T​​​,实际建议读作​​jot​​(角特),关于JWT的定义和规范请参阅​​RFC7519​​。

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​​的定义,JWK JSON对象可能包含以下属性:

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

JWK Set

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

{"keys": [ {"kty":"EC", "crv":"P-256", "x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4", "y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM", "use":"enc", "kid":"1"}, {"kty":"RSA", "n": "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx 4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMs tn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2 QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbI SD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqb w0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw", "e":"AQAB", "alg":"RS256", "kid":"2011-04-29"} ] }

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

JWA

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

你可以通过​​这个网站​​自行使用一些算法生成JWK观察不同算法之间的区别。

小结

这里主要对JOSE规范进行简单的介绍了解,了解这些对后面我们学习JOSE类库有很好的帮助。除非你要造相关的轮子,否则不需要太深入了解。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序开发之animation循环动画实现让云朵飘的效果(小程序 animation)
下一篇:10-微信OAuth2授权登录
相关文章

 发表评论

暂时没有评论,来抢沙发吧~