本文へスキップ
ecdsa.com

正規化(canonicalization)

ハッシュ化や署名の前に、データを取り決めた 1 つのバイト表現に変換する処理で、意味が同じ入力(空白、キーの順序、名前空間プレフィックス、ヘッダーの折り返しだけが異なるもの)から同じ署名入力が得られるようにします。
別表記c14nJCSRFC 8785JSON Canonicalization Scheme

署名の対象はバイト列ですが、XML、JSON、メールなどの形式では、同じ内容に対して何通りものバイトエンコーディングが可能です。正規化方式はそれを 1 つに固定します。XML-DSig と SAML には Exclusive XML Canonicalization、JSON には JSON Canonicalization Scheme(JCS、RFC 8785:キーをソートし、数値は ECMAScript の書式、空白なし)、メールのヘッダーと本文には DKIM の simple と relaxed アルゴリズム(RFC 6376 §3.4)、ASN.1 には正規形としての DER があります。

正規化はどれも攻撃対象領域になります。署名者と検証者がまったく同じように実装しなければならず、アプリケーションは生の入力ではなく正規化された内容に基づいて動作しなければならないからです。XML 署名ラッピングも DKIM の本文長を悪用する手口も、まさにその隙を突いています。JWS や COSE などの形式は、送信されるバイト列そのもの(base64url(header).base64url(payload))に署名することでこの問題を回避しており、そのため正しく実装しやすくなっています。

規格と参考文献

すべての用語