🚡
JOSEのRFCを読む(3) - JWA

myuon

myuon

2023年7月26日
RFC

JOSE関連のRFCを読んだので内容についてまとめます

# はじめに

の続きです。

# RFC7518 JSON Web Algorithms (JWA)

RFC7518 は、JWS, JWE, JWK で使われるアルゴリズムについて定義しています。

  • 3 章 Cryptographic Algorithms for Digital Signatures and MACs は JWS で使う署名について
  • 4 章 Cryptographic Algorithms for Key Management と 5 章 Cryptographic Algorithms for Content Encryption はいずれも JWE で使うアルゴリズムや暗号化について
  • 6 章 Cryptographic Algorithms for Keys は JWK で使う暗号鍵について

それぞれ解説されています。 JWE は今までもあまり積極的には扱っていなかったので、ここでも JWS と JWK で使われるアルゴリズムについて見ていきます。

# JWS で使うアルゴリズムについて

JWS で使えるアルゴリズムとしては、以下のものが規格で定義されています。

  • HS256: HMAC using SHA-256
  • HS384: HMAC using SHA-384
  • HS512: HMAC using SHA-512
  • RS256: RSASSA-PKCS-v1_5 using SHA-256
  • RS384: RSASSA-PKCS-v1_5 using SHA-384
  • RS512: RSASSA-PKCS-v1_5 using SHA-512
  • ES256: ECDSA using P-256 and SHA-256
  • ES384: ECDSA using P-384 and SHA-384
  • ES512: ECDSA using P-521 and SHA-512
  • PS256: RSASSA-PSS using SHA-256 and MGF1 with SHA-256
  • PS384: RSASSA-PSS using SHA-384 and MGF1 with SHA-384
  • PS512: RSASSA-PSS using SHA-512 and MGF1 with SHA-512
  • none: 署名なし

このうち、実装者に必須とされているのは HS256 であり、RS256 と ES256 は推奨となっています。

RSASSA-PKCS1-v1_5 を用いたデジタル署名

RSASSA-PKCS1-v1_5 デジタル署名については、RFC3447 に定義されています。

これと、SHA-256 や SHA-384 などのハッシュを組み合わせて作られるのが RS256 や RS384 になります。

ECDSA を用いたデジタル署名

ECDSA は楕円曲線暗号を用いたデジタル署名です。 同じ暗号強度で、RSA より短い鍵長で済むなどの利点があり、近年使われるようになってきています。

例として、P-256 曲線と SHA-256 を用いた署名は以下のように生成されます。

  1. ECDSA を用いてデジタル署名を生成する。このとき出力はペア (R,S) となる。(R と S はそれぞれ 256bit の非負な整数)
  2. R と S を big-endian でバイト列に変換する。
  3. R, S をこの順で連結する
  4. 結果の 64 バイトのバイト列が署名の値である

RSASSA-PSS を用いたデジタル署名

RSASSA-PKCS1-v1_5 とは別の、RSASSA-PSS というものもあるようです。この辺りは RSA のパディングの話と関わってくると思うのですが、筆者が詳しくないので別の機会に調べられればと思います。

alg に指定する値としては PS256, PS384, PS512 があります。

# JWK で使うアルゴリズムについて

JWK の kty(Key Type)パラメータには、EC, RSA, oct の 3 つの値がこの規格で定義されています。 実装者は RSA と oct が必須で、EC は推奨とされています。

EC の鍵について

EC の公開鍵では、crv と x という 2 つのパラメーターが必須です。crv には P-256, P-384, P-521 などの楕円曲線を指定する値が入ります。 また、秘密鍵の方では d というパラメータが追加で必要になります。

RSA の鍵について

ESA の公開鍵については、n(Modules) と e(Exponent) という 2 つのパラメータが必須です。 秘密鍵の方は、追加で d というパラメータが必要になります。

# 終わりに

暗号アルゴリズムについての筆者の知識が足りなかったことと、RFC にはそこまで記載がなかったため、あまり解説できることがありませんでした。 ひとまず JOSE 関連の RFC に目を通したことで、JOSE RFC が何を規定する規格なのかということや、JWT がどのようにして規格化されているのかがわかってよかったです。