JOSE関連のRFCを読んだので内容についてまとめます
の続きです。
JWK は暗号鍵を表現するための規格です。
JWK の例としては、例えば以下のような JSON がそうです。
{
"kty": "EC",
"crv": "P-256",
"x": "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4",
"y": "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM",
"use": "enc",
"kid": "1"
}
JWK のパラメータとして規格で定義されているものとしては、kty, use, key_ops, alg, kid, x5u, x5c, x5t, x5t#S256 があります。
Key Type は暗号アルゴリズムを指定する文字列で、RSA
や EC
などが入ります。
Public Key Use は公開鍵の用途を表す文字列で、sig
(署名)や enc
(暗号化)などが入ります。
Key Operations は鍵の操作を表す文字列の配列で、sign
(署名)や verify
(検証)などが入ります。
規格で定められている値は次の通りです。
sign
: 署名verify
: 検証encrypt
: 暗号化decrypt
: 復号wrapKey
: 鍵の暗号化unwrapKey
: 鍵の復号deriveKey
: 鍵の導出deriveBits
: ビットの導出ちなみに鍵の導出とは、
暗号理論分野における鍵導出関数(かぎどうしゅつかんすう, key derivation function, KDF)は、一つのマスター鍵やパスワード、パスフレーズなどの秘密の値から、一つあるいは複数の秘密鍵を導出するために用いられる関数
ということらしいです。 有名どころだと bcrypt などで、パスワードハッシュに使われることがあるようです。
実際の認証認可サーバーでは普通の鍵を使うことがよくあります。複数の JWK をまとめたものを JWK Set と呼び、この RFC でも JWK Set についてカバーされています。
JWK Set は keys パラメータを持ち、ここに 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 について書く予定です。