JSON の正規化は、意味的に同値な JSON データを 1 つの決定論的なバイト列に変換します。ハッシュ化、署名、比較、または JSON を識別キーとして使用する前に役立ちます。通常の JSON シリアライズだけでは不十分です。オブジェクトメンバーの順序、空白、エスケープ、数値の形式は、データモデルを変更せずに異なる場合があるためです。
JSON 正規化スキーム #
RFC 8785 は、JSON Canonicalization Scheme (JCS) を定義しています。JCS は ECMAScript の JSON シリアライズ規則を使用し、UTF-16 コード単位の辞書順でオブジェクトプロパティをシリアライズし、意味を持たない空白を出力せず、有効な I-JSON 入力を要求します。
任意のテキストではなく、パース済みのデータを正規化してください。重複するオブジェクトメンバー名、NaN や infinity などのサポートされない数値、選択したデータモデルで表現できない入力は拒否します。数値精度は重要です。すべての数値をバイナリ浮動小数点値としてパースする実装では、大きな整数が気付かないうちに変更される可能性があります。
ハッシュ化と署名 #
元の JSON テキストではなく、正規化された UTF-8 バイト列に署名します。
- 定義されたプロファイルに従って JSON を検証し、パースする。
- 標準に準拠した正規化処理系でシリアライズする。
- その正確なバイト列をハッシュ化または署名する。
- 署名とともに、正規化アルゴリズムおよび署名アルゴリズムを記録する。
正規化によって、信頼できない JSON が安全になるわけではなく、スキーマの妥当性が証明されるわけでも、認証済みトランスポートが置き換えられるわけでもありません。正規化が提供するのは、合意されたデータ値に対する安定したバイト列だけです。生成側と検証側は、同じ正規化規則を使用する必要があります。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)