本文へスキップ
ecdsa.com

ES256

P-256 曲線の ECDSA と SHA-256 による JWS アルゴリズム(RFC 7518 §3.4、COSE のアルゴリズム −7)で、署名は DER ではなく、ちょうど 64 バイトの生の r‖s です。
別表記ES256ECDSA P-256 SHA-256COSE -7

JWS の署名は、r と s という 2 つの 32 バイトのビッグエンディアン整数を連結し、base64url でエンコードしたもの(86 文字)です。OpenSSL、Java のデフォルトの SHA256withECDSA、Go の ecdsa.SignASN1、Node のデフォルトの crypto.sign() で署名すると代わりに DER が出力され、検証者に拒否されます。IEEE P1363 形式の出力を指定するか、変換してください。鍵は crv が P-256 の EC JWK です。

P-256 はブラウザーの WebCrypto、Secure Enclave、TPM、クラウドの KMS でサポートされているため、ES256 はパスキー(COSE −7)、DPoP プルーフ、Apple の App Store Connect のトークンと APNs のプロバイダートークン、そして最近の多くの ID プロバイダーでデフォルトになっています。署名は高速で(Apple M4 Max の 1 コアで、OpenSSL 3.6.5 により 1 秒あたり約 87,000 回)、トークンは 2048 ビット鍵の RS256 のトークンより約 250 文字短くなります。

2022年には厳しい教訓がありました。Java 15〜18 は、任意のメッセージと鍵に対してすべてゼロの ECDSA 署名を受け入れてしまい(CVE-2022-21449、「Psychic Signatures」)、偽造された ES256 の JWT が検証を通過しました。ランタイムにはパッチを適用し続け、検証者が 1…n−1 の範囲外の r や s を拒否することを確認してください。

規格と参考文献

すべての用語