書庫は資料を移し続ける

デジタル保存の現場では、資料を定期的に別のフォーマットへ移します。読めなくなる前に移す、というのが長期保存の基本的な作法です。

そのたびに、バイト列のハッシュは壊れます。前章の migrated がまさにそれで、再圧縮しただけで 252cf511…0c64e2f8… になりました。絵は1画素も変わっていないのにです。

100年保存するつもりの証明書が、書庫が普通に運用しているだけで無効になる。これは実務上の問題です。

ARCHANGEL がやろうとしたこと

英国国立公文書館とサリー大学(ほかに Open Data Institute、エクセター大学)の ARCHANGEL(2017–19、CVPR 2019 のワークショップで発表)は、この問題に正面から取り組みました。対象は映像アーカイブで、答えは「移行を越えても壊れないハッシュを作る」でした。ここで扱っている静止画にそのまま適用できるものではありませんが、問題の形は同じです。

深層学習のモデルで「temporal content hash」を計算し、コーデックが変わっても同じ値が出るようにする。そしてその値を、複数の公文書館が共同で維持する permissioned chain(proof-of-authority)に載せる。英国・エストニア・ノルウェー・オーストラリア・米国 NARA で試行されています。

発想としては素直です。ただし代償があります。

100年後にその値を再計算するには、モデルそのものを保存し、決定論的に再実行できなければなりません。

保存問題を解こうとして、より難しい保存問題を新しく作っていることになります。学習済みモデルの100年保存は、PNG ファイルの100年保存より困難だと考えられます。フレームワークのバージョン、浮動小数点演算の再現性、ハードウェアの差異——現時点では、どれも解かれていません。

逆をやる — ハッシュは壊れてよい

この試作では、問題の立て方を入れ替えました。

問題の立て方必要なもの
ARCHANGEL壊れないハッシュを作るモデルの永続保存と決定論的再実行
この試作壊れる瞬間を記録する移行を毎回記録する運用

移行を「出来事」として扱い、旧ハッシュ → 新ハッシュを機関の署名で結びます。1行1件の追記ログです。

[1] 移行を実施し、1件ずつ署名する
  再圧縮 (可逆)          252cf511… → 0c64e2f8…  画素は一致
  階調を落とす (非可逆)  0c64e2f8… → 5c9c6e0a…  画素も変わる
  → out/migrate/migrations.jsonl

モデルは要りません。要るのは、移行を台帳に書く習慣のほうです。

3つの方法を並べる

同じ資料を2回移行した後で、原本の証明書と繋がるかを試します。

① バイト列のハッシュで直接照合する

[2] 原本の実体 VC と直接照合する
  ✘ バイト列のハッシュ  署名時 252cf51125e8… / 手元 5c9c6e0ab0c9…
  ✘ 画素のハッシュ      署名時 2d40f31954e6… / 手元 7c4c38091e17…
  判定  invalid  バイトも画素も変わっているので、繋がりが切れている

当然ですが、切れます。

② 内容ハッシュで跨ぐ — ARCHANGEL のやり方

学習モデルの代わりに、可逆な移行なら必ず一致する「画素のハッシュ」を置いて、理想化した形で試します。

[3] 内容ハッシュで跨ぐ — ARCHANGEL のやり方 (理想化)
  ✔ 可逆移行の後    2d40f31954e6… と一致
  ✘ 非可逆移行の後  署名時 2d40f31954e6… / 手元 7c4c38091e17…

可逆なら跨げます。非可逆で落ちます。

ARCHANGEL が学習ハッシュを必要としたのは、まさにこの一段です。階調を落とす、解像度を下げる、別のコーデックに移す——実際の移行の多くは非可逆なので、素朴な内容ハッシュでは足りません。そこを埋めるために学習モデルが要り、そしてモデルの永続保存という問題を抱え込むことになります。

③ 署名付き移行連鎖でたどる

[4] 署名付き移行連鎖でたどる
  ✔ 原本の実体 VC  image/png  252cf51125e8…
  ✔ 移行 1  PNG(deflate 9) → PNG(deflate 1)  252cf511… → 0c64e2f8…  可逆 (画素一致)
  ✔ 移行 2  PNG → PNG (8階調に量子化)        0c64e2f8… → 5c9c6e0a…  非可逆 (画素も変わる)
  ✔ 手元のバイト列  連鎖の終端と一致 5c9c6e0ab0c9…
  判定  valid  モデルは要らない。壊れたハッシュの両端を署名が繋いでいる

非可逆な移行も通ります。 各移行が「これは非可逆です」と明示したうえで、機関が署名しているからです。

可逆な移行非可逆な移行検証に要るもの
バイト列のハッシュなし
画素 / 内容ハッシュ(学習ハッシュなら) モデルの永続保存
署名付き移行連鎖移行を毎回記録する運用

代償は運用に移る

いいことばかりではありません。

[5] 連鎖から1件抜く — 記録し忘れたとき
  ✔ 原本の実体 VC  image/png  252cf51125e8…
  ✘ 移行 1  PNG → PNG (8階調に量子化)  前段の 252cf511… に繋がらない
  判定  invalid  1件でも記録が欠けると、そこで切れる

1件でも記録を落とせば、そこで切れます。

内容ハッシュの利点は「移行を記録し忘れても、後から照合できる」ことでした。ここは正面からの交換になっています。

  • 内容ハッシュ — 記録が要らない代わりに、モデルの保存が要る
  • 署名付き連鎖 — モデルが要らない代わりに、記録の習慣が要る

書庫にとってどちらが現実的かは、技術ではなく移行を台帳に書く習慣があるかどうかで決まります。

そしてこれは、無いものを新しく足す話ではありません。OAIS(Open Archival Information System、長期保存システムの参照モデル)の AIP(Archival Information Package、保存用の情報パッケージ)は、もともと保存記述情報を書く場所を持っています。 移行の記録はそこに収まるべきもので、書式を機械可読にするだけの話になります。

非可逆移行では、機械は「同一だ」と言えない

ここは正直に押さえておく必要があります。

画素が変わっている以上、移行前後が同じ資料であるという判断は、機関の主張です。 検証者にできるのは、その主張に署名があることを確かめることだけで、主張そのものの当否は確かめられません。

だから第6章の名簿が、ここで効いてきます。

誰の「同一だ」を受け入れるかが、そのまま資料の同一性を決める。

この試作で辿り着いた限り、真正性の最後の一段は制度の側に残りました。暗号は「誰が言ったか」までしか運べません。

チェーンは要るか

この章では一度も使っていません。移行連鎖は署名付きの静的ファイルで足りています

ただし、第4章と同じ穴はそのまま残ります。所蔵機関が連鎖を丸ごと作り直せば整合してしまうからです。それを止めるのは、以前の状態を控えた外部の witness であって、台帳そのものではありません。

第4章から数えて、これで3回目の同じ結論です。

穴が現れた章何を作ったか残った穴
4公開鍵の追記ログ丸ごと作り直せる
5資料の版への署名同上
8移行連鎖同上

穴の形が毎回同じなのが要点です。自分でホストする追記ログは、どれだけ丁寧に作っても同じ場所で破れます。第10章で、そこにチェーンを入れます。