MS_JWA - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
移行メモ(正式名称): JWA = JSON Web Algorithms(RFC 7518)。
JOSE の 4 仕様(JWS / JWE / JWK / JWA)のうち、
「どのアルゴリズムを、どの識別子で呼ぶか」を一手に定めているのが JWA である。
単独で使うものではなく、他の 3 仕様から参照される辞書のような位置づけ。
- RFC 7518 - JSON Web Algorithms (JWA)
https://datatracker.ietf.org/doc/html/rfc7518
JWS用
alg 値 |
Digital Signature or MAC Algorithm | 実装要件 |
|---|---|---|
| HS256 | HMAC using SHA-256 | Required |
| HS384 | HMAC using SHA-384 | Optional |
| HS512 | HMAC using SHA-512 | Optional |
| RS256 | RSASSA-PKCS1-v1_5 using SHA-256 | Recommended |
| RS384 | RSASSA-PKCS1-v1_5 using SHA-384 | Optional |
| RS512 | RSASSA-PKCS1-v1_5 using SHA-512 | Optional |
| ES256 | ECDSA using P-256 and SHA-256 | Recommended+ |
| ES384 | ECDSA using P-384 and SHA-384 | Optional |
| ES512 | ECDSA using P-521 and SHA-512 | Optional |
| PS256 | RSASSA-PSS using SHA-256 and MGF1 with SHA-256 | Optional |
| PS384 | RSASSA-PSS using SHA-384 and MGF1 with SHA-384 | Optional |
| PS512 | RSASSA-PSS using SHA-512 and MGF1 with SHA-512 | Optional |
| none | No digital signature or MAC performed | Optional |
補足(実装要件の記号): 「Recommended+」「Recommended-」という表記は、
RFC 7518 独自の記法である。
記号 意味 +将来、要件が上がると見込まれる(推奨度が増す方向) -将来、要件が下がると見込まれる(廃れる方向) つまり
ES256(Recommended+)は「今後さらに推奨される」、
RSA1_5(Recommended-)は「今後推奨されなくなる」という予告である。
実際、後述のとおりRSA1_5は現在では使ってはならない。なお、これらの用語の意味は
技術文書中での Shall / Should / Mayを参照。
取り敢えず以下を抑えると良さそう。
補足(
alg: noneは攻撃に使われる): 表の最後にあるnoneは、
JWT の最も有名な脆弱性の原因である。
- 攻撃者が正規の JWT を入手する。
- ヘッダの
algをnoneに書き換え、署名部分を空にする。- 検証側が「
algヘッダの値を信じて」検証をスキップすると通ってしまう。同様に、
RS256(公開鍵で検証)をHS256(共有鍵で検証)に
すり替える アルゴリズム混同攻撃もある
(公開鍵を HMAC のキーとして使わせる)。対策は一つで、
- 受け取った
algを信用せず、検証側が使うアルゴリズムを固定する。ライブラリの API で「期待するアルゴリズムを明示する」形になっているか
必ず確認したい。
JWE用
主なものを抜粋する。
alg 値 |
Key Management Algorithm | 実装要件 |
|---|---|---|
| RSA1_5 | RSAES-PKCS1-v1_5 | Recommended- |
| RSA-OAEP | RSAES OAEP using default parameters | Recommended+ |
| RSA-OAEP-256 | RSAES OAEP using SHA-256 and MGF1 with SHA-256 | Optional |
| A128KW / A256KW | AES Key Wrap(128 / 256 bit) | Recommended |
| dir | 共有対称鍵を CEK として直接使用 | Recommended |
| ECDH-ES | ECDH Ephemeral Static key agreement using Concat KDF | Recommended+ |
| ECDH-ES+A128KW / +A256KW | ECDH-ES + AES Key Wrap | Recommended |
| A128GCMKW / A192GCMKW / A256GCMKW | AES GCM による鍵ラップ | Optional |
| PBES2-HS256+A128KW ほか | PBES2(パスワード ベース) | Optional |
補足(
RSA1_5は使ってはならない):RSA1_5(RSAES-PKCS1-v1_5)は
Bleichenbacher 攻撃(パディング オラクル攻撃)に対して脆弱であり、
現在は使用してはならないとされている
(RFC 8725 / JOSE の後継仕様で非推奨化)。鍵管理の現在の選択は次のとおり。
用途 推奨 RSA 鍵を使う RSA-OAEP-256(RSA-OAEPは SHA-1 ベースなので 256 を選ぶ)楕円曲線を使う ECDH-ES+A256KW共有鍵がある dir+A256GCM
enc 値 |
Content Encryption Algorithm | 実装要件 |
|---|---|---|
| A128CBC-HS256 | AES_128_CBC_HMAC_SHA_256 | Required |
| A192CBC-HS384 | AES_192_CBC_HMAC_SHA_384 | Optional |
| A256CBC-HS512 | AES_256_CBC_HMAC_SHA_512 | Required |
| A128GCM | AES GCM using 128-bit key | Recommended |
| A192GCM | AES GCM using 192-bit key | Optional |
| A256GCM | AES GCM using 256-bit key | Recommended |
- Required: A128CBC-HS256 / A256CBC-HS512
- Recommended: A128GCM / A256GCM
補足(GCM を選ぶ):
*CBC-HS*は
Encrypt-then-MAC を手組みしたもの、
*GCMは AEAD(認証付き暗号) である。
実装ミスの余地が小さく処理も速いため、
新規実装ではA256GCMを選ぶのが定石である。
JWK用(鍵の暗号アルゴリズム)
| 種別 | RFC 7518 の節 |
|---|---|
kty(Key Type) |
6.1 |
| 非対称鍵(ECC) | 6.2 |
| 非対称鍵(RSA) | 6.3 |
| 対称鍵 | 6.4 |
補足(EdDSA / Ed25519 の追加): RFC 7518 の制定後、
RFC 8037 でEdDSA(Ed25519 / Ed448)と
kty: OKP(Octet Key Pair)が追加された。
特徴 EdDSA (Ed25519) 署名が短く高速。実装ミスに強い(曲線パラメータの選択余地が無い) 相互運用性の観点からは
ES256/RS256が無難だが、
内部で閉じた用途なら EdDSA も有力な選択肢である。
-
RFC 7518 - JSON Web Algorithms (JWA)
https://datatracker.ietf.org/doc/html/rfc7518 -
RFC 8725 - JSON Web Token Best Current Practices
https://datatracker.ietf.org/doc/html/rfc8725 -
RFC 8037 - CFRG ECDH and Signatures in JOSE
https://datatracker.ietf.org/doc/html/rfc8037 -
IANA: JSON Web Signature and Encryption Algorithms
https://www.iana.org/assignments/jose/jose.xhtml
Tags: 移行, IT国際標準, プログラミング, 通信技術, 認証基盤, クレームベース認証, 暗号化