C2PA 是什么?AI 图片/视频溯源标准完整解读
普通元数据(EXIF、XMP)的问题是谁都能改:一行 exiftool 命令就能把"Midjourney"改成"Canon EOS R5"。C2PA(Coalition for Content Provenance and Authenticity)解决的就是这个问题——它把内容的来源记录做成带数字签名的 manifest 嵌进文件,改动任何一个字节,签名校验就会失败。这让它成为目前 AI 内容溯源里唯一具备防篡改能力的方案。
它是怎么来的
C2PA 不是凭空出现的。2019 年 Adobe 牵头发起了 CAI(Content Authenticity Initiative),同期 BBC 和微软在做面向新闻业的 Project Origin,两边解决的是同一个问题。2021 年初,两个项目的技术路线合并,在 Linux 基金会旗下成立了 C2PA 联盟,制定统一的开放规范。创始成员包括 Adobe、Arm、BBC、Intel、Microsoft、Truepic;OpenAI、Google、Sony 等是后来加入的,目前成员早已过百。规范本身完全公开,参考实现 c2pa-rs(Rust)在 GitHub 上开源——AICheck365 命令行版的完整 C2PA 解析用的就是这个库。
技术结构:manifest、claim、assertion、签名
一个 C2PA 记录的层级是这样的:文件里嵌一个 manifest store,里面可以装多个 manifest(每次编辑追加一个,形成链);每个 manifest 包含若干 assertion(断言,描述内容的具体事实)、一个把这些断言绑定起来的 claim,以及对 claim 的 COSE 数字签名和签名方的 X.509 证书链。
对 AI 检测来说,最有价值的是这几处:
claim_generator/claim_generator_info:生成这条记录的软件。Google 系生成图写的是Google C2PA Core Generator Library,OpenAI 的图会出现 OpenAI 相关标识。c2pa.actions断言(新版本是c2pa.actions.v2):记录内容经历了什么操作。AI 生成对应c2pa.created动作,其中的digitalSourceType字段直接声明来源类型,softwareAgent记录执行操作的软件。- 签名时间戳和证书链:判断记录是谁签的、什么时候签的。
digitalSourceType:判断 AI 来源的核心字段
这个字段的取值来自 IPTC 的受控词表,C2PA 和 XMP/IPTC 用的是同一套。和 AI 相关的有六个值,证据强度并不一样:
| 取值 | 含义 | 证据强度 |
|---|---|---|
trainedAlgorithmicMedia | 完全由训练算法(即 AI 模型)生成 | 高 |
compositeWithTrainedAlgorithmicMedia | 包含 AI 生成成分的合成内容(如 AI 修图) | 高 |
compositeSynthetic | 包含合成元素 | 高 |
algorithmicMedia | 算法生成,但不一定经过模型训练(如分形图) | 中 |
dataDrivenMedia | 数据驱动生成(如数据可视化) | 中 |
trainedAlgorithmicData | AI 生成的数据 | 中 |
manifest 实际存在文件的哪里
C2PA 数据用 JUMBF(JPEG Universal Metadata Box Format,ISO/IEC 19566-5)容器封装,不同文件格式有不同的嵌入位置,这部分细节在多数介绍文章里都被略过了,但对理解检测原理很关键:
- JPEG:放在 APP11 段(标记字节
0xFFEB)。JPEG 单段最大 64KB,而带证书链的 manifest 经常超过这个大小,所以规范定义了分段机制:每段 payload 以JP两个字符开头,跟着 2 字节的 box 实例号和 4 字节的序列号,序列号为 1 的段在偏移 24 处能看到c2pa标识。读取时要按实例号和序列号把多个 APP11 段重新拼接成完整的 JUMBF 块——AICheck365 的浏览器版就实现了这个重组逻辑。 - PNG:放在专用的
caBXchunk 里(也有用caBI的)。PNG chunk 自带 4 字节长度字段,没有 64KB 限制,所以通常一个 chunk 就装下了。遍历 chunk 链表、按类型名匹配即可定位。 - MP4/MOV:放在 uuid box 中。视频的 manifest 一般出现在文件头部区域,扫描前几 MB 就能覆盖。
哪些平台在写 C2PA?
截至 2026 年中的大致情况(平台行为会变,以实测为准):
| 平台/工具 | 状态 | 备注 |
|---|---|---|
| OpenAI DALL-E 3 / Sora | 支持 | 图片自 2024 年初起带 C2PA,Sora 部分导出带 |
| Adobe Firefly | 支持 | 创始成员,Content Credentials 全线打通 |
| Microsoft Bing Image Creator | 支持 | 含 Copilot 图像生成 |
| Google Imagen / Gemini | 部分入口支持 | 同时使用 SynthID 像素水印;不同产品入口行为不一致 |
| Midjourney | 不支持 | 写 XMP(CreatorTool、DigitalSourceType),无签名 |
| Stable Diffusion / ComfyUI | 默认不支持 | 本地生成无平台私钥可签;参数走 PNG 文本块 |
| Leica M11-P、部分 Sony 相机 | 支持 | 反方向应用:拍摄时机内签名,证明"是真照片" |
完整验证 vs 快速扫描:一个该说清楚的区别
"检测 C2PA"其实有两个深度档位,混为一谈容易产生误解:
完整验证解析整个 manifest store,校验 COSE 签名、证书链和信任列表,能给出"这条记录由某机构签发、未被篡改"的结论。c2patool 和 contentcredentials.org/verify 做的是这个。
快速扫描(AICheck365 浏览器版的做法)是在本地定位 JUMBF 块后,在 manifest 字节里做文本级匹配:找 digitalSourceType 的六个 AI 取值、匹配已知工具名清单、识别 Google 凭证链路的特征字符串。命中 trainedAlgorithmicMedia 记高置信度,命中已知工具名记高置信度,只命中 Google + C2PA 关联特征记中等。这个档位足够回答"这文件有没有 AI 来源声明",但它不验证签名——如果你需要法律或新闻场景的可信结论,请走完整验证。
局限性:C2PA 不能做什么
把 C2PA 当万能解药会失望,它的边界很清楚:
- 防篡改,不防剥离。把 APP11 段或 caBX chunk 整个删掉,文件照常打开,记录无声消失。截图、社交平台转码、多数修图软件的"另存为"都会造成这种剥离。
- 只能证有,不能证无。没有 C2PA 的图片可能是真照片,也可能出自不写 C2PA 的工具,或者被洗过元数据。
- 覆盖不了不合作的生成方。本地跑 Stable Diffusion 的人不会给自己的图签 AI 标记。
- "有签名"不等于"可信"。验证时要看签名方是谁,任何人都能用自己的证书签 manifest。
想知道你手里的文件带不带 C2PA 来源声明?拖进来扫一下,本地完成,不上传
开始检测 →常见问题
C2PA 签名可以被伪造吗?
在签名密码学层面极难。manifest 用 COSE 格式签名,验证时检查 X.509 证书链,伪造等价于攻破签名方的私钥。但要注意两点:一是任何人都可以用自己的证书给图片签一个'看起来像样'的 manifest,所以验证时必须看签名方身份是否可信,而不是只看'有没有签名';二是把 manifest 整个删掉很容易,C2PA 防篡改,不防剥离。
所有 AI 平台都会写 C2PA 吗?
不是。OpenAI(DALL-E 3、Sora)、Adobe(Firefly)、微软(Bing Image Creator)、Google(Imagen/Gemini 部分入口)已经在写。Midjourney 用的是 XMP 而非 C2PA;Stable Diffusion 等本地部署的开源工具默认不写——本地生成根本没有可用于签名的平台私钥。
如何查看一个文件的 C2PA 信息?
完整验证用 Adobe 的 contentcredentials.org/verify 或官方命令行工具 c2patool,它们会解析整个 manifest store 并校验签名链。AICheck365 的浏览器版做的是轻量扫描:在本地提取 manifest 字节、匹配 digitalSourceType 和已知工具名,速度快、不上传文件,但不做签名链验证,定位是快速筛查而非法证审计。
C2PA 只用于 AI 图片吗?
不是。它是通用的内容溯源标准,相机拍摄、人工编辑同样可以记录。Leica M11-P、部分 Sony 机型已经支持拍摄时在机内写入 C2PA 签名;新闻机构用它证明照片'确实出自这台相机、中间没被改过'。AI 标注只是它的用途之一。
图片经过编辑后 C2PA 还在吗?
取决于编辑工具。支持 C2PA 的工具(如 Photoshop 开启 Content Credentials 后)会在原 manifest 之上追加新的 manifest,形成可追溯的编辑链;不支持的工具保存时会直接丢弃 APP11 段或 caBX chunk,记录就断了。