W3CのVCデータモデル(VCDM)の公開リポジトリで、関連資料の改ざん検証に使う「digestSRI」の値と検証手順を明確にする修正案が2026年10月15日に提出されました。PR #1658は10月26日の確認時点で未採用です。

VCDM v2.1草案のほかの変更点は、多言語表現やセキュリティ上の整理をデータ例で解説した記事で紹介しています。

本稿は10月に提出されたdigestSRIの個別提案を扱います。

一つの文字列でも、文字列のリストでも複数のハッシュ値を記述できる

提案ではdigestSRIに文字列、または空でない文字列のリストを指定できます。各文字列には、空白で区切った一つ以上のハッシュ表現を含めます。各表現は「アルゴリズム名」「ハイフン」「Base64で表したハッシュ値」という構成です。

例えば、同じ資料のSHA-256値とSHA-512値を一つの文字列内に並べることも、それぞれを別の文字列にしてリストに入れることもできます。

指定できるアルゴリズムはsha256、sha384、sha512の三つです。

JSONで見る、参照先とハッシュ値の書き方

以下はPRの規則を説明するために作成したJSONの抜粋です。

URLは架空の例で、そこから取得した資料の内容が、改行・BOMなしのUTF-8文字列「abc」(3バイト:0x61、0x62、0x63)だったと仮定します。ハッシュ値はこの3バイトから実際に計算したものです。

{
  "relatedResource": [
    {
      "id": "https://example.com/resource.txt",
      "mediaType": "text/plain",
      "digestSRI": "sha256-ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0="
    }
  ]
}

idは検証対象の資料の場所、mediaTypeはその種類、digestSRIは照合に使う方式と値です。sha256-より後ろの部分は、資料そのものをBase64にした値ではなく、資料から計算したSHA-256の結果をBase64にした値です。

検証側は取得した「abc」から同じ計算を行い、記載値をデコードした結果と比較します。

同じ資料を二つの方式で照合するなら、上のdigestSRIを次の配列に置き換えられます。

{
  "digestSRI": [
    "sha256-ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=",
    "sha512-3a81oZNherrMQXNJriBBMRLm+k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw=="
  ]
}

一つの文字列にまとめる場合は、二つのハッシュ表現をスペースで区切ります。次の例も同じ二つの値を表します。

{
  "digestSRI": "sha256-ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0= sha512-3a81oZNherrMQXNJriBBMRLm+k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw=="
}

特定アルゴリズムではなく全件を照合する

検証側は、記載された各ハッシュ表現について、取得した資料のバイト列から指定された方式でハッシュ値を計算します。

例えばSHA-256値とSHA-512値の両方があり、SHA-512だけが一致しても、この提案ではエラーになります。

空の文字列、空のリスト、指定外のアルゴリズムなど、必須の入力条件を満たさない値もエラーです。

ハッシュ計算に使うバイト列の範囲は別途検討

gzipなどで圧縮された資料を取得した場合に、圧縮解除前と解除後のどちらをハッシュ計算の対象にするかは、PR自身が対象外としています。この論点は両プロパティに関わるため、別のIssue #1657に分けられています。

今回明文化するのは入力形式、全件照合、sriStringの意味と標準表記です。取得した資料のどのバイト列を照合するかは、この修正案だけでは確定しません。