[11] 
[DFN[[CODE[alg]]]]
は、[[暗号化アルゴリズム]]を表す[[ヘッダー引数]]です。

* 仕様書

[REFS[
- [2] [[RFC 7518]]
-- [1] [CITE@en[[[RFC 7518]] - JSON Web Algorithms ([[JWA]])]], [TIME[2019-11-27 04:11:14 +09:00]] <https://tools.ietf.org/html/rfc7518#section-3>
--- [5] <https://tools.ietf.org/html/rfc7518#section-3.6>
-- [16] <https://tools.ietf.org/html/rfc7518#section-4>
-- [18] 
<https://tools.ietf.org/html/rfc7518#section-7.1>
-- [22] 
<https://tools.ietf.org/html/rfc7518#section-8.5>
- [23] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-2>
- [24] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-4.1.1>
- [26] 
[CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]], [TIME[2022-11-23T07:56:14.000Z]] <https://datatracker.ietf.org/doc/html/rfc7516#section-4.1.1>
- [32] 
[CITE@en[[[RFC 7517]]: JSON Web Key (JWK)]], [TIME[2022-12-01T12:39:17.000Z]] <https://www.rfc-editor.org/rfc/rfc7517.html#section-4.4>
- [20] [CITE[JSON Object Signing and Encryption ([[JOSE]])]], [TIME[2019-03-14 06:55:09 +09:00]] <https://www.iana.org/assignments/jose/jose.xhtml#web-signature-encryption-algorithms>


]REFS]

* 意味

[25] 
[[JWS]]
の[[ヘッダー引数]]
[CODE[alg]]
([RUBYB[algorithm][算法]])
は、
[[JWS]]
で使う[[暗号]]アルゴリズムを識別するものです。
[SRC[>>24]]

[30] 
[[JWE]]
の[[ヘッダー引数]]
[CODE[alg]]
([RUBYB[algorithm][算法]])
は、
[[JWE]]
で
[[CEK]] 値の[[暗号化]]や決定に使う[RUBYB[[[暗号算法]]][cryptographic algorithm]]を識別するものです。
[SRC[>>26]]

[33] 
[[JWK]]
の[[鍵引数]]
[CODE[alg]]
([RUBYB[algorithm][算法]])
は、
[[鍵]]と共に使う想定の[[算法]]を識別するものです。
[SRC[>>32]]


* 値

[27] 
[[JWK]]
の
[CODE[alg]]
の値は、
[[StringOrURI]]
です。
[[IANA登録簿]]にあるものか、
[[耐衝突名]]が含まれる値である[RUBYB[べき][should]]です。
[SRC[>>24]]

[37] 
[[JWE]]
の仕様書では不明瞭ですが、
やはり同様と思われます。


[36] 
[[JWK]]
の
[CODE[alg]]
の値は、
[[大文字・小文字区別]]する[[ASCII文字列]]です。
[[IANA登録簿]]に登録されたものか、
[[耐衝突名]]を含む値である[RUBYB[べき][should]]です。
[SRC[>>32]]



[FIG(short list)[ [3] [[デジタル署名]]・[[MAC]] 用の [CODE[alg]] [SRC[>>1]]
- [CODE[HS256]]
- [CODE[HS384]]
- [CODE[HS512]]
- [CODE[RS256]]
- [CODE[RS384]]
- [CODE[RS512]]
- [CODE[ES256]]
- [CODE[ES384]]
- [CODE[ES512]]
- [CODE[PS256]]
- [CODE[PS384]]
- [CODE[PS512]]
- [CODE[none][alg=none]]
- [CODE[EdDSA]] [SRC[[[RFC 8032]], >>20]]
]FIG]

[FIG(short list)[ [15] [[JWE]] 用の [CODE[alg]] [SRC[>>16]]
- [CODE[RSA1_5]]
- [CODE[RSA-OAEP]]
- [CODE[RSA-OAEP-256]]
- [CODE[A128KW]]
- [CODE[A192KW]]
- [CODE[A256KW]]
- [CODE[dir]]
- [CODE[ECDH-ES]]
- [CODE[ECDH-ES+A128KW]]
- [CODE[ECDH-ES+A192KW]]
- [CODE[ECDH-ES+A256KW]]
- [CODE[A128GCMKW]]
- [CODE[A192GCMKW]]
- [CODE[A256GCMKW]]
- [CODE[PBES2-HS256+A128KW]]
- [CODE[PBES2-HS384+A192KW]]
- [CODE[PBES2-HS512+A256KW]]
- [CODE[RSA-OAEP-384]] [SRC[[[WebCrypto]], >>20]]
- [CODE[RSA-OAEP-512]] [SRC[[[WebCrypto]], >>20]]
]FIG]


[4] 実装が必須のものと、そうでないものがあります。 [SRC[>>1, >>16]]

[17] [CODE[alg]] 依存で、他の[[ヘッダー引数]]を使ったり、
[[JWE被暗号化鍵]]値を生成したりします。
[SRC[>>16]]

[19] [[IANA登録簿]] [SRC[>>20]] があります。 [SRC[>>18]]

[21] 
[CODE[enc]] や [[JWK]] の登録簿と共通になっていますが、
種別で区別されており、
現時点で複数の場面
[WEAK[([[JWK]] を除く。)]]
で使えるものはありません。
[TIME[2019-12-06T04:44:58.100Z]]

* 文脈


[28] 
[[JWS]]
の
[CODE[alg]]
[[ヘッダー引数]]は、
[MUST[必須]]です。
[SRC[>>24]]
[[JWS]] の [[JOSEヘッダー]]に必ず含まれなければなりません。

[31] 
[[JWE]]
の仕様書では不明瞭ですが、
やはり必須と思われます。

[34] 
[[JWK]]
では指定してもしなくても[MAY[構いません]]。
[SRC[>>32]]

* 処理

[29] 
[[JWS]] の実装は、
[CODE[alg]]
[[ヘッダー引数]]を理解し処理しなければ[MUST[なりません]]。
[SRC[>>24]]

[35] 
[[JWE]]
の仕様書では不明瞭ですが、
やはり必須と思われます。


* [CODE[alg=none]]

[6] 
[DFN[[RUBYB[非保安JWS][Unsecured JWS]]]]
は、
[[一貫性]]保護のない [[JWS]] です。
[CODE[alg]] の値 [DFN[[CODE[none][alg=none]]]]
で表します。
[SRC[>>5, >>23]]
[[JWS]]
は、
[[一貫性保護]]なしで作成して[MAY[構いません]]。
[SRC[>>5]]

[7] 
[CODE[alg=none]]
の場合、
[[空のオクテット列][空バイト列]]を [[JWS Signature value]] として使わなければ[MUST[なりません]]。
[SRC[>>5]]

[8] 
[[受信者]]は、
[[JWS Signature value]]
が[[空のオクテット列][空バイト列]]であることを[[検証]]しなければ[MUST[なりません]]。
[SRC[>>5]]

[9] 
[[実装]]は、
[[非保安JWS]]に対応する場合であっても、
[[応用]]が当該[[オブジェクト]]の[[一貫性]]が保護されなくても受理可能と規定する場合を除き、
当該[[オブジェクト]]を[[妥当]]なものとして受理しては[MUST[なりません]]。
[SRC[>>5]]

[10] 
[[実装]]は、[[既定]]で[[非保安JWS]]を受理しては[MUST[なりません]]。
[[応用]]は、
[[downgrade attack]] を軽減するため、
[[非保安JWS]]を[RUBYB[大域的][at a global level]]に受理することを[RUBYB[信号][signal]]しては[MUST[ならず]]、
[[オブジェクト]]毎に受理することを信号する[SHOULD[べきです]]。
[SRC[>>5]]

[12] 
このように[[仕様書]]で警告されているにも関わらず、
[CODE[alg=none]]
は[[脆弱性]]の温床となっているようです。

[13] 
[[JWS]] は[[デジタル署名]]するものですが、
署名のための[[暗号化アルゴリズム]]が「なし」
である、つまり[[デジタル署名]]しないことを表しています。
[[デジタル署名]]されていることを期待して [[JWS]]
を採用しているのに、
[CODE[alg=none]]
が使われていると意味をなしません。

[14] 
おそらく、
[[暗号化アルゴリズム]]の適用が比較的高コストな操作であるため、
リスクの低い操作では適用しない[[応用]]が考えられて、
しかも[[デジタル署名]]を適用する場合としない場合で同一の構文とすることで処理の統一による簡略化が期待され、
このような方法が用意されているのでしょう。

* メモ