🚡
JOSEのRFCを読む(2) - JWK

myuon

myuon

2023年7月21日
RFC

JOSE関連のRFCを読んだので内容についてまとめます

# はじめに

の続きです。

# RFC7517 JSON Web Key (JWK)

JWK は暗号鍵を表現するための規格です。

JWK の例としては、例えば以下のような JSON がそうです。

{
  "kty": "EC",
  "crv": "P-256",
  "x": "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4",
  "y": "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM",
  "use": "enc",
  "kid": "1"
}

# JWK のパラメータ

JWK のパラメータとして規格で定義されているものとしては、kty, use, key_ops, alg, kid, x5u, x5c, x5t, x5t#S256 があります。

kty (Key Type)

Key Type は暗号アルゴリズムを指定する文字列で、RSAEC などが入ります。

use (Public Key Use)

Public Key Use は公開鍵の用途を表す文字列で、sig (署名)や enc (暗号化)などが入ります。

key_ops (Key Operations)

Key Operations は鍵の操作を表す文字列の配列で、sign (署名)や verify (検証)などが入ります。 規格で定められている値は次の通りです。

  • sign: 署名
  • verify: 検証
  • encrypt: 暗号化
  • decrypt: 復号
  • wrapKey: 鍵の暗号化
  • unwrapKey: 鍵の復号
  • deriveKey: 鍵の導出
  • deriveBits: ビットの導出

ちなみに鍵の導出とは、

暗号理論分野における鍵導出関数(かぎどうしゅつかんすう, key derivation function, KDF)は、一つのマスター鍵やパスワード、パスフレーズなどの秘密の値から、一つあるいは複数の秘密鍵を導出するために用いられる関数

ということらしいです。 有名どころだと bcrypt などで、パスワードハッシュに使われることがあるようです。

# JWK Set

実際の認証認可サーバーでは普通の鍵を使うことがよくあります。複数の JWK をまとめたものを JWK Set と呼び、この RFC でも JWK Set についてカバーされています。

JWK Set は keys パラメータを持ち、ここに JWK の値を配列で入れることになっています。

# おまけ: Google の ID トークンの認可に使われている JWK

Google 認証によって発行される ID トークン(JWT)を検証する場合には、Google の公開鍵を使って検証する必要があります。 この公開鍵が上記の URL の中で JWK として公開されているのでそれを見てみてます。

{
  "keys": [
    {
      "e": "AQAB",
      "alg": "RS256",
      "kid": "676da9d312c39a429932f543e6c1b6e6512e4983",
      "kty": "RSA",
      "n": "khHQPa75Xf95y1DGdlab8r_Soe9Tklk3Xi0yZhANb2E6YMqci6pYk_6qDVyKr_ixMzH_I6TQxJJNnLtEHrU3-8pTyKzX59kBncOdPoeJRAYYuW1D-ywgYKVVTCwfTQwugLFxcVKYSyKUpoRSunw1K8EJqjsQsCIGIJ9uqGW3SI0FW6AoMlQ7XulrAUqn4agIFFNwszLy9hflSpL2MwCVq0uBL1YWiCXkrsAZrgql9ICW2H9l6BnVL9QFETz84nB_aqGyMwwWoE8bkiVahBaNYw04f2SKqT_nS4FtogorYRPtvJB-ZK0dgMO6_Rdv9z1q4tmxga9qU7ErYPwTPe9Zvw",
      "use": "sig"
    },
    {
      "n": "wYvSKSQYKnGNV72_uVc9jbyUeTMsMbUgZPP0uVQX900To7A8a0XA3O17wuImgOG_BwGkpZrIRXF_RRYSK8IOH8N_ViTWh1vyEYSYwr_jfCpDoedJT0O6TZpBhBSmimtmO8ZBCkhZJ4w0AFNIMDPhMokbxwkEapjMA5zio_06dKfb3OBNmrwedZY86W1204-Pfma9Ih15Dm4o8SNFo5Sl0NNO4Ithvj2bbg1Bz1ydE4lMrXdSQL5C2uM9JYRJLnIjaYopBENwgf2Egc9CdVY8tr8jED-WQB6bcUBhDV6lJLZbpBlTHLkF1RlEMnIV2bDo02CryjThnz8l_-6G_7pJww",
      "kty": "RSA",
      "e": "AQAB",
      "kid": "a3bdbfdede3babb2651afca2678dde8c0b35df76",
      "alg": "RS256",
      "use": "sig"
    }
  ]
}

これは JWK Set のデータになっており、鍵が 2 つ定義されています。どちらも RSA-256 の鍵です。 e や n といった値は RSA の鍵のパラメータで、それ以外の値は JWK のパラメータになっています。

実際に JWK が使われている一例でした。

# 終わりに

次回は JWA について書く予定です。