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

-[[戻る>JWT]]

* 目次 [#re273910]
#contents

*概要 [#sf29c23e]
JWEは、暗号化のオプション(暗号化されたJWT)。
-暗号化されたデータを JSON (の Base64 URL Encode) 形式で表現するための仕様
-暗号化された[[SAML]] アサーションを Connect に移行するユースケースなどが想定される。
以下の内容で最終確認済み。~
https://tools.ietf.org/html/rfc7516

-JWEは、暗号化のオプション(暗号化された[[JWT]])。
--暗号化されたデータを JSON (の Base64 URL Encode) 形式で表現するための仕様
--暗号化された[[SAML]] アサーションを Connect に移行するユースケースなどが想定される。

-[[認証済み暗号化(AEAD)>#u227747b]]を利用して、以下を保証する。
--平文の機密性と完全性
--および[[保護ヘッダ>#kfb01963]]と[[追加認証データ(AAD)>#m2591477]]の完全性

*構成要素 [#n03afb80]

**JOSEヘッダ [#e1356469]
JOSEヘッダは、以下のメンバの和集合。
JWEの基本的な(≒[[JWE Compact Serialization>#c33082e5]]の場合の)ヘッダには、以下のものがある。

***JWE Protected Header [#kfb01963]
認証された暗号化を利用して、完全性を保証。
***[[RSAES-OAEP and AES GCM>#u6a363cb]] [#zd0e348e]
 {"alg":"RSA-OAEP","enc":"A256GCM"}

-パラメタ
***[[RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256>#p5537b05]] [#p51dc747]
 {"alg":"RSA1_5","enc":"A128CBC-HS256"}

--alg : [[暗号化キー>#bfd76ff6]]の値を暗号化または決定するために使用される暗号アルゴリズムを識別
***[[AES Key Wrap and AES_128_CBC_HMAC_SHA_256>#z57bfc52]] [#tb96fbcc]
 {"alg":"A128KW","enc":"A128CBC-HS256"}

--enc : [[暗号文>#v135760d]]と[[認証タグ>#j00511a1]]を生成するために「平文で認証された暗号化を実行するために」使用されるコンテンツ暗号化アルゴリズムを識別
***[[JWK]]をサポートする場合 [#tc7fd975]

--zip : 暗号化の前に平文に適用される「圧縮」アルゴリズム
**[[暗号化キー>#s97fb511]] [#bfd76ff6]
"enc"の暗号化キーは、"alg"によって暗号化または決定される。

-例
--{"alg":"RSA-OAEP","enc":"A256GCM"}
**[[初期化ベクトル>#p3e2a2df]] [#z7fc7e40]
"enc"によって決定される。

***JWE Shared Unprotected Header [#ma48290f]
[[JWE JSON Serialization>#j471416b]]の場合に必要らしい。
**[[暗号文>#p819cde2]] [#v135760d]
"enc"によって、平文と[[コンテンツ暗号化キー(CEK)>#v40d2646]]から暗号化される。

***JWE Per-Recipient Unprotected Header [#mec07b39]
[[JWE JSON Serialization>#j471416b]]の場合に必要らしい。
**[[認証タグ>#ic098bdf]] [#j00511a1]
"enc"によって、平文と[[コンテンツ暗号化キー(CEK)>#v40d2646]]から[[認証タグ>#b94fc707]]を生成する。

***[[JWK]]をサポートする場合 [#tc7fd975]
*詳細 [#t67ef595]

**JWE暗号化キー [#bfd76ff6]
"enc"の暗号化キーは、"alg"によって暗号化または決定される。
**認証関連 [#zb831611]
JWEのポイントである認証関連。

**JWE初期化ベクター [#z7fc7e40]
"enc"によって決定される。
***追加認証データ(AAD) [#m2591477]
完全性保護されているが暗号化されていない[[認証済み暗号化(AEAD)>#u227747b]]操作への入力。

**[[JWE暗号文>JWT#m5b94cda]] [#v135760d]
"enc"によって、平文から暗号化される。
***認証済み暗号化(AEAD) [#u227747b]
平文と[[追加認証データ(AAD)>#m2591477]]を指定できるようにし、~
平文を暗号化し、統合されたコンテンツ完全性チェックを提供する。

**JWE認証タグ [#j00511a1]
"enc"によって、[[追加の認証データ暗号化パラメタ>#ad797074]]と平文から暗号化される。
-平文と[[追加認証データ(AAD)>#m2591477]]値の2つの入力を受け入れ、
-暗号文と[[認証タグ>#b94fc707]]値の2つの出力を生成する。
-[[認証付き暗号>暗号化アルゴリズム#u0097a82]]の[[AES-GCM>https://ja.wikipedia.org/wiki/Galois/Counter_Mode]]はそのようなアルゴリズムの1つ。

*詳細 [#t67ef595]
***認証タグ [#b94fc707]
-暗号文と[[追加認証データ(AAD)>#m2591477]]の完全性を保証する[[認証済み暗号化(AEAD)>#u227747b]]操作の出力。
-一部のアルゴリズムでは認証タグを使用しない場合がある。

***コンテンツ暗号化キー(CEK) [#v40d2646]
平文を暗号化して暗号文と[[認証タグ>#b94fc707]]を生成するために使用される[[認証済み暗号化(AEAD)>#u227747b]]アルゴリズムの対称鍵。

**暗号化関連 [#z0c146f9]

***暗号化キー [#s97fb511]
-暗号化コンテンツ暗号化キー値。
-一部のアルゴリズムでは、空のオクテットシーケンスになる。

***初期化ベクトル [#p3e2a2df]
-平文を暗号化するときに使用される初期化ベクトル値。
-一部のアルゴリズムでは、空のオクテットシーケンスになる。

***AAD [#qb335595]
-[[認証済み暗号化(AEAD)>#u227747b]]操作によって完全性保護された[[追加認証データ(AAD)>#m2591477]]値。

-[[JWE JSON Serialization>#j471416b]]の場合にのみ存在。
-[[JWE Compact Serialization>#c33082e5]]

AAD値を完全性保護ヘッダーパラメータ値としてインクルードすることによっても達成できますが、値はdouble base64urlでエンコードされています

***暗号文 [#p819cde2]
[[追加認証データ(AAD)>#m2591477]]で平文の認証された暗号化から生じる暗号テキスト値。

***認証タグ [#ic098bdf]
[[追加認証データ(AAD)>#m2591477]]で平文の認証された暗号化から生じる認証タグ値。

**キー管理モード [#w32e4afc]
-[[コンテンツ暗号化キー(CEK)>#v40d2646]]値を決定するため方法。 
-この仕様で使用されるキー管理モードには以下のモノがある。
--[[キー暗号化>#l38f1947]]
--[[キーラッピング>#nb71e0a2]]
--[[直接キー契約>#t1908ad3]]
--[[キーラッピングによるキー契約>#d5c9bd91]]
--[[直接暗号化>#ndb78063]]

***キー暗号化 [#l38f1947]
非対称暗号化アルゴリズムの利用を意図したキー管理モード。

***キーラッピング [#nb71e0a2]
対称キーラッピングアルゴリズムの利用を意図したキー管理モード。

***直接キー契約 [#t1908ad3]
鍵合意アルゴリズムの利用を意図したキー管理モード。

***キーラッピングによる主要契約 [#d5c9bd91]
対称キーラッピングアルゴリズムの対称鍵に、~
合意アルゴリズムの利用を意図したキー管理モード。

***直接暗号化 [#ndb78063]
CEK値が当事者間で共有される鍵管理モード。

**表現(エンコード) [#le7f9bcc]
-[[構成要素>#n03afb80]]([[ヘッダ>#e1356469]]、[[キー>#bfd76ff6]]、[[初期ベクター>#z7fc7e40]]、[[暗号文>#v135760d]]、[[認証タグ>#j00511a1]])を以下のように表現(エンコード)したもの。
-[[構成要素>#n03afb80]]([[ヘッダ>#e1356469]]、[[キー>#bfd76ff6]]、[[初期ベクトル>#z7fc7e40]]、[[暗号文>#v135760d]]、[[認証タグ>#j00511a1]])を以下のように表現(エンコード)したもの。
-以下の2つの表現(エンコード)方法があり、どちらでも、[[構成要素>#n03afb80]]は、base64urlでエンコードされる。

***JWE Compact Serialization [#c33082e5]
-のデータを JSON (の Base64 URL Encode) 形式で表現する。
-[[暗号文>#p819cde2]]&[[認証タグ>#ic098bdf]]のデータを JSON (の Base64 URL Encode) 形式で表現する。
-「Base64」ではなく「Base64 &color(red){URL};」なので「=」は含まれない。
-例

--[[ヘッダ>#e1356469]].[[キー>#bfd76ff6]].[[初期ベクター>#z7fc7e40]].[[暗号文>#v135760d]].[[認証タグ>#j00511a1]]
--[[ヘッダ>#e1356469]].[[キー>#bfd76ff6]].[[初期ベクトル>#z7fc7e40]].[[暗号文>#v135760d]].[[認証タグ>#j00511a1]]
--
 BASE64URL (UTF-8 (JWE Protected Header))
 .
 BASE64URL(JWE Encrypted Key)
 .
 BASE64URL(JWEInitialization Vector)
 .
 BASE64URL(JWE Ciphertext)
 .
 BASE64URL(JWE Authentication Tag)

***JWE JSON Serialization [#j471416b]
同じコンテンツを複数の当事者に暗号化することを可能にする。

**アルゴリズム [#head797a]
**保護ヘッダ・非保護ヘッダ [#je66d2ef]
[[JOSEヘッダ>#e1356469]]は、以下のメンバの和集合。

***[[RSAES-OAEP and AES GCM>#u6a363cb]] [#zd0e348e]
{"alg":"RSA-OAEP","enc":"A256GCM"}
***保護ヘッダ [#kfb01963]
認証された暗号化を利用して、完全性を保証。

***[[RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256>#p5537b05]] [#p51dc747]
{"alg":"RSA1_5","enc":"A128CBC-HS256"}
-パラメタ

***[[AES Key Wrap and AES_128_CBC_HMAC_SHA_256>#z57bfc52]] [#tb96fbcc]
{"alg":"A128KW","enc":"A128CBC-HS256"}
--alg : [[暗号化キー>#bfd76ff6]]の値を暗号化または決定するために使用される暗号アルゴリズムを識別

--enc : [[暗号文>#v135760d]]と[[認証タグ>#j00511a1]]を生成するために「平文で認証された暗号化を実行するために」使用されるコンテンツ暗号化アルゴリズムを識別

--zip : 暗号化の前に平文に適用される「圧縮」アルゴリズム

-例
--{"alg":"RSA-OAEP","enc":"A256GCM"}

***共有 非保護ヘッダ [#ma48290f]
[[JWE JSON Serialization>#j471416b]]の場合に必要な、受信者毎に共通の非保護ヘッダ

***個別 非保護ヘッダ [#mec07b39]
[[JWE JSON Serialization>#j471416b]]の場合に必要らしい。

**アルゴリズム [#head797a]

***[[JWAを確認>JWA#o355e9ee]] [#iefde689]

*手順 [#x13d150f]

**暗号化 [#k0d929b6]

***[[JWE Protected Header>#kfb01963]]の決定 [#ncaa4347]
{"alg":"RSA-OAEP","enc":"A256GCM"} など。

***[[暗号化キー>#bfd76ff6]]の生成 [#s20810d3]
-ランダムなコンテンツ暗号化キーを生成。~
乱数を生成する際の考慮事項については、RFC 4086を参照

-alg
--Key Wrapping, Key Encryption, or Key Agreement with Key Wrapping
---alg:RSAES-OAEPの場合、受信者の公開鍵で暗号化キーを暗号化したバイト列

--Direct Key Agreement
---alg:XXXXXの場合、空のバイト列とする。

--Direct Encryption
---alg:XXXXXの場合、共有対称鍵のバイト列とする。

-Base64urlエンコードする。

※ [[JWE JSON Serialization>#j471416b]]を使用している場合は、上記を繰り返す。

***[[初期化ベクター>#z7fc7e40]]の生成 [#b2ecbf49]
***[[初期化ベクトル>#z7fc7e40]]の生成 [#b2ecbf49]
-enc

--encアルゴリズムに初期化ベクターが必要な場合
---ランダムなコンテンツ暗号化の初期化ベクターを生成。
--encアルゴリズムに初期化ベクトルが必要な場合
---ランダムなコンテンツ暗号化の初期化ベクトルを生成。

--encアルゴリズムに初期化ベクターが必要でない場合
--encアルゴリズムに初期化ベクトルが必要でない場合
---空のバイト列とする。

-Base64urlエンコードする。

***追加の認証データ暗号化パラメタ [#ad797074]
-[[JWE Compact Serialization>#c33082e5]]の場合
--ASCII(BASE64URL(UTF8([[JWE Protected Header>#kfb01963]])))

-[[JWE JSON Serialization>#j471416b]]の場合
--ASCII(BASE64URL(UTF8([[JWE Protected Header>#kfb01963]]))|| '.' || BASE64URL(JWE AAD))

※ AADとは、詳細不明だが、[[JWE JSON Serialization>#j471416b]]の場合に必要らしい。

***[[暗号文>#v135760d]]の生成 [#p3e87c31]
-平文を
--必要ならzipのアルゴリズムで圧縮
--encのアルゴリズムで暗号化する。

-Base64urlエンコードする。

***[[認証タグ>#j00511a1]]の生成 [#w9ce54de]
-[[追加の認証データ暗号化パラメタ>#ad797074]]をencのアルゴリズムで暗号化する。
-Base64urlエンコードする。

***Serialization [#m74f662c]
-[[JWE Compact Serialization>#c33082e5]]
-or [[JWE JSON Serialization>#j471416b]]

**復号化 [#g7091459]
-[[暗号化>#k0d929b6]]の逆プロセス
-としては、を使用する。

**具体例 [#y795b705]

***RSAES-OAEP and AES GCM [#u6a363cb]
https://tools.ietf.org/html/rfc7516#appendix-A.1.1

***RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256 [#p5537b05]
https://tools.ietf.org/html/rfc7516#appendix-A.2.1

***AES Key Wrap and AES_128_CBC_HMAC_SHA_256 [#z57bfc52]
https://tools.ietf.org/html/rfc7516#appendix-A.3.1

*自作ライブラリ [#a1a37be5]

**署名・暗号化アルゴリズム [#p4042a8b]
[[ココ>.NETの署名・暗号化アルゴリズム]]の署名・暗号化アルゴリズムを使用すると良い。

**参考サイト [#n362c23f]
-

**検証サイト [#k6c39e4c]
-

*参考 [#cc575d12]
-RFC 7516 - JSON Web Encryption (JWE)~
https://tools.ietf.org/html/rfc7516

**[[JWA - JWE用>JWA#o355e9ee]] [#xd6c0477]

**[[暗号化アルゴリズム]] [#gc5974cd]
***[[.NETの署名・暗号化アルゴリズム]] [#db2f0e77]

----
Tags: [[:認証基盤]], [[:クレームベース認証]], [[:暗号化]]


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