JOSE是⼀个框架,旨在提供⼀种在各⽅之间安全地转移声明(如授权信息)的⽅法。JOSE框架提供了⼀系列规范来实现此⽬的。它是由⼀组规范构成:
JSON Web Token (JWT):JSON Web令牌(RFC7519),定义了⼀种可以签名或加密的标准格式;
JSON Web Signature (JWS):JSON Web签名(RFC7515) , 定义对JWT进⾏数字签名的过程;
JSON Web Encryption (JWE):JSON Web加密(RFC7516) , 定义加密JWT的过程;
JSON Web Algorithm(JWA):JSON Web算法(RFC7518) , 定义⽤于数字签名或加密的算法列表;
JSON Web Key (JWK):JSON Web密钥(RFC7517) , 定义加密密钥和密钥集的表⽰⽅式;
本⽂将介绍JOSE系列规范的各个组件。
JSON Web令牌(JWT)
JSON Web Token是⼀种可以签名或加密的标准格式。签名时,它使⽤JSON Web签名(JWS),加密
时,它使⽤JSON Web加密(JWE)。
JWT规范定义了七个可选的,已注册的声明,并允许公开和私⼈声明包含在令牌中,七个注册声明是:
声明描述
iss JWT的发⾏⼈
sub JWT所代表的主题
aud JWT的观众
exp JWT设置过期的时间
nbf JWT有效的时间
iat WT发布时的时间戳(发布时间)
jti JWT的唯⼀标识符(JWT ID)
公开声明可以通过特定⽤例进⾏注册。例如,OpenID Connect 1.0规范定义了诸如auth_time,acr和nonce之类的声明。组织可以使⽤私有声明来传达有关⾝份的特定声明(例如first_name,last_name,department)。由于这些索赔名称未注册,因此必须注意避免名称冲突。
JSON Web签名(JWS)
使⽤数字签名签名的JSON Web令牌使⽤JSON Web签名(JWS)规范。JWS由三个组件组成,即标头,有效负载和数字签名。这三个部分是Base64url编码并以句点分隔。
BASE64URLENCODE(<header>) + "." + BASE64URLENCODE(<payload>) + "." + BASE64URLENCODE(<signature>)
注意:JWT约定以base64 对url编码/解码。这与常规base64编码略有不同。有关Base64与Base64 URL安全编码的详细信息,请参阅RFC4648。
下⾯包含⼀个⽰例JWS:
dzY0ZoY3RVVDZEdHZiMiIsImlzcyI6Imh0dHBzOlwvXC9sb2NhbGhvc3Q6OTAzMSIsImlhdCI6MTM5NDA2MDg1MywiZXhwIjoxMzk0MDYx
MTUzLCJub25jZSI6ImU5NTdmZmJhLTlhNzgtNGVhOS04ZWNhLWFlOGM0ZWY5Yzg1NiIsImF0X2hhc2giOiJ3Zmd2bUU5VnhqQXVkc2w5bG
M2VHFBIn0.lr4L-oT7DJi7Re0eSZDstAdOKHwSvjZfR-OpdWSOmsrw0QVeI7oaIcehyKUFpPFDXDR0-RsEzqno0yek-_U-Ui5EM-yv0Pia
UOmJK1U-ws_C-fCplUFSE7SK-TrCwaOow4_7FN5L4i4NAa_WqgOjZPloT8o3kKyTkBL7GdITL8rEe4BDK8L6mLqHJrFX4SsEduPk0CyHJS
ykRqzYS2MEJlncocBBI4up5Y5g2BNEb0aV4VZwYjmrv9oOUC_yC1Fb4Js5Ry1t6P4Q8q_2ka5OcArlo188XH7lMgPA2GnwSFGHBhccjpxh
N7S46ubGPXRBNsnrPx6RuoR2cI46d9ARQ
qq签名发布JSON Web加密(JWE)
使⽤JSON Web加密(JWE)规范可以加密JWT。这可以⽤于令牌内容的附加机密性和安全性(除了在使⽤传输层安全性的传输期间令牌的安全性)。
JSON Web算法(JWA)
JWA规范定义了各⽅可⽤于签名或加密的标准算法列表。JWA签名算法包括:
“alg”值签名⽅法签名密钥
NONE没有数字签名N / A
HS256HMAC w / SHA-256哈希使⽤OAuth2客户端的客户端密钥
HS384HMAC w / SHA-384哈希使⽤OAuth2客户端的客户端密钥
HS512HMAC w / SHA-512哈希使⽤OAuth2客户端的客户端密钥
RS256RSA PKCS v1.5 w / SHA-256哈希公钥可从JWKS获得
RS384RSA PKCS v1.5 w / SHA-384哈希公钥可从JWKS获得
RS512RSA PKCS v1.5 w / SHA-512哈希公钥可从JWKS获得
ES256ECDSA w / P-256曲线和SHA-256哈希公钥可从JWKS获得
ES384ECDSA w / P-384曲线和SHA-384哈希公钥可从JWKS获得
ES512ECDSA w / P-521曲线和SHA-512哈希公钥可从JWKS获得
注意:接受使⽤“none”算法签名的令牌会产⽣安全隐患。如果令牌通过其他⽅式保护并且预期“none”算法,则开发⼈员应仅接受使
⽤“none”算法的JWT。
JSON Web Key (JWK)
JSON Web Key规范定义了⾮对称密钥如何以JSON格式表⽰,并引⼊了密钥集集合(JWKS),它为程序提供了发布其签名和加密密钥的⽅法。
给定以下JSON Web密钥集(JWKS)(OpenID Connect 1.0 JWKS),定义了两个密钥(ECDSA密钥和RSA密钥):
{
"keys":[
{
"kty":"EC",
"kid":"i0wng",
"use":"sig",
"x":"AXYMGFO6K_R2E3RH42_5YTeGYgYTagLM-v3iaiNlPKFFvTh17CKQL_OKH5pEkj5U8mbel-0R1YrNuraRXtBztcVO",
"y":"AaYuq27czYSrbFQUMo3jVK2hrW8KZ75KyE8dyYS-HOB9vUC4nMvoPGbu2hE_yBTLZLpuUvTOSSv150FLaBPhPLA2",
"crv":"P-521"
},
...
{
"kty":"RSA",
"kid":"i0wnn",
"use":"sig",
"n":"mdrLAp5GR8o5d5qbwWTYqNGuSXHTIE6w9HxV445oMACOWRuwlOGVZeKJQXHM9cs5Dm7iUfNVk4pJBttUxzcnhVCRf
9tr20LJB7xAAqnFtzD7jBHARWbgJYR0p0JYVOA5jVzT9Sc-j4Gs5m8b-am2hKF93kA4fM8oeg18V_xeZf11WWcxnW5YZwX
9kjGBwbK-1tkapIar8K1WrsAsDDZLS_y7Qp0S83fAPgubFGYdST71s-B4bvsjCgl30a2W-je9J6jg2bYxZeJf982dzHFqV
QF7KdF4n5UGFAvNMRZ3xVoV4JzHDg4xe_KJE-gOn-_wlao6R8xWcedZjTmDhqqvUw",
"e":"AQAB"
},
...]
}
注意:对于RSA密钥,“n”组件是模数,“e”组件是指数。两者都是base64urlencoded值。
发布评论