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

-[[戻る>JWT]]

* 目次 [#re273910]
#contents

*概要 [#sf29c23e]
以下の内容で最終確認済み。~
https://tools.ietf.org/html/rfc7516

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

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

*構成要素 [#n03afb80]
[[JWE Compact Serialization>#c33082e5]] or [[JWE JSON Serialization>#j471416b]]のどちらでも、基本的にすべてbase64urlでエンコードされる。

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

***ヘッダの例 [#d4c66032]
-[[RSAES-OAEP and AES GCM>#c041c0be]]~
 {"alg":"RSA-OAEP","enc":"A256GCM"}
-[[RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256>#u74c89cc]]~
 {"alg":"RSA1_5","enc":"A128CBC-HS256"}
-[[AES Key Wrap and AES_128_CBC_HMAC_SHA_256>#d6c1477e]]~
 {"alg":"A128KW","enc":"A128CBC-HS256"}

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

***TLS要件 [#k9ef1dc4]
[[JWSと同じ。>JWS#x222cc1c]]

**ヘッダ以降 [#fb7b09ec]
[[認証付き暗号(AEAD)暗号化アルゴリズム>#z0c146f9]]についての知識が必要。

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

-"alg"によって暗号化または決定される。
--・・・
--一部のアルゴリズムでは、空のオクテットシーケンスになる。

***[[初期化ベクトル>暗号化アルゴリズム#z3a67f9f]] [#z7fc7e40]
"enc"の[[認証付き暗号(AEAD)>#z96efc69]]操作によって決定される。
-平文を暗号化するときに使用される初期化ベクトル値。
-一部のアルゴリズムでは、空のオクテットシーケンスになる。

***追加認証データ(AAD) [#m2591477]
-[[認証付き暗号(AEAD)>#z96efc69]]操作の認証や完全性保護のためにあり、暗号化はされないが認証保護の対象である。
-[[JWE Compact Serialization>#c33082e5]]の場合は使用(存在)せず、[[JWE JSON Serialization>#j471416b]]の場合にのみ使用(存在)。

***[[暗号文>#p819cde2]] [#v135760d]
-"enc"の[[認証付き暗号(AEAD)>#z96efc69]]操作によって、
--平文と[[コンテンツ暗号化キー(CEK)>#v40d2646]]、[[追加認証データ(AAD)>#m2591477]]から、
--暗号文と[[認証タグ>#j00511a1]]を生成する。

***認証タグ(MAC) [#j00511a1]
-"enc"の[[認証付き暗号(AEAD)>#z96efc69]]操作によって、
--平文と[[コンテンツ暗号化キー(CEK)>#v40d2646]]、[[追加認証データ(AAD)>#m2591477]]から、
--[[暗号文>#v135760d]]と認証タグを生成する。

-一部のアルゴリズムでは認証タグを使用しない場合がある。

*詳細 [#t67ef595]

**[[暗号化アルゴリズム]] [#z0c146f9]
[[暗号化アルゴリズム]]の以下の要素について理解が必要

***[[基礎用語>暗号化アルゴリズム#o5b71c69]] [#d957cdd2]

***[[認証付き暗号(AEAD)>暗号化アルゴリズム#u0097a82]] [#z96efc69]

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

***キー暗号化 [#l38f1947]
-[[ハイブリッド・暗号化(キー交換)>暗号化アルゴリズム#z7306cb4]]の利用を意図したキー管理モード。
-RSA-OAEP、RSA1_5などの鍵交換アルゴリズムを使用する。


-以下の参考資料を参照すると、
--Bobが公開する鍵: jwks_uri(若しくはJwkSetを登録)
--Aliceが公開する鍵: JWE Encrypted Key

>となるもよう。
--公開鍵: JwkSetを登録(若しくはjwks_uriで公開)
--秘密鍵: 証明書やJwkSet

>となるもよう(鍵交換だが、アリスとボブではなく単なる公開鍵暗号化)。

-参考
--Financial API 実装の技術課題 - Qiita~
https://qiita.com/TakahikoKawasaki/items/48a9d22205f77db59726
--[前編] IDトークンが分かれば OpenID Connect が分かる - Qiita~
https://qiita.com/TakahikoKawasaki/items/8f0e422c7edd2d220e06

***キーラッピング [#nb71e0a2]
-対称キーラッピングアルゴリズムの利用を意図したキー管理モード。
-AES128KW, AES192KW, AES256KWや、AES128GCMKW, AES192GCMKW and AES256GCMKWなどの鍵ラップ・アルゴリズムを使用する。
-鍵ラップ・アルゴリズムを使用する。
--AES128KW
--AES192KW
--AES256KW
--AES128GCMKW
--AES192GCMKW
--AES256GCMKW

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

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

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

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

***JWE Compact Serialization [#c33082e5]
- ≒ [[JWS Compact Serialization>JWS#xe1c18e7]]
-[[暗号文>#p819cde2]]&[[認証タグ(MAC)>#b94fc707]]のデータを JSON (の Base64 URL Encode) 形式で表現する。

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

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

-Syntax
--"protected" = BASE64URL(UTF8([[保護ヘッダ>#kfb01963]]))
--"unprotected" = [[共有 非保護ヘッダ>#ma48290f]]
--"recipients" = 受信者毎に個別の情報
---"header" = [[個別 非保護ヘッダ>#mec07b39]]
---"encrypted_key" = BASE64URL([[キー>#v40d2646]])
--"aad" = BASE64URL([[追加認証データ(AAD)>#m2591477]])
--"iv" = BASE64URL([[初期ベクトル>#z7fc7e40]])
--"ciphertext" = BASE64URL([[暗号文>#v135760d]])
--"tag" = BASE64URL([[認証タグ(MAC)>#j00511a1]])

-Example
--Complete JWE JSON Serialization Representation
     {
      "protected":"<integrity-protected shared header contents>",
      "unprotected":<non-integrity-protected shared header contents>,
      "recipients":[
       {"header":<per-recipient unprotected header 1 contents>,
        "encrypted_key":"<encrypted key 1 contents>"},
       ...
       {"header":<per-recipient unprotected header N contents>,
        "encrypted_key":"<encrypted key N contents>"}],
      "aad":"<additional authenticated data contents>",
      "iv":"<initialization vector contents>",
      "ciphertext":"<ciphertext contents>",
      "tag":"<authentication tag contents>"
     }
   
--JWE Using Flattened JWS JSON Serialization~
受信者が 1 人のみの場合は Flattened JWE JSON Serialization を使える。
     {
      "protected":"<integrity-protected header contents>",
      "unprotected":<non-integrity-protected header contents>,
      "header":<more non-integrity-protected header contents>,
      "encrypted_key":"<encrypted key contents>",
      "aad":"<additional authenticated data contents>",
      "iv":"<initialization vector contents>",
      "ciphertext":"<ciphertext contents>",
      "tag":"<authentication tag contents>"
     }

**保護ヘッダ・非保護ヘッダ [#je66d2ef]
[[JOSEヘッダ>#e1356469]]は、以下のメンバの和集合。

-[[JWE Compact Serialization>#c33082e5]]の場合は、[[JOSEヘッダ>#e1356469]] ≒ [[保護ヘッダ>#kfb01963]]。
-[[JWE JSON Serialization>#j471416b]]の場合は、[[JOSEヘッダ>#e1356469]] ≒ [[保護ヘッダ>#kfb01963]] and / or [[共有 非保護ヘッダ>#ma48290f]] and / or [[個別 非保護ヘッダ>#mec07b39]]

***保護ヘッダ [#kfb01963]
-認証された暗号化を利用して、完全性を保証。
--[[認証付き暗号(AEAD)>#z96efc69]]操作によって完全性保護されたヘッダ・パラメタを含むJSONオブジェクト。
--これらのパラメタは、受信者毎に共通。

-パラメタ

--alg : [[暗号化キー>#v40d2646]]の値を暗号化または決定するために使用される暗号アルゴリズムを識別

--enc : [[認証付き暗号(AEAD)>#z96efc69]]のアルゴリズムを識別

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

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

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

***個別 非保護ヘッダ [#mec07b39]
[[JWE JSON Serialization>#j471416b]]の場合に必要な、受信者毎に個別の非保護ヘッダ

**アルゴリズム [#head797a]
-algで、キー生成・交換、
-encで、[[認証付き暗号(AEAD)>#z96efc69]]操作。

***[[RSAES-OAEP and AES GCM>#u6a363cb]] [#c041c0be]
***RSAES-OAEP and AES GCM [#c041c0be]
-"alg":"RSA-OAEP"
--Optimal Asymmetric Encryption Padding - Wikipedia~
https://ja.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding
--.NETなら、[[RSACryptoServiceProvider.Encryptメソッド>https://docs.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.encrypt]]の~
第二引数をtrueに指定すると、OAEP パディングを使用する。

-"enc":"A256GCM"~
--アルゴリズム
---[[暗号化アルゴリズム#i96cb450]]
---https://tools.ietf.org/html/rfc7518#section-5.3
--[[.NETライブラリ>暗号化アルゴリズム#n967296a]]

***[[RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256>#p5537b05]] [#u74c89cc]
-[[具体例>#u6a363cb]]

***RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256 [#u74c89cc]
-"alg":"RSA1_5"~
--PKCS - Wikipedia~
https://ja.wikipedia.org/wiki/PKCS
--RFC 2313 - PKCS #1: RSA Encryption Version 1.5~
https://tools.ietf.org/html/rfc2313
--.NETなら、[[RSACryptoServiceProvider.Encryptメソッド>https://docs.microsoft.com/ja-jp/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.encrypt]]の~
第二引数をfalseに指定すると、PKCS#1 v1.5 パディングを使用する。

-"enc":"A128CBC-HS256"
--アルゴリズム~
RFC 7518 - JSON Web Algorithms (JWA)
---5.2.  AES_CBC_HMAC_SHA2 Algorithms~
https://tools.ietf.org/html/rfc7518#section-5.2
---5.2.3.  AES_128_CBC_HMAC_SHA_256~
https://tools.ietf.org/html/rfc7518#section-5.2.3

--.NETライブラリ~
・・・

***[[AES Key Wrap and AES_128_CBC_HMAC_SHA_256>#z57bfc52]] [#d6c1477e]
-[[具体例>#p5537b05]]

***AES Key Wrap and AES_128_CBC_HMAC_SHA_256 [#d6c1477e]
-"alg":"A128KW"~
https://tools.ietf.org/html/rfc3394

-"enc":"A128CBC-HS256"~
[[同上>#u74c89cc]]

--.NETライブラリ~
・・・

-[[具体例>#z57bfc52]]

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

*手順 [#x13d150f]

**暗号化 [#k0d929b6]

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

***[[暗号化キー>#v40d2646]]の生成 [#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]
-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))

***[[暗号文>#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]
-RFC 7516 - JSON Web Encryption (JWE)~
' > A.1.  Example JWE using RSAES-OAEP and AES GCM~
https://tools.ietf.org/html/rfc7516#appendix-A.1.1

-RFC 7518 - JSON Web Algorithms (JWA)~
' > 4.3.  Key Encryption with RSAES OAEP~
https://tools.ietf.org/html/rfc7518#section-4.3

-openssl - What is a difference between RSA-OAEP and RSAES-OAEP? - Stack Overflow~
https://stackoverflow.com/questions/54412865/what-is-a-difference-between-rsa-oaep-and-rsaes-oaep

-OpenTouryo/JWE_RsaOaepAesGcm.cs at develop · OpenTouryoProject/OpenTouryo~
https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Public/Security/JWE_RsaOaepAesGcm.cs

***RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256 [#p5537b05]
https://tools.ietf.org/html/rfc7516#appendix-A.2.1
-RFC 7516 - JSON Web Encryption (JWE)~
' > A.2.  Example JWE using RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256~
https://tools.ietf.org/html/rfc7516#appendix-A.2

***AES Key Wrap and AES_128_CBC_HMAC_SHA_256 [#z57bfc52]
https://tools.ietf.org/html/rfc7516#appendix-A.3.1
-RFC 7516 - JSON Web Encryption (JWE)~
' > A.3.  Example JWE Using AES Key Wrap and AES_128_CBC_HMAC_SHA_256~
https://tools.ietf.org/html/rfc7516#appendix-A.3

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

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

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

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

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

**[[jose-jwt]](ライブラリ) [#p5e20627]
**[[暗号化アルゴリズム]] [#gc5974cd]
***[[JWA - JWE用>JWA#o355e9ee]] [#xd6c0477]
***[[.NETの署名・暗号化アルゴリズム]] [#db2f0e77]

----
Tags: [[:IT国際標準]], [[:認証基盤]], [[:クレームベース認証]], [[:暗号化]]


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