[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>クレームベース認証]]
-戻る
--[[JOSE]]
--[[トークン]]
--[[クレームベース認証]]

* 目次 [#ld8342fd]
#contents

*概要 [#yfb13271]
JWTとはJSON Web Tokenの略でjot(ジョット)と発音する。
-JWT : [[JSON]] Web Tokenは、jot(ジョット)と発音する、~
-[[JOSE]] : [[JSON]] Object Signing and Encryptionのサブセット仕様。

**仕様 [#u3914621]
-JSONのアサーション(クレーム)を生成するための仕様
-URL中で使用可能な(、url-safeな)、[[JSON]]のアサーションを生成するための仕様

-Base64 URL Encodeしたヘッダ、クレームセット等を「.」で連結
-Base64 URL Encodeした[[ヘッダ>#m9c6f99a]]、[[ペイロード(クレームセット)>#m5b94cda]]等を「.」で連結
--このため、url-safeであり、Webでの取り扱いが楽。
--言語毎のライブラリも整っており、相互運用が容易。
--言語毎のライブラリも整っており、自作も相互運用も容易。

-JWTには、[[JWS>#md583102]]や[[JWE>#y75c2692]]がある([[JWK]]は違う)。

**用途 [#s26d45ab]
-暗号化により、鍵でペイロード(クレームセット)の改ざんチェック可能。
-以下を主張する。
--メッセージ認証コード(MAC)やデジタル署名で完全性保護されていること([[JWS>#md583102]])
--および/または暗号化されていること([[JWE>#y75c2692]])

-この特徴のため、仲介者を伴う(改竄・盗聴の危険性がある)情報のやり取りに利用される。
-暗号化により、鍵で[[ペイロード(クレームセット)>#m5b94cda]]の改ざんチェックが可能(=信頼関係のセマンティクス)。~
この特徴のため、仲介者を伴う(改ざん・盗聴の危険性がある)情報のやり取りに利用される。
--主に、認証サーバから返されるトークンに使われる。
--実際、[[OAuth]] 2.0 拡張や[[OpenID Connect]]などで使われている。

**種類 [#ba527d8c]
JWTを作る方法としてJWSとJWE、もしくは両方を使った方法がある。
*構造 [#ad27d98c]

-JWSは、暗号化ではなく署名なので、JSON の中身は誰でも見られる。~
通常、発行者だけが秘密鍵で検証できるが、公開鍵を使用すれば誰でも検証が可能。
**構成要素 [#q01f4062]
以下の要素から構成される。

-JWEは、暗号化のオプション。
ここの詳細は、[[RFC>#t002076b]]を参照。

**注意 [#ob14e5e6]
「Base64」ではなく「Base64 &color(red){URL};」なので「=」は含まれない。
個別に、
-[[OpenID Connect]] の [[IDトークン(クレーム)>OpenID Connect#ofb73c59]]
-[[JWT生成プログラムの作成方法の参考サイト>JWT#e11d0494]]

*構造 [#ad27d98c]
などを参照のこと。

**構成要素 [#q01f4062]
以下の要素から構成される。

***ヘッダ [#m9c6f99a]
署名検証のために利用するもの。
-[[JOSE]] : [[JSON]] Object Signing and Encryptionヘッダ
--署名・検証のために利用するもの。
--電子署名、MAC に関する情報を保持する。

-ヘッダの内容は、3 種に分けられている。

--Registered Header
---RFC 上で仕様化されているヘッダ内容。
---署名に使うアルゴリズムを示す alg 
---公開鍵の在処を示す jku ([[JWK]] Set URL)

--Public Header~
定義可能だが名前の衝突を避けるために IANA に登録するヘッダ内容。

--Private Header~
衝突するかもしれないから注意が必要なヘッダ内容。

-ヘッダ・パラメタ
--typ(オプション)を設定するなら、
---"JWT"
---"JOSE" : [[JWS>#md583102]]や[[JWE>#y75c2692]]のCompact Serialization
---"[[JOSE]]+[[JSON]]" : [[JWS>#md583102]]や[[JWE>#y75c2692]]の[[JSON]] Serialization
---"application/"接頭辞を省略したMedia Types

--cty(オプション)は、構造情報を伝えるために使用される。
---"JWT" : [[ネストされたJWT>#sb742cbf]]のペイロード
---"application/"接頭辞を省略したMedia Types
--ヘッダ・パラメタとして複製されたクレーム~
[[JWE]]のクレームの一部を復号化前に処理方法を決定する目的で使用する。

--ヘッダ・パラメタは、[[JWS>#md583102]]と[[JWE>#y75c2692]]で異なる。

---[[JWS>#md583102]]の場合、alg, typなど。
 { "alg": "HS256", "typ": "JWT"}

---[[JWE>#y75c2692]]の場合、alg, encなど。
 {"alg":"RSA-OAEP","enc":"A256GCM"}

***ペイロード(クレームセット) [#m5b94cda]

-予約済みクレーム
-パブリッククレーム
-プライベートクレーム
-[[予約済みクレーム>https://openid-foundation-japan.github.io/draft-ietf-oauth-json-web-token-11.ja.html#ReservedClaimName]]~
以下すべて、使用は任意 (OPTIONAL)。
|#|キー|説明|h
|1|"iss"|Issuer クレーム|
|2|"sub"|Subject クレーム|
|3|"aud"|Audience クレーム|
|4|"exp"|Expiration Time クレーム|
|5|"nbf"|Not Before クレーム|
|6|"iat"|Issued At クレーム|
|7|"jti"|JWT ID クレーム|
|8|"typ"|Type クレーム|

***署名 [#f7edb04c]
色々な暗号化アルゴリズムを使用して作成した署名
-パブリック・クレーム
--JWTの利用者によって自由に定義できる。
--衝突を避けるために、
---IANA JSON Web Token Claim Registry に登録するか、
---耐衝突性を持つ名前空間を含むパブリック名にすべき。

**JWTの種類 [#j5dabc60]
-プライベート・クレーム
--JWTの作成者と利用者の合意のものとで、~
予約済みでもパブリック・クレーム名でもないプライベート・クレーム名を利用可能。
--ただし、衝突の可能性があるため、慎重に使用する必要がある。

***JWS [#md583102]
署名されたJWT
-署名付きのデータを JSON (の Base64 URL Encode) 形式で表現するための仕様
-多くの場合は JSON Payload に対して署名するケースで利用される。
-OpenID Connect の ID Tokenなどで利用されている。
-サンプル
 {
   "sub": "1234567890",
   "name": "John Doe",
   "admin": true
 }

 BASE64URL (UTF-8 (Header))
 .
 BASE64URL (UTF-8 (Claim Set))
 .
 BASE64URL (UTF-8 (Signature))
***その他 [#h6c0fec8]
JWTの種類によって様々。

***JWE [#y75c2692]
暗号化されたJWT
-暗号化されたデータを JSON (の Base64 URL Encode) 形式で表現するための仕様
-暗号化された[[SAML]] アサーションを Connect に移行するユースケースなどが想定される。
-[[JWS>#md583102]]~
JWS署名

ヘッダー.キー.初期ベクター.暗号文.認証タグ
-[[JWE>#y75c2692]]~
・・・

 BASE64URL (UTF-8 (JWE Protected Header))
 .
 BASE64URL(JWE Encrypted Key)
 .
 BASE64URL(JWEInitialization Vector)
 .
 BASE64URL(JWE Ciphertext)
 .
 BASE64URL(JWE Authentication Tag)
**JWTの種類 [#j5dabc60]

***プレーンJWT [#of14a838]
[[ヘッダ>#m9c6f99a]]内のalgはnone = {“alg”: “none”} 。
***[[JWS]] [#md583102]

ヘッダー.ペイロード.
***[[JWE]] [#y75c2692]

***ネストされたJWT [#sb742cbf]
-ペイロード(若しくは平文)として、[[JWS>#md583102]]や[[JWE>#y75c2692]]が使用される。
-署名と暗号化の両方が必要なネストされたJWTの署名と暗号化の順序は、~
プロデューサがメッセージに署名してから結果を暗号化する(従って、署名を暗号化する)。

-参考
--[前編] IDトークンが分かれば OpenID Connect が分かる - Qiita~
' > 6.3. Nested JWT > 6. JSON Web Token (JWT)~
https://qiita.com/TakahikoKawasaki/items/8f0e422c7edd2d220e06#63-nested-jwt

***無担保JWT [#d5575bd7]
-[[JWS>#md583102]]でも[[JWE>#y75c2692]]でもない、プレーンなJWT(無担保JWT)。
-[[ヘッダ>#m9c6f99a]]内のalgはnone = {“alg”: “none”} 。

-フォーマット([[JWS Compact Serialization>JWS#xe1c18e7]])
--[[ヘッダ>#m9c6f99a]].[[ペイロード(クレームセット)>#m5b94cda]].
--
 BASE64URL (UTF-8 (Header))
 .
 BASE64URL (UTF-8 (Claim Set))
 .

***その他 [#vf919761]
-JWK
--JWS や JWE などで利用する「鍵」を JSON 形式で表現するための仕様
--OpenID Connect Discovery をサポートしている IdP は公開鍵を JWK Set 形式で公開していることが多い。

-JWA
--JWS や JWE で利用される各アルゴリズムおよびそれらの識別子を定義している仕様
--・・・

*JWTの作成と検証手順 [#dd514c38]
-JWT を扱えるライブラリは沢山ある。

-署名・暗号化は特定用途であれば、1パターン実装すればイイので自作も可能。
**JWTの作成手順 [#pfa9f0dd]
-JWSやJWEの手順に従って作成
-入れ子になったJWTの場合には[[ヘッダ>#m9c6f99a]]の”cty”の値に”JWT”を指定

-検証・復号化は網羅性を高めることが難しいので、ライブラリを使用する。
--OpenID Connect の JWT の署名を自力で検証してみると見えてきた公開鍵暗号の実装の話 - Qiita~
http://qiita.com/bobunderson/items/d48f89e2b3e6ad9f9c4c
***[[JWS>JWS#paf2520a]] [#n6dca050]

**ライブラリ [#n981cbc3]
-oauth - Is there a JSON Web Token (JWT) example in C#? - Stack Overflow~
http://stackoverflow.com/questions/10055158/is-there-a-json-web-token-jwt-example-in-c
***[[JWE>JWE#k0d929b6]] [#e5ba4555]

-WebCrypto APIでJSON Web Tokenの検証を試してみる - Qiita~
http://qiita.com/tomoyukilabs/items/faa66805a440f4b30cfb
**JWTの検証(復号)手順 [#r8923712]
JWSやJWEの手順に従って検証(復号)

|項番|言語|ライブラリのURL|h
|0|JavaScript|https://www.w3.org/TR/WebCryptoAPI/|
|1|Ruby|https://github.com/nov/json-jwt|
|2|Python|https://github.com/rohe/pyjwkest|
|3|Java|https://bitbucket.org/nimbusds/nimbus-jose-jwt/wiki/Home|
|4|PHP|https://github.com/ritou/php-Akita_JOSE|
|5|Perl|https://github.com/xaicron/p5-JSON-WebToken|
|6|Objective-C|https://github.com/yourkarma/JWT|
|7|.NETなら|Nugetからメジャーな奴を入れる。|
***[[JWS>JWS#ib69bb72]] [#ldcecbc0]

**JWTの作成手順 [#pfa9f0dd]
***[[JWE>JWE#g7091459]] [#tc2030de]

***概要 [#wbf0fb96]
-JWSまたはJWEの手順に従って生成
-入れ子になったJWTの場合には[[ヘッダ>#m9c6f99a]]の”cty”の値に”JWT”を指定
**JWTのアルゴリズム [#f09e77cd]
利用される各アルゴリズムおよびそれらの識別子を定義している仕様

***手順(JWS) [#p744be69]
-[[ヘッダ>#m9c6f99a]]を生成し、UTF-8のバイト文字列に変換し、BASE64urlエンコード。
-クレームセットを生成し、UTF-8のバイト文字列に変換し、BASE64urlエンコード。
-BASE64urlエンコード済みの[[ヘッダ>#m9c6f99a]]とクレームセットを~
ピリオドで連結する、UTF-8バイト文字列に変換し、BASE64urlエンコード。
-上記をヘッダで指定した暗号化プロバイダで暗号化(ハッシュ or 暗号化)
***[[JWS>JWS#f133bbd2]] [#w51e31db]

**JWTの検証手順 [#r8923712]
***[[JWE>JWE#head797a]] [#f3dfc9c1]

***手順 [#ib69bb72]
-JWTを[[ヘッダ>#m9c6f99a]]、クレームセット、署名に分割しBASE64urlでデコード。
-[[ヘッダ>#m9c6f99a]]から種類(JWT、JWS、JWE)、暗号化プロバイダを確認する。
-種類、暗号化プロバイダを考慮してJWTの検証を行なう。
-検証完了後、クレームセット内の有効期限の検証も行なう。
*ユースケース [#neb31e45]
-http://openid-foundation-japan.github.io/draft-ietf-jose-use-cases-03.ja.html

***検証サイト [#s7ab5c53]
-JSON Web Tokens - jwt.io~
https://jwt.io/
-JSON Web Token の効用 - Qiita~
http://qiita.com/kaiinui/items/21ec7cc8a1130a1a103a

*ユースケース [#neb31e45]
-JWTによるJSONに対する電子署名と、そのユースケース | Developers.IO~
http://dev.classmethod.jp/server-side/json-signing-jws-jwt-usecase/

**認証用途 [#yd304024]
-JWT(JSON Web Token)を使った認証を試みる | 69log~
https://blog.kazu69.net/2016/07/30/authenticate_with_json_web_token/
-JWTを認証用トークンに使う時に調べたこと - Carpe Diem~
http://christina04.hatenablog.com/entry/2016/06/07/123000
-JWT(Json Web Token)を利用したWebAPIでのCredentialの受け渡しについて | I am mitsuruog~
http://blog.mitsuruog.info/2014/08/jwtjson-web-tokenwebapicredential.html
-カスタム・アプリケーションによる認証フローとプログラミング - Build Insider~
http://www.buildinsider.net/web/msidentitydev/03

***[[OpenID Connect]]のIDトークン [#o5f70766]
[[コチラ>OpenID Connect#ofb73c59]]を参照。

***[[OAuth]] 2.0のアクセストークン [#f9d1b3ca]
-[[OAuth]] 2.0ではアクセストークンまで仕様化されていないのでJWTを利用可能。~
[[ASP.NET Identity]]では、以下のように、アクセストークンをJWTフォーマットに変更できる。
[[コチラ>OAuthによる外部ログイン(認証)の研究#yf9cec19]]を参照。

-Implicitグラント種別のアクセストークンで、認証用途に利用する。~
アクセストークンに、[[OpenID Connect]]の[[IDトークン>OpenID Connect#ofb73c59]]を参考にして、改竄、置換、CSRF(XSRF)等に~
耐える為のクレームを追加し、これを検証すれば、Implicitグラント種別でも安全性が高くなる。

-Google の OAuth Token は、公開鍵暗号(非対称鍵暗号)で署名されたJWT であるため、~
クライアントは公開鍵を取得し、Google API に検証リクエストをしないで検証が可能。

-参考
--JSON Web Token in ASP.NET Web API 2 using Owin - Bit of Technology~
http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/
--JWT(Json Web Token)を利用したWebAPIでのCredentialの受け渡しについて | I am mitsuruog~
http://blog.mitsuruog.info/2014/08/jwtjson-web-tokenwebapicredential.html

***シングルサインオン(SSO) [#qc19ebd8]
-シングルサインオン - Wikipedia~
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3

--近年は、SAMLアサーションやJWTアサーション([[OpenID Connect]]の[[IDトークン>OpenID Connect#ofb73c59]])~
によって、クレデンシャル伝えてSSOを実現する方式が一般的になってきている。

-JWTを使った簡易SSOで徐々にシステムをリニューアルしている話~
http://www.slideshare.net/TsuchiKazu/jwt-ssopepabotech

--ショップ(Webアプリ)とカート(WebAPI+SPA)を分離し、~
tempストアをサイト間で共有しないで、認証情報を共有するSSOを実現したい。

--JWTにより、以下を跨いだ認証が可能に。
---サーバー(Webアプリ・WebAPI)間
---クライアント(ブラウザ)・サーバー(Webアプリ・WebAPI)間

--また、その後の、

---マイクロサービス化にも対応可能になる。~
サービスの多様化、フロントエンドの多極化

---認証情報以外の共有したい情報にも利用することができる。~
この場合、JWEを使用する可能性がある(HTTPSなら不要だが)。
この場合、[[JWE>#y75c2692]]を使用する可能性がある(HTTPSなら不要だが)。

-JWT(JSON Webトークン)を使用したシングルサインオンの設定 – Zendesk Support~
https://support.zendesk.com/hc/ja/articles/203663816-JWT-JSON-Web%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A

**メール着信確認トークン [#uc4b4ccb]
以下でメール着信確認トークンを使用するようなケースで利用する事で、~
トークンをtempストアに格納して、後に比較するような実装が不要になる。

-アカウント確認(E-mail confirmation)
-パスワード・リセット

**共有用URL [#w567a950]
-OneDriveのファイル・フォルダ共有にも利用されている。
-URLにオブジェクトに対する[[ACL・ACE]]的なモノをJWTアサーションに同梱。
-サービスが認証したユーザがオブジェクトに対するアクセス許可を持っているか、[[ACL・ACE]]から確認する。

**RFC [#k7337bf9]
-JWT を扱える[[ライブラリ>#n981cbc3]]は沢山ある。

***Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants [#e7d6a65b]
https://tools.ietf.org/html/rfc7521
-署名・暗号化は特定用途であれば、1パターン実装すればイイので自作も可能。

-[[OAuth]] 2.0 を拡張するアサーションの仕様
--Client Authentication で Client Credentials として使うアサーションの仕様
--Authorization Codeグラント種別のAccess Token と交換するアサーションの仕様
-検証・復号化は網羅性を高めることが難しいので、[[ライブラリ>#n981cbc3]]を使用する。
--OpenID Connect の JWT の署名を自力で検証してみると見えてきた公開鍵暗号の実装の話 - Qiita~
http://qiita.com/bobunderson/items/d48f89e2b3e6ad9f9c4c

-単体では利用できず、後の2つのサブ仕様~
(RFC7522(SAMLアサーション)、7523(JWTアサーション))~
の共通部分を抽象化した仕様になっている。

***JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants [#gc47e455]
https://tools.ietf.org/html/rfc7523

JWT を [[RFC 7521(上記)>#e7d6a65b]] の アサーション として利用するための仕様

**参考 [#lcb2fd20]
*ライブラリ [#n981cbc3]
**様々なライブラリ(相互運用) [#j1232beb]
-JSON Web Token の効用 - Qiita~
http://qiita.com/kaiinui/items/21ec7cc8a1130a1a103a

-JWTによるJSONに対する電子署名と、そのユースケース | Developers.IO~
http://dev.classmethod.jp/server-side/json-signing-jws-jwt-usecase/
-WebCrypto APIでJSON Web Tokenの検証を試してみる - Qiita~
http://qiita.com/tomoyukilabs/items/faa66805a440f4b30cfb

*.NETのJWTライブラリ [#c4fe6111]
|項番|言語|ライブラリのURL|h
|0|JavaScript|https://www.w3.org/TR/WebCryptoAPI/|
|1|Ruby|https://github.com/nov/json-jwt|
|2|Python|https://github.com/rohe/pyjwkest|
|3|Java|https://bitbucket.org/nimbusds/nimbus-jose-jwt/wiki/Home|
|4|PHP|https://github.com/ritou/php-Akita_JOSE|
|5|Perl|https://github.com/xaicron/p5-JSON-WebToken|
|6|Objective-C|https://github.com/yourkarma/JWT|
|7|.NETなら|[[NuGetからメジャーな奴を入れる。>#r4ac23c8]]|

**相性がある模様 [#l9bea68e]
***[[System.IdentityModel.Tokens.JwtSecurityTokenHandler>https://msdn.microsoft.com/ja-jp/library/system.identitymodel.tokens.jwtsecuritytokenhandler.aspx]] [#y171da32]

Microsoft Open Technologiesによって開発された、~
JSON Web Token Handler For the Microsoft .Netというライブラリ。
Microsoft Open Technologiesによって開発された、BCL入りしている~
JSON Web Token Handler For the Microsoft .NETというライブラリ。

下記が参考になる。

-IdM実験室~
http://idmlab.eidentity.jp
-- [JWT/OAuth]Service Accountを使ってGoogle APIを利用する①, ②~
---http://idmlab.eidentity.jp/2015/01/jwtoauthservice-accountgoogle-api.html
---http://idmlab.eidentity.jp/2015/01/jwtoauthservice-accountgoogle-api_5.html

上記は、ResourcesOwnerであるユーザが介在することなく~
ClientがResourcesServerのAPIを利用するようなユースケースらしく、~
以下の様な、grant_typeで、AccessTokenを取得して、WebAPIにアクセスする。
上記は、Resource Ownerであるユーザが介在することなく~
ClientがResource ServerのAPIを利用するようなユースケースらしく、~
以下の様な、grant_typeで、Access Tokenを取得して、WebAPIにアクセスする。

-grant_type:~
http://oauth.net/grant_type/jwt/1.0/bearer
--TenantContextID、AppPrincipalId、SymmetricKey を使用して、
--JWTを投げると、AccessTokenが返ってくるflowのgrant_typeらしい。
--JWTを投げると、Access Tokenが返ってくるflowのgrant_typeらしい。

この時、Googleの秘密鍵のキー長は1024bitだが、~
このライブラリは最低でも2048bitを要求しているため、

>相互運用が不可だったらしい。
>相互運用が不可だったらしい~
(ちなみにVisual Studioが生成するpfxのキー長も1024bitだったりする)。

恐らく、色々なライブラリ間の実装差異で~
相互運用が難しくなるようなケースがあると思う。
恐らく、色々なライブラリ間の実装差異で相互運用が難しくなるようなケースがあると思う。~
また、マニュアルもほとんどなく、恐らく[[JWE]]や[[JWK]]に対応していないものと思われる。

***[[Microsoft.Owin.Security.Jwt.JwtFormat>https://msdn.microsoft.com/ja-jp/library/microsoft.owin.security.jwt.jwtformat.aspx]] [#ib881924]

以下の2メソッドのインターフェイスを確認すると、~
引数・戻り値に、Microsoft.Owin.Security.AuthenticationTicketが在ったり、~
.NET技術と結合度が高く、相互運用には向かないように見える。

-[[JwtFormat.Protect メソッド>https://msdn.microsoft.com/ja-jp/library/dn450167.aspx]]
-[[JwtFormat.Unprotect メソッド>https://msdn.microsoft.com/ja-jp/library/dn450160.aspx]]

**検索結果 [#r4ac23c8]
-NugetやWebを検索した所、以下の2ライブラリの利用者が多い。
-ダウンロード数を確認した所、System.IdentityModel.Tokens.Jwtが優勢。
-NuGetやWebを検索した所、以下の3ライブラリの利用者が多い。

***JSON Web Token (JWT) implementation for .NET [#o8ee7ae2]
-其々の評価
--[[Azure AD>Microsoft Azure Active Directory]]公式と言う事もあり、ダウンロード数は、[[System.IdentityModel.Tokens.Jwt>#f8161509]]が優勢。
--GitHubの★の数は[[Jwt.Net>#o8ee7ae2]]が多いが、[[サポート>https://github.com/jwt-dotnet/jwt/tree/master/src/JWT/Algorithms]]しているアルゴリズムが少ない(素人向け)。
--[[JWE]]などのサポートを含み、Nimbus-JOSE-JWT等と互換性のある玄人向けのライブラリは、[[jose-jwt>#q6cee2ca]]。

-NuGet Gallery | JWT 1.3.4~
***[[jose-jwt]] [#q6cee2ca]

***Jwt.Net [#o8ee7ae2]

-NuGet Gallery | JWT~
https://www.nuget.org/packages/JWT/

Version Historyを参照。
-jwt-dotnet/jwt
https://github.com/jwt-dotnet/jwt
>Jwt.Net, a JWT (JSON Web Token) implementation for .NET

***System.IdentityModel.Tokens.Jwt [#f8161509]
以前は、JSON Web Token Handler For the Microsoft .Netという表示名だったようだが、~
version 05-00からは、パッケージ名(=名前空間)と同じ表示名になっている。~
ライセンスはMITだが、ソースコードをGithubやCodePlex上に確認できない・・・。
上記の、BCL入りしている[[JwtSecurityTokenHandler>#y171da32]]が含まれる名前空間より~
一つ下の階層のJWT系の追加ライブラリを格納する名前空間であるもよう。~
※ 名前空間的には、下の階層の方が、上位スタックになるんだなぁ。

上記の、BCL入りしているJwtSecurityTokenHandlerが含まれる名前空間より~
一つ下の階層のJWT系の追加ライブラリを格納する名前空間であるもよう。
必要に応じて、追加でNuGetから取得する必要がある。

必要に応じて、追加でNugetから取得する必要がある。

-NuGet Gallery | System.IdentityModel.Tokens.Jwt~
https://www.nuget.org/packages/System.IdentityModel.Tokens.Jwt/

詳しくは、Version Historyを参照。
-azure-activedirectory-identitymodel-extensions-for-dotnet~
/src/System.IdentityModel.Tokens.Jwt at dev · AzureAD~
https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/tree/dev/src/System.IdentityModel.Tokens.Jwt

**自作ライブラリについて [#v028206c]
**自作のJWTライブラリ [#v028206c]
以下を考慮して開発可能。

***用途 [#b90af93a]
-認証など、特定用途の署名・暗号化、検証・復号化レベルであればであれば自作ライブラリで良い。
-正しく署名・暗号化できていれば、他のライブラリでも検証・復号化が可能。

***相互運用(検証・復号化) [#dfbab710]
他のライブラリでも検証・復号化が可能かどうかは、~
[[JSON Web Tokens - jwt.io>https://jwt.io/]]などのサイトを使用して確認すると良い。
[[JSON Web Tokens - jwt.io>#gde49f1c]]などの検証サイトを使用して確認すると良い。

***[[署名・暗号化アルゴリズム>.NETの署名・暗号化アルゴリズム]] [#p4042a8b]
特定用途であれば、上記サイトにも.NETにも実装されている
***Base64url Enc/Dec [#n0909b67]
このライブラリも必要になる。

-KeyedHashAlgorithm
--RS256(HMAC using SHA-256 hash)
---HMACSHA256 クラス (System.Security.Cryptography)~
https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacsha256.aspx
-【C#】Base64urlエンコード・デコード - Qiita~
http://qiita.com/hukatama024e/items/b1352cabcd85948511c3
>RFC4648に条件付きでパディング外すなどの難しい処理が~
あるようなので、ライブラリを使用するほうが良いかもしれない~
(Microsoft.Owin.Securityのicrosoft.Owin.Security.DataHandler.Encoderにライブラリがある)。

-AsymmetricAlgorithm
--RS256(RSA using SHA-256 hash)
---RSACryptoServiceProvider クラス (System.Security.Cryptography)~
https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rsacryptoserviceprovider.aspx
---Using RSACryptoServiceProvider for RSA-SHA256 signatures – .NET Security Blog~
https://blogs.msdn.microsoft.com/shawnfa/2008/08/25/using-rsacryptoserviceprovider-for-rsa-sha256-signatures/
***脆弱性 [#j8e0d191]
実装に脆弱性を作らないように注意する。

を使用すると良い。
-JWS 実装時に作りがちな脆弱性パターン - OAuth.jp~
http://oauth.jp/blog/2015/03/16/common-jws-implementation-vulnerability/

認証であれば公開鍵暗号化方式のRS256(RSA using SHA-256 hash)が良い。
ざっくり、
-alg を "none"に改ざんされた場合、検証でtrueにするな。
-alg を "HMAC-SHA*"に改ざんされた場合、検証でtrueにするな。

***実装の脆弱性 [#j8e0d191]
実装の脆弱性に注意する。
--JWS 実装時に作りがちな脆弱性パターン - OAuth.jp~
http://oauth.jp/blog/2015/03/16/common-jws-implementation-vulnerability/
ということらしい。

後者は、
-公開鍵暗号方式 (RSA / ECDSA) から共通鍵暗号方式 (HMAC) に差し替え、
-「公開鍵文字列を共通鍵として利用して」署名を生成することで、

検証でtrueになるJWTを生成できてしまう模様。

特定用途の自作ライブラリであれば、~
署名と検証のalgは固定にしておくのも良いと考える。

***参考 [#v386926d]
-[[JWSの自作ライブラリ>JWS#a945c75c]]
-[[JWEの自作ライブラリ>JWE#a1a37be5]]

*参考 [#p90217f2]
-JWT Translation #technight~
http://www.slideshare.net/matake/jwt-trans

-JWTについて簡単にまとめてみた - hiyosi's blog~
https://hiyosi.tumblr.com/post/70073770678/jwt%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E7%B0%A1%E5%8D%98%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%BF%E3%81%9F

**内部 [#v258f898]
***[[JWS]] [#l8bfa569]
***[[JWE]] [#x0c18773]
***[[JWK]] [#ma4d797b]
***[[JWA]] [#k03a1d47]

**RFC [#t002076b]
-IETF JOSE WG と OAuth WG から一気に9本の RFC が! - OAuth.jp~
http://oauth.jp/blog/2015/05/20/jose-and-oauth-assertion-rfcs/

***OAuth WG [#vdd1ecf0]
-RFC 7519 - JSON Web Token (JWT)~
https://tools.ietf.org/html/rfc7519

-[[RFC 7521, 7522, 7523>JWT bearer token authorizationグラント種別#c65d5829]]

***JOSE WG [#z5dc6cf2]
jose : Javascript Object Signing and Encryption

-RFC 7515 - JSON Web Signature (JWS)~
https://tools.ietf.org/html/rfc7515
-RFC 7516 - JSON Web Encryption (JWE)~
https://tools.ietf.org/html/rfc7516
-RFC 7517 - JSON Web Key (JWK)~
https://tools.ietf.org/html/rfc7517
-RFC 7518 - JSON Web Algorithms (JWA)~
https://tools.ietf.org/html/rfc7518
-[[JWS]]
-[[JWE]]
-[[JWK]]
-[[JWA]]

-RFC 7520 - Examples of Protecting Content~
Using JSON Object Signing and Encryption (JOSE)~
https://tools.ietf.org/html/rfc7520

***OAuth WG [#vdd1ecf0]
-RFC 7519 - JSON Web Token (JWT)~
https://tools.ietf.org/html/rfc7519
-RFC 7521 - Assertion Framework for~
OAuth 2.0 Client Authentication and Authorization Grants~
https://tools.ietf.org/html/rfc7521
-RFC 7522 - Security Assertion Markup Language (SAML) 2.0 Profile~
for OAuth 2.0 Client Authentication and Authorization Grants~
https://tools.ietf.org/html/rfc7522
-RFC 7523 - JSON Web Token (JWT) Profile~
for OAuth 2.0 Client Authentication and Authorization Grants~
https://tools.ietf.org/html/rfc7523
***OpenID ファウンデーション・ジャパン [#n96a7959]
-JSON Web Token (JWT) 日本語訳~
https://openid-foundation-japan.github.io/draft-ietf-oauth-json-web-token-11.ja.html

**[[JSON Web Tokens - jwt.io>https://jwt.io/]] [#gde49f1c]

----
Tags: [[:認証基盤]], [[:クレームベース認証]]
Tags: [[:IT国際標準]], [[:プログラミング]], [[:通信技術]], [[:認証基盤]], [[:クレームベース認証]], [[:暗号化]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS