当前位置: 首页 > 工具软件 > jose > 使用案例 >

JOSE (Javascript对象签名和加密)框架介绍

郎羽
2023-12-01

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规范定义了七个可选的,已注册的声明,并允许公开和私人声明包含在令牌中,七个注册声明是:

声明描述
issJWT的发行人
subJWT所代表的主题
audJWT的观众
expJWT设置过期的时间
nbfJWT有效的时间
iatWT发布时的时间戳(发布时间)
jtiJWT的唯一标识符(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:

eyJhbGciOiJSUzI1NiIsImtpZCI6Imkwd25uIn0.eyJzdWIiOiJqb2UiLCJhdWQiOiJpbV9vaWNfY2xpZW50IiwianRpIjoidWY5MFNLNH 
dzY0ZoY3RVVDZEdHZiMiIsImlzcyI6Imh0dHBzOlwvXC9sb2NhbGhvc3Q6OTAzMSIsImlhdCI6MTM5NDA2MDg1MywiZXhwIjoxMzk0MDYx 
MTUzLCJub25jZSI6ImU5NTdmZmJhLTlhNzgtNGVhOS04ZWNhLWFlOGM0ZWY5Yzg1NiIsImF0X2hhc2giOiJ3Zmd2bUU5VnhqQXVkc2w5bG 
M2VHFBIn0.lr4L-oT7DJi7Re0eSZDstAdOKHwSvjZfR-OpdWSOmsrw0QVeI7oaIcehyKUFpPFDXDR0-RsEzqno0yek-_U-Ui5EM-yv0Pia 
UOmJK1U-ws_C-fCplUFSE7SK-TrCwaOow4_7FN5L4i4NAa_WqgOjZPloT8o3kKyTkBL7GdITL8rEe4BDK8L6mLqHJrFX4SsEduPk0CyHJS 
ykRqzYS2MEJlncocBBI4up5Y5g2BNEb0aV4VZwYjmrv9oOUC_yC1Fb4Js5Ry1t6P4Q8q_2ka5OcArlo188XH7lMgPA2GnwSFGHBhccjpxh 
N7S46ubGPXRBNsnrPx6RuoR2cI46d9ARQ

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值。

 类似资料: