MS_JWE - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

JWE

抂芁

以䞋の内容で最終確認枈み。
https://tools.ietf.org/html/rfc7516

  • JWE は、暗号化のオプション暗号化された JWT。

    • 暗号化されたデヌタを JSONの Base64 URL Encode圢匏で
      衚珟するための仕様
    • 暗号化された SAML アサヌションを Connect に移行する
      ナヌスケヌスなどが想定される。
  • 認蚌付き暗号AEADを利甚しお、以䞋を保蚌する。

    • 平文の機密性ず完党性
    • および保護ヘッダず远加認蚌デヌタAADの完党性

補足䜿いどころ: 実務で JWE が芁るのは意倖ず限られる。

  • トヌクンは通垞 TLS で運ばれるため、経路䞊の秘匿は TLS が担う。
  • JWE が効くのは「䞭継者に䞭身を芋せたくない」堎合
    ブラりザを経由する ID トヌクン、フロントチャネルで枡すリク゚スト オブゞェクトなど。

よく䜿われるのは Nested JWT眲名しおから暗号化で、
OpenID Connect の id_token_encrypted_response_alg や、
FAPIFinancial API (FAPI)などのプロファむルで登堎する。

なお、眲名の代わりに暗号化を䜿っおはならない。
AEAD は「鍵を持぀誰か」が䜜ったこずしか瀺さず、
発行者の特定吊認防止はできない。

構成芁玠

JWE Compact Serialization or JWE JSON Serialization のどちらでも、
基本的にすべお base64url で゚ンコヌドされる。

JOSEヘッダ

JWE の基本的なヘッダ≒ JWE Compact Serialization の堎合の保護ヘッダには、
以䞋のものがある。

ヘッダの䟋

組み合わせ ヘッダ
RSAES-OAEP and AES GCM {"alg":"RSA-OAEP","enc":"A256GCM"}
RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256 {"alg":"RSA1_5","enc":"A128CBC-HS256"}
AES Key Wrap and AES_128_CBC_HMAC_SHA_256 {"alg":"A128KW","enc":"A128CBC-HS256"}

補足最新化: alg: RSA1_5RSAES-PKCS1-v1_5は
Bleichenbacher 攻撃パディング オラクルに察しお脆匱であり、
RFC 8725JWT Best Current Practicesでも䜿甚しないよう求められおいる。
珟圚は次を䜿う。

甹途 掚奚
鍵の受け枡しRSA RSA-OAEP-256RSA-OAEP は SHA-1 ベヌス
鍵の受け枡しEC ECDH-ES+A256KW
コンテンツ暗号 A256GCMたたは A128CBC-HS256

JWKをサポヌトする堎合

jwk / kid / jku などで受信者の鍵を瀺す。

TLS芁件

JWSず同じ。

ヘッダ以降

認蚌付き暗号AEAD暗号化アルゎリズムに぀いおの知識が必芁。

コンテンツ暗号化キヌCEK

  • enc の認蚌付き暗号AEAD操䜜の暗号化キヌ
    平文を暗号化しお暗号文ず認蚌タグMACを生成するために
    䜿甚される認蚌付き暗号AEADアルゎリズムの察称鍵。

  • alg によっお暗号化たたは決定される。

    • 䞀郚のアルゎリズムでは、空のオクテットシヌケンスになる。

enc の認蚌付き暗号AEAD操䜜によっお決定される。

  • 平文を暗号化するずきに䜿甚される初期化ベクトル倀。
  • 䞀郚のアルゎリズムでは、空のオクテットシヌケンスになる。

補足重芁: AES-GCM では、同じ鍵で IVnonceを再利甚するず
鍵ストリヌムが再利甚され、平文が埩元できるうえ認蚌鍵たで挏れる
。
CEK をメッセヌゞ毎にランダム生成する JWE の通垞の䜿い方では起きないが、
「CEK を固定しお䜿い回す」独自実装をするず即座に砎綻する。

远加認蚌デヌタAAD

  • 認蚌付き暗号AEAD操䜜の認蚌や完党性保護のためにあり、
    暗号化はされないが認蚌保護の察象である。
  • JWE Compact Serialization の堎合は䜿甚存圚せず、
    JWE JSON Serialization の堎合にのみ䜿甚存圚。

暗号文

  • enc の認蚌付き暗号AEAD操䜜によっお、
    • 平文ずコンテンツ暗号化キヌCEK、远加認蚌デヌタAADから、
    • 暗号文ず認蚌タグを生成する。

認蚌タグMAC

  • enc の認蚌付き暗号AEAD操䜜によっお、

    • 平文ずコンテンツ暗号化キヌCEK、远加認蚌デヌタAADから、
    • 暗号文ず認蚌タグを生成する。
  • 䞀郚のアルゎリズムでは認蚌タグを䜿甚しない堎合がある。

詳现

暗号化アルゎリズムの以䞋の芁玠に぀いお理解が必芁。

  • 基瀎甚語
  • 認蚌付き暗号AEAD

キヌ管理モヌド

  • コンテンツ暗号化キヌCEK倀を決定するための方法。
  • この仕様で䜿甚されるキヌ管理モヌドには以䞋のモノがある。
モヌド 内容
キヌ暗号化 ハむブリッド暗号化キヌ亀換の利甚を意図。RSA-OAEP、RSA1_5 などの鍵亀換アルゎリズムを䜿甚
キヌラッピング 察称キヌラッピングアルゎリズムの利甚を意図。鍵ラップ・アルゎリズムを䜿甚
盎接キヌ契玄 鍵合意アルゎリズムの利甚を意図
キヌラッピングによるキヌ契玄 察称キヌラッピングアルゎリズムの察称鍵に、鍵合意アルゎリズムの利甚を意図
盎接暗号化 CEK 倀が圓事者間で共有される鍵管理モヌド

キヌ暗号化

  • ハむブリッド暗号化キヌ亀換の利甚を意図したキヌ管理モヌド。

  • RSA-OAEP、RSA1_5 などの鍵亀換アルゎリズムを䜿甚する。

  • 以䞋の参考資料を参照するず、

    • 公開鍵: JWK Set を登録若しくは jwks_uri で公開
    • 秘密鍵: 蚌明曞や JWK Set

    ずなるもよう鍵亀換だが、アリスずボブではなく単なる公開鍵暗号化。

  • 参考

キヌラッピング

  • 察称キヌラッピングアルゎリズムの利甚を意図したキヌ管理モヌド。
  • 鍵ラップ・アルゎリズムを䜿甚する。
    • A128KW / A192KW / A256KW
    • A128GCMKW / A192GCMKW / A256GCMKW

盎接キヌ契玄

鍵合意アルゎリズムの利甚を意図したキヌ管理モヌドECDH-ES。

キヌラッピングによるキヌ契玄

察称キヌラッピングアルゎリズムの察称鍵に、
鍵合意アルゎリズムの利甚を意図したキヌ管理モヌドECDH-ES+A256KW。

盎接暗号化

CEK 倀が圓事者間で共有される鍵管理モヌドdir。

移行メモ正誀: 元ペヌゞの芋出しは
「キヌラッピングによる䞻芁契玄」ずなっおいたが、
原文は Key Agreement with Key Wrapping であり、
「キヌラッピングによる鍵契玄鍵合意」が正しい。
䞀芧偎の衚蚘に合わせた。

衚珟(゚ンコヌド)

  • 構成芁玠ヘッダ、キヌ、初期ベクトル、暗号文、認蚌タグMACを
    以䞋のように衚珟(゚ンコヌド)したもの。
  • 以䞋の 2 ぀の衚珟(゚ンコヌド)方法があり、
    どちらでも、構成芁玠は base64url で゚ンコヌドされる。

JWE Compact Serialization

  • ≒ JWS Compact Serialization

  • 暗号文認蚌タグMACのデヌタを JSONの Base64 URL Encode圢匏で衚珟する。

  • 䟋
    ヘッダ保護ヘッダキヌ初期ベクトル暗号文認蚌タグMAC

    BASE64URL (UTF-8 (JWE Protected Header))
    .
    BASE64URL(JWE Encrypted Key)
    .
    BASE64URL(JWE Initialization Vector)
    .
    BASE64URL(JWE Ciphertext)
    .
    BASE64URL(JWE Authentication Tag)
    

JWE JSON Serialization

  • ≒ JWS JSON Serialization

  • 同じコンテンツを耇数の圓事者に暗号化するこずを可胜にする。

  • Syntax

    • protected = BASE64URL(UTF8(保護ヘッダ))
    • unprotected = 共有 非保護ヘッダ
    • recipients = 受信者毎に個別の情報
      • header = 個別 非保護ヘッダ
      • encrypted_key = BASE64URL(キヌ)
    • aad = BASE64URL(远加認蚌デヌタAAD)
    • iv = BASE64URL(初期ベクトル)
    • ciphertext = BASE64URL(暗号文)
    • tag = BASE64URL(認蚌タグMAC)
  • 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 JWE 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>"
      }

移行メモ: 元ペヌゞの芋出しは
「JWE Using Flattened JWS JSON Serialization」ずなっおいたが、
RFC 7516 の名称は Flattened JWE JSON Serialization である。

保護ヘッダ・非保護ヘッダ

JOSE ヘッダは、以䞋のメンバの和集合。

  • JWE Compact Serialization の堎合は、JOSE ヘッダ ≒ 保護ヘッダ。
  • JWE JSON Serialization の堎合は、
    JOSE ヘッダ ≒ 保護ヘッダ and / or 共有 非保護ヘッダ and / or 個別 非保護ヘッダ

保護ヘッダ

  • 認蚌された暗号化を利甚しお、完党性を保蚌。

    • 認蚌付き暗号AEAD操䜜によっお完党性保護されたヘッダ・パラメタを含む
      JSON オブゞェクト。
    • これらのパラメタは、受信者毎に共通。
  • パラメタ

パラメタ 内容
alg 暗号化キヌの倀を暗号化たたは決定するために䜿甚される暗号アルゎリズムを識別
enc 認蚌付き暗号AEADのアルゎリズムを識別
zip 暗号化の前に平文に適甚される「圧瞮」アルゎリズム
  • 䟋
    • {"alg":"RSA-OAEP","enc":"A256GCM"}

補足zip は䜿わない: 「圧瞮しおから暗号化」は
**圧瞮率から平文を掚枬する攻撃CRIME / BREACH ず同皮**を招く。
RFC 8725 も zip の䜿甚に譊告しおおり、
既定では䜿わないのが正しい。
加えお、展開時に巚倧化する「zip bomb」による DoS の入口にもなる。

共有 非保護ヘッダ

JWE JSON Serialization の堎合に必芁な、受信者毎に共通の非保護ヘッダ。

個別 非保護ヘッダ

JWE JSON Serialization の堎合に必芁な、受信者毎に個別の非保護ヘッダ。

アルゎリズム

  • alg で、キヌ生成・亀換、
  • enc で、認蚌付き暗号AEAD操䜜。

RSAES-OAEP and AES GCM

補足最新化: .NET Core 3.0 以降は
System.Security.Cryptography.AesGcm クラスが利甚できる。
たた RSA の OAEP は次のように曞くRSAEncryptionPadding.OaepSHA256 が RSA-OAEP-256。

using var rsa = RSA.Create();
byte[] wrapped = rsa.Encrypt(cek, RSAEncryptionPadding.OaepSHA256);

RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256

※ 前述の通り、RSA1_5 は新芏実装では䜿甚しないこず。

AES Key Wrap and AES_128_CBC_HMAC_SHA_256

JWAを確認

JWAを参照。

手順

暗号化

  1. JWE Protected Header の決定
    {"alg":"RSA-OAEP","enc":"A256GCM"} など。

  2. 暗号化キヌの生成

    • ランダムなコンテンツ暗号化キヌを生成。
      乱数を生成する際の考慮事項に぀いおは、RFC 4086 を参照
    • alg 別
      • Key Wrapping / Key Encryption / Key Agreement with Key Wrapping
        → 受信者の公開鍵たたは共有鍵で暗号化キヌを暗号化したバむト列
      • Direct Key AgreementECDH-ES
        → 空のバむト列ずする。
      • Direct Encryptiondir
        → 空のバむト列ずするCEK は共有枈みの察称鍵そのもの。
    • Base64url ゚ンコヌドする。

    ※ JWE JSON Serialization を䜿甚しおいる堎合は、䞊蚘を繰り返す。

  3. 初期化ベクトルの生成

    • enc アルゎリズムに初期化ベクトルが必芁な堎合
      → ランダムなコンテンツ暗号化の初期化ベクトルを生成。
    • 必芁でない堎合
      → 空のバむト列ずする。
    • Base64url ゚ンコヌドする。
  4. 远加の認蚌デヌタ暗号化パラメタ

    • JWE Compact Serialization の堎合
      ASCII(BASE64URL(UTF8(JWE Protected Header)))
    • JWE JSON Serialization の堎合
      ASCII(BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE AAD))
  5. 暗号文の生成

    • 平文を、必芁なら zip のアルゎリズムで圧瞮し、enc のアルゎリズムで暗号化する。
    • Base64url ゚ンコヌドする。
  6. 認蚌タグの生成

    • AEAD 操䜜が、暗号文ず同時に認蚌タグを出力する。
    • Base64url ゚ンコヌドする。
  7. Serialization

    • JWE Compact Serialization or JWE JSON Serialization

移行メモ正誀: 元ペヌゞは

  • alg の Direct Encryption を「共有察称鍵のバむト列ずする」、
  • 認蚌タグの生成を「远加の認蚌デヌタ暗号化パラメタを enc の
    アルゎリズムで暗号化する」

ずしおいたが、いずれも実際ず異なる。

  • dirDirect Encryptionでは、CEK は共有枈みの鍵そのものであり、
    JWE Encrypted Key の欄は空になる鍵を送らないのが芁点。
  • 認蚌タグは AAD を暗号化したものではなく、
    AEAD が暗号文ず䞀緒に出力する完党性の倀である。
    AAD は認蚌の入力になるだけで、暗号化はされない。

埩号化

暗号化の逆プロセスを行う。

補足埩号時の鉄則: 認蚌タグの怜蚌に倱敗したら、
埩号結果を䞀切䜿っおはならない
゚ラヌ内容も詳しく返さない。
「埩号しおから怜蚌する」「倱敗理由で応答を倉える」実装は
パディング オラクル攻撃の入口になる。

具䜓䟋

アルゎリズムの組み合わせ 参照
RSAES-OAEP and AES GCM RFC 7516 Appendix A.1 https://tools.ietf.org/html/rfc7516#appendix-A.1
RSAES-PKCS1-v1_5 and AES_128_CBC_HMAC_SHA_256 RFC 7516 Appendix A.2 https://tools.ietf.org/html/rfc7516#appendix-A.2
AES Key Wrap and AES_128_CBC_HMAC_SHA_256 RFC 7516 Appendix A.3 https://tools.ietf.org/html/rfc7516#appendix-A.3

自䜜ラむブラリ

眲名・暗号化アルゎリズム

.NETの眲名・暗号化アルゎリズムの眲名・暗号化アルゎリズムを
䜿甚するず良い。

補足: JWS 以䞊に、JWE の自䜜は勧められない。
AEAD の䜿い方、IV の管理、パディング オラクルの回避など、
誀るず即座に砎綻する芁玠が倚い。
.NET なら Microsoft.IdentityModel.JsonWebTokens、
あるいは jose-jwt のような実瞟のあるラむブラリを䜿う。

参考


Tags: 移行, IT囜際暙準, プログラミング, 通信技術, 認蚌基盀, クレヌムベヌス認蚌, 暗号化

⚠ **GitHub.com Fallback** ⚠