Logo Logo
GitHub Designed by Logto

什麼是 JSON Web Key (JWK)?

JSON Web Key (JWK) 是用於表示加密密鑰的基於 JSON 的格式。它在 JSON Web Signature (JWS) JSON 網路加密 (JSON Web Encryption, JWE) 中廣泛使用,用於驗證 JSON Web Tokens 的完整性和機密性。它也在 OpenID Connect (OIDC) 中用於身份和存取管理 (Access Control)。

例如,一個 PEM 編碼的 ECDSA 公鑰:

-----BEGIN PUBLIC KEY-----
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEF/xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4
f1Qx3y49cUm646fMBX9DYx+43HzXm6VdX77uFymz90aO4dBunpTdUzLFRAiT7+In
gzZGDrIE+FG6CcqQuRP65r65SUzDOmP5
-----END PUBLIC KEY-----

可以表示為 JWK:

{
  "kty": "EC",
  "crv": "P-384",
  "x": "F_xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4f1Qx3y49cUm646fMBX9DYx-43HzXm6Vd",
  "y": "X77uFymz90aO4dBunpTdUzLFRAiT7-IngzZGDrIE-FG6CcqQuRP65r65SUzDOmP5"
}

JWK 如何工作?

由於 JWK 是一種基於 JSON 的格式,相較於傳統的 PEM 格式,它可以攜帶更豐富的密鑰元數據。以下是 JWK 中的一些常見屬性:

  • kty (Key Type):與密鑰一起使用的加密算法系列。常見值包括 RSAECoctEC RFC 7518 中被標記為 “Recommended+”。
  • use (Public Key Use):公鑰的預期用途。常見值包括 sig (簽名) 和 enc (加密)。
  • key_ops (Key Operations):密鑰支持的操作。常見值包括 signverifyencryptdecrypt
  • alg (Algorithm):預期與密鑰一起使用的算法。根據密鑰類型,算法可能有所不同。例如,RS256 可能與 RSA 密鑰一起使用,而 ES256 可能與 EC 密鑰一起使用。
  • kid (Key ID):密鑰的唯一標識符。可以用於在一組密鑰中匹配特定密鑰。

kty 外,所有其他屬性都是可選的,可以用於提供有關密鑰的額外上下文。根據 kty 的值,其他屬性可能是必需的或可選的。在上述示例中,JWK 表示一個帶有 P-384 曲線的 ECDSA 密鑰 (kty: "EC")。xy 屬性包含公鑰坐標。

以下是另一個非規範的 RSA 公鑰 JWK 示例:

{
  "kty": "RSA",
  "use": "sig",
  "alg": "RS256",
  "n": "0vx7agoebGcQSuuPiLJXZpt...-TmV4HCA1T8jXg3fE2VbA",
  "e": "AQAB",
  "kid": "2011-04-29-1234"
}

有關 JWK 屬性及其含義的詳細信息,請參閱 RFC 7517

JSON Web Key Set (JWKS)

當需要將多個 JWK 組合在一起時,它們會被組織成 JSON Web Key Set (JWKS)。JWKS 是一個 JSON 對象,包含一個 JWK 的數組。它常用於 OpenID Connect (OIDC) 發現 (Discovery) jwks_uri 端點的響應中,以提供 JWT 簽名密鑰 (Signing key) 驗證的公鑰。

以下是包含兩個 JWK 的 JWKS 的非規範示例:

{
  "keys": [
    {
      "kty": "RSA",
      "use": "sig",
      "alg": "RS256",
      "n": "0vx7agoebGcQSuuPiLJXZpt...-TmV4HCA1T8jXg3fE2VbA",
      "e": "AQAB",
      "kid": "2011-04-29-1234"
    },
    {
      "kty": "EC",
      "crv": "P-384",
      "x": "F_xQdbOho2Jw0hgmNPD0VAEPAgkQrfD4f1Qx3y49cUm646fMBX9DYx-43HzXm6Vd",
      "y": "X77uFymz90aO4dBunpTdUzLFRAiT7-IngzZGDrIE-FG6CcqQuRP65r65SUzDOmP5"
    }
  ]
}

在此示例中,JWKS 包含兩個 JWK:一個 RSA 密鑰和一個 EC 密鑰。keys 屬性是一個 JWK 的數組,每個都代表不同的密鑰。

另見