C2PA Assertion Hashed URI:如何核查缺失与哈希不匹配
保存文件与验证工具完整输出
先保存未经编辑的实际文件,再用兼容 C2PA 的验证工具打开。记录来源 URL 或本地路径、文件名、取得时间、验证工具名称与版本,并把完整输出和文件放在一起。这套表格是本文为了方便复核提出的记录方式,不是 C2PA 规定的工作表。
开始前先限定问题:claim 中的每个 assertion reference 能否在同一个 C2PA Manifest 内解析,assertion data 是否与 claim 记录的 hash 一致。这是 provenance record 的内部完整性问题,不能据此确认配文、说话人、地点、拍摄时间或画面事件是否准确。
为 claim 和每个 assertion 分配本地编号,原样复制技术 label 与 status code。只保留颜色标记或总的 pass/fail,会掩盖 missing reference、outside-manifest reference、数据格式错误与 hash mismatch 的区别。
先逐项解析 URI,再核对 hash
C2PA 2.2 规定,claim 的 created_assertions 与 gathered_assertions 字段中的每一项都是 hashed_uri 结构;version 1 claim 使用 assertions 字段。即使 assertion 不是 claim generator 创建的,只要出现在 gathered_assertions 中,仍属于该 claim,也要按同一算法验证。
先检查 URI 是否列在 redacted assertions 中。Claim 不得 redaction 自己 manifest 内的 assertion。对于没有 redaction 的 assertion,解析 url 字段并保存实际位置。Reference 必须指向同一个 C2PA Manifest 内的 self#jumbf 位置;指向 manifest 外部时记录 assertion.outsideManifest,URI 无法解析并取得数据时记录 assertion.missing。
这两个结果不能合并。assertion.outsideManifest 表示 reference 越过了允许的 manifest 边界;assertion.missing 表示验证工具无法解析并取得 referenced data。它们都不能单独说明文件由谁修改或为何形成当前状态。
Assertion store 中存在、却没有被 claim 的 assertion 数组引用的内容也要单独记录。C2PA 对应的失败码是 assertion.undeclared。不要在记录中把它补成 claim 已经声明的 assertion。
确定算法并比较 JUMBF hash
URI 解析成功后,按规范的 algorithm determination 流程确定哈希算法,记录验证工具实际使用的 algorithm 与可能返回的 failure code。随后按 C2PA 引用的 JUMBF box hashing 流程计算 assertion hash,与 hashed_uri 的 hash 字段比较。
不一致记录为 assertion.hashedURI.mismatch,一致记录为 assertion.hashedURI.match。保留区分大小写的 code、assertion label、resolved URI、algorithm,以及工具显示的 digest 信息。如果工具没有展示其中某项,就写“未展示”,不要从成功标记倒推。
Hash match 只回答一个有限问题:按选定算法计算的 assertion data 是否与 claim 记录值一致。它不能证明 assertion 内的所有陈述都符合现实。Mismatch 也不能证明媒体是合成内容,或画面事件是假的。
把数据格式失败放在独立栏位
C2PA 在 reference 与 hash 处理后还会检查 assertion 格式。Standard assertion 不是 well-formed CBOR 时记录 assertion.cbor.invalid;JSON 不符合规范时记录 assertion.json.invalid。这些 code 与 assertion.missing、hash mismatch 发生在不同验证阶段,应分栏保存。
复核表可以让每个 assertion 占一行,列出 claim 编号、数组名称、assertion label、URI、redaction 状态、resolved location、algorithm、hash result、data-format result 和未解决问题。比较两份文件时,应分别完成两张表。空白只表示该次运行没有展示或发现该值,不代表它从未存在。
结果不完整时,保留文件,并用已记录版本的验证工具重新运行;条件允许时,再对照发布者保存的原件或独立取得的副本。只报告观察到的差异。C2PA status code 不提供动机、作者或现实原因。
分开记录 provenance 完整性、检测与事实核查
如果把保存的文件交给 DeepFakeCheck 分析,应把概率性风险信号放在独立部分。DeepFakeCheck 不解析 C2PA assertion URI,不验证 JUMBF hash,也不签发 C2PA status code。自动检测可能误报真实资料,也可能漏报合成或修改资料。
高风险结果支持继续复核,低风险结果不会修复 missing assertion,也不能认证文件。assertion.hashedURI.match 同样只支持记录中的 assertion 完整性结果,不能确认场景、配文、说话人或发布背景。现实主张仍需核查原始发布页面与独立来源。
最后保存准确文件、验证工具与版本、逐 assertion 表格、完整输出、外部来源、使用过的检测结果、未解决问题和实际处置。下一位复核者应能重复 URI 与 hash 检查,而不把技术完整性结果变成画面事件的真伪裁决。
来源
- C2PA《C2PA Technical Specification — Validate the Assertions》:https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_validate_the_assertions