今天,我们很高兴地宣布,内容溯源与真实性联盟盟 (C2PA) 溯源标准集成到 Cloudflare Images。内容创作者和出版商可以在 Cloudflare 网络中无缝保留整个溯源链,从图像的创建方式和创建者到后续的每一次编辑。
什么是 C2PA 以及内容真实性倡议?
听到“出处”这个词时,您可能会回忆起高中时期的艺术史课。在这种情况下,它意味着您在纽约大都会艺术博物馆看到的艺术品确实出自相关艺术家之手,而不是赝品。它的“出处”是指这件实物艺术品的所有权随着时间的推移发生了怎样的改变,如何从原创艺术家手中转移到博物馆。
数字内容来源就是建立在这个概念的基础之上。它有助于您了解数字媒体(图像、视频、PDF 文档等)的创建方式和后续编辑情况。我在 Instagram 上发布的照片来源可能是这样的:我使用 iPhone 拍摄了照片,使用 Apple Photos 的编辑工具进行“自动魔法”编辑,将其上传到 Instagram 并使用 Instagram 的编辑工具进行裁剪,然后将其发布。
为什么数字内容出处很重要?从根本上讲,这是让内容创作者获得认可的重要方式。许多摄影师都有过这样的经历:看到自己的照片或视频在网上走红迅速传播,但他/她们的姓名和署名却被抹除。在这种情况下,在全世界看过其作品后,创作者可能已经积累的一些机会就无法变现。如果您帮助确保艺术家或内容创作者凭借其作品获得认可和赞誉,这种曝光可能会为对方带来更多的职业机会。
数字内容出处也可能成为我们了解周围世界的一个重要工具。如果您看到一个有新闻价值的事件的视频或照片,您会想知道这张照片是否确实是在那个特定地点拍摄,还是几年前在其他地点拍摄。如果您看到一张 UFO 飞越新泽西州的模糊照片,那么知道照片的拍摄时间和地点有助于了解实际发生的情况。
C2PA 是非营利联合开发基金会的一个项目,并且它已经制定了将数字内容来源附加到媒体的技术规范。这些标准还详细说明了如何加密签名清单,从而让任何人都可以验证该清单没有遭到篡改。JSON 清单和相关签名统称为内容凭证。
由 Adobe 牵头的内容真实性倡议旨在推动内容凭证功能的全球普及,拥有来自各行各业的数千名成员。
为什么要将内容凭证集成到 Cloudflare Images?
Cloudflare Images 让您能够轻松构建一个可扩展且经济实惠的图像管道。现在,借助我们新的内容凭证集成,您可以保留现有内容凭证,确保这些凭证从创建一直到最终用户交付一直保持完整。
全球各地的许多媒体机构,例如 BBC、《纽约时报》和道琼斯通讯社,都是内容真实性倡议的成员。试想一下,这其中某一个新闻机构希望在其摄影记者的照片中添加内容凭证,并让任何人都可以验证该图像的来源。而在此之前,即使该新闻机构使用符合 C2PA 标准的相机和编辑流程,但如果图像被 CDN 转换,这些凭证也常常会被抹除。
如果您使用 Cloudflare,这个问题已妥善解决。现在,在 Cloudflare Images 中,您可以在从远程源转换图像时保留内容凭证。启用此集成功能后,将会保留图像中嵌入的任何现有内容凭证。
当您使用 Images 调整图像大小或更改图像的文件格式时,这些转换将由 Cloudflare 进行加密签名。例如,这将确保在您网站上看到照片的最终用户可以使用开源验证服务(例如 contentcredentials.org/verify), 验证完整的出处链。
工作方式
假设您是一名摄影记者,使用一台具备 C2PA 合规签名功能的 Nikon 相机。这名摄影记者可以选择将内容凭证附加到自己的照片,以识别照片的关键元素,例如相机型号、原始图像尺寸和光圈设置。
下面展示了使用 Nikon 相机拍摄的照片中所包含的 C2PA 合规内容凭证的简化示例。
内容凭证均使用 JPEG 通用元数据盒格式 (JUMBF) 存储,这是一种标准化容器格式,用于在文件中嵌入元数据。您可以将其视为一个信封系统,它会将关于数字内容的来源和更改方式的数据以及可用于验证此类数据的加密签名打包在一起。
为了提供更好的开发人员体验,断言(或关于内容出处的事实)通常采用 JSON 格式编写。请注意,此示例特意简化了 JUMBF 盒嵌套并添加了注释,使其更易于理解。
{
"jumbf": {
"c2pa.manifest": {
"claim_generator": "Nikon Z9 Firmware v1.2",
"assertions": [
{
"label": "c2pa.actions",
"data": {
"actions": [
{
"action": "c2pa.captured",
"when": "2025-01-10T12:00:00Z",
"softwareAgent": "Nikon Z9",
"parameters": {
"captureDevice": "NIKON Z9",
"serialNumber": "7DX12345",
"exposure": "1/250",
"aperture": "f/2.8",
"iso": 100,
"focalLength": "70mm"
}
}
]
}
}
],
"signature_info": {
"issuer": "Nikon",
"time": "2025-01-10T12:00:00Z",
"cert_fingerprint": "01234567890abcdef"
},
"claim_metadata": {
"claim_id": "nikon_z9_123"
}
}
}
}
现在,假设您想在自己的网站上使用这张照片。
如果您已在 Cloudflare 中启用了“保留内容凭证”设置,则该元数据现在将会保留在 Cloudflare Images 中。
如果您使用 Cloudflare Images 来动态调整图像大小或转换图像,则 Cloudflare 会自动附加并加密签名同一清单中的其他操作。下图展示了新的内容凭证可能的样子。
{
"jumbf": {
// Original Nikon manifest
"c2pa.manifest.nikon": {
/*unchanged*/
},
// New Cloudflare manifest
"c2pa.manifest.cloudflare": {
"claim_generator": "Cloudflare Images",
"assertions": [
{
"label": "c2pa.actions",
"data": {
"actions": [
{
"action": "c2pa.resized",
"when": "2025-01-10T12:05:00Z",
"softwareAgent": "Cloudflare Images",
"parameters": {
"originalDimensions": {
"width": 8256,
"height": 5504
},
"newDimensions": {
"width": 800,
"height": 533
}
}
}
]
}
}
],
"signature_info": {
"issuer": "Cloudflare, Inc",
"time": "2025-01-10T12:05:00Z",
"cert_fingerprint": "fedcba9876543210"
},
"claim_metadata": {
"claim_id": "cf_resize_123",
"parent_claim_id": "nikon_z9_123"
}
}
}
}
在此示例中,c2pa.action.resized
条目描述了从一组尺寸到另一组尺寸的非破坏性转换。这是关于这张特定照片的单独、独立的断言。
请注意,此清单中有两个加密签名,每个签名都由 signature_info
引用。由于此示例图像涉及两个实体的操作,即 Nikon 完成了图像创建,然后 Cloudflare 调整了图像大小;Nikon 和 Cloudflare 都单独签名了各自关于内容来源的断言。
在此示例中,签名参考如下所示:
"signature_info": {
"issuer": "Cloudflare, Inc",
"time": "2025-01-10T12:05:00Z",
"cert_fingerprint": "fedcba9876543210"
在创建、编辑数字内容和调整其大小的过程中,将为每一项操作创建唯一的元数据哈希值,然后使用私钥进行签名。这个签名以及签名者的公钥证书或对证书的引用,均包含在此 JSON 引用的 JUMBF 容器中。
这些哈希值和签名让任何开源验证工具可以重新计算哈希值,根据签名进行验证并核实证书链,确保对图像执行的每一项操作的可信度。这就是内容凭证具有防篡改作用的确切含义:如果这些哈希值和签名中的任何一个没有通过验证,即表示元数据已被篡改。
每个加密签名都是信任列表的组成部分,让任何人都可以验证跨不同实体的出处链,例如从相机制造商到照片编辑软件再到整个 Cloudflare 平台上的分发。了解来自内容真实性倡议的更多信息:
信任列表将已签名清单的终端实体证书连接回原始根 CA。这是通过提供形成信任链的从属公共 X.509 证书(公共 X.509 证书链)来完成。
为了让 Cloudflare 能够在任何转换中附加内容凭证,我们需要拥有一个公开可用的终端实体证书并加入这个信任列表。此处,我们使用 DigiCert 作为终端实体证书,并在生产环境中创建的 JSON 清单中引用此证书。
"signature_info": {
"alg": "sha256",
"issuer": "Cloudflare, Inc",
"cert_serial_number": "073E9F61ADE599BE128B02EDC5BD2BDE",
"time": "2024-01-06T22:42:36+00:00"
},
最终结果是,新闻机构、记者和内容制作公司现在可以创建一个可审核的数字来源链,使用公钥加密技术来验证其声明。
我们来看一个示例
今年早些时候,OpenAI 宣布支持在 DALL-E 中添加内容凭证。我最近在 DALL-E 中创建了一张图像(脑海中浮现的是滑雪季节)。
Cloudflare Images 让您可以通过 URL 转换任何图像。为此,您只需使用以下语法来更改 URL 结构:
https://<ZONE>/cdn-cgi/image/<OPTIONS>/<SOURCE-IMAGE>
我们可以逐一分解这些参数:
ZONE 是您的特定域。
cdn-cgi/image 是一个固定前缀,表明这是由内置 Worker 处理的特殊路径。
OPTIONS 参数让您能够对图像进行各种转换,例如旋转、改变宽度、压缩等。
SOURCE-IMAGE 是当前托管图像的 URL。
为了将这些参数融合在一起,我新建了一个 URL 结构,我想在这里更改我自己在 DAL-E 中创建的图像宽度和质量,并将图像显示在我的个人网站上。将图像从 DAL-E 上传到我的某个 R2 存储桶后,我可以创建以下这个 URL:
https://williamallen.com/cdn-cgi/image/width=1000,quality=75,format=webp/https://pub-3d2658f6f7004dc38a4dd6be147b6a86.r2.dev/dalle.webp
现在,任何人都可以使用内容凭证验证工具来验证内容出处,以查看结果。即便是在使用上面显示的 Cloudflare Images 转换调整了图像大小之后,出处链仍然完好无损。

有许多开源命令行工具,让您能够探索 Content Credentials 的完整详细信息。C2PA 工具由内容真实性倡议创建和维护。您可以在此处阅读关于该工具的更多信息,并在 GitHub 上查看其源代码。
有两种方法可以安装该工具:通过一个预建的二进制可执行文件,或者使用 Cargo Binstall(如果已安装 Rust)。安装后,C2PA 工具会在命令行中使用以下语法:
c2patool [OPTIONS] <PATH> [COMMAND]
如果您在浏览器中导航到图像链接并将其保存到我的 Mac 上的下载文件夹中,则只需使用命令 -d(-detailed 的缩写)来查看 JSON 清单的完整详细信息。当然,您应该将 yourusername 更改为实际的 Mac 用户名。
c2patool /Users/yourusername/Downloads/dalle.webp -d
如果您希望将其输出为可以在 VSCode 或 Cursor 中查看的 JSON 文件,则请使用以下命令:
c2patool /Users/yourusername/Downloads/dalle.webp -d > manifest.json
这让您不仅可以信任图像出处,而且还可以自行验证图像转换的详细信息。
如何开始使用带有内容凭证的 Cloudflare Images
开始保留内容凭证的操作非常简单。登录您的 Cloudflare 仪表板并前往仪表板中的 Images。从那里选择“转换”,然后选择您想要启用此功能的区域。然后,将此选项切换为“打开”状态:

如果您要转换的图像不包含任何内容凭证,则无需执行任何操作。但如果确实包含内容凭证,我们会将其保留并证明图像转换的真实性。
展望
我们很高兴继续与 Adobe 及许多其他企业合作,以扩大对在 Cloudflare 产品和服务中保留内容凭证的支持。如果您有兴趣了解更多信息,我们很乐意听取您的意见:我在 X 或 LinkedIn 上的用户名是 @williamallen。