「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
- ざっくり言って「署名付きの JWT = JWS」
- JWT と言えば、だいたい、JWSの事を言う。
- JWSは、暗号化ではなく署名なので、JSON の中身は誰でも見られる。
- 通常、発行者だけが秘密鍵で検証できるが、
- 秘密鍵を使用すれば発行者だけが検証可能。
- 公開鍵を使用すれば誰でも検証可能。
構成要素 †
JWSの基本的なヘッダには、
などがある。
署名 †
- 色々な暗号化アルゴリズムを使用して作成した署名
- 署名の検証キーの共有方法には以下の方法が有る。
詳細 †
ヘッダ、ペイロード(クレームセット)、署名を以下のように表現(エンコード)したもの。
表現(エンコード) †
以下の2つの表現(エンコード)方法がある。
JWS Compact Serialization †
- 署名付きのデータを JSON (の Base64 URL Encode) 形式で表現する。
- 「Base64」ではなく「Base64 URL」なので「=」は含まれない。
※ 殆どの場合、こちらが使用されている。
JWS JSON Serialization †
- pure な JSON として表現されるフォーマット
- URL-Safe でもなければコンパクトでもない。
- 署名を複数持てるといった違いがある。
アルゴリズム †
認証系であれば公開鍵暗号化方式のRS256(RSA using SHA-256 hash)が良い。
RS256 †
alg=RS256(RSA-SHA256)による署名を行う。
HS256 †
alg=HS256(HMAC-SHA256)によるMAC付与
手順 †
作成 †
- ヘッダを生成し、UTF-8のバイト文字列に変換し、BASE64urlエンコード。
- ペイロード(クレームセット)を生成し、UTF-8のバイト文字列に変換し、BASE64urlエンコード。
- BASE64urlエンコード済みのヘッダとペイロード(クレームセット)を
ピリオドで連結する、UTF-8バイト文字列に変換し、BASE64urlエンコード。
- 上記をヘッダで指定した暗号化プロバイダで署名し、署名の要素を追加する。
検証 †
検証サイト †
下記参照
自作ライブラリ †
署名・暗号化アルゴリズム †
ココの署名・暗号化アルゴリズムを使用すると良い。
KeyedHashAlgorithm? †
- HS256(HMAC using SHA-256 hash)
AsymmetricAlgorithm? †
- RS256(RSA using SHA-256 hash)
参考サイト †
以下が参考になる。
ココを見ると、
- { alg = "RS256", typ = "JWT" }と言うヘッダで、
- RSACryptoServiceProvider? + X509Certificate2の署名を行っており、
これで、実際にGoogle側での検証ができている。
検証サイト †
上記のように、RFCを正確に理解していないとJWTライブラリ作成は難しいが、
JSON Web Tokens - jwt.ioなどの検証サイトを使用して検証できれば、及第点に達していると言える。
以下のように検証できる。
手順 †
- 左ペイン(Encoded)にJWTの文字列を貼り付ける。
- すると、入力したJWTから、ペイン(Dencoded)のHeader、Payloadに自動的に表示がなされる。
- 次に、上部 ALGORITHM selectbox から、Headerに表示された"alg"と同じアルゴリズムを選択する。
- 最後に、VERIFY SIGNATUREに、署名の検証に使用するキーを入力する(HS256の場合とRS256の場合で異なる)。
HS256の場合 †
HS256は非常に単純で、署名に使用したキーのBase64(Base64Url)表現を指定する。
RS256の場合 †
RS256は署名に使用した秘密鍵に対応する公開鍵を指定する。
私は、X.509証明書を利用したので、OpenSSLで公開鍵を取得して、それを貼り付けた所、検証ができた。
ポイントは、
- 「-----BEGIN PUBLIC KEY-----」
- 「公開鍵」
- 「-----END PUBLIC KEY-----」
と、ヘッダ・フッタ部分も貼り付ける必要がある所だろうか。
Open棟梁 †
参考 †
Tags: :認証基盤, :クレームベース認証, :暗号化