你刷到一段视频,说是某地突发事件的现场。你放大看细节、查拍摄角度、核对天气和建筑,试图判断真假。另一边,YouTube 在上传完成的瞬间就在做同一个判断。区别是,它不看内容,它在找水印。
这就是数字水印今天的位置。它的原始命题是”这张图是谁的”,用来打击盗版。但 2024 年以来,OpenAI 给 DALL·E 生成的每张图加 C2PA + SynthID,Google 在 Imagen 输出中嵌入 SynthID,Adobe、BBC、Intel、Sony 全部加入了 C2PA 联盟的 Steering Committee。数字水印从一个细分的信号处理子领域,被推进了 AI 内容生态的基础设施层。
这篇文章不是讲 SynthID 怎么工作,也不是讲 C2PA 的加密协议。它的目标是退一步,把数字水印作为一个独立的技术方向做系统性梳理。一个合格的水印系统需要满足什么条件。过去三十年人们尝试了哪些方案。每种方案解决了什么问题又留下了什么。最终它们在实际工程和部署中表现出怎样的差异。
想象你要在一幅画里藏一段看不见的文字。做完之后,这幅画会被传到网上、被截图、被压缩、被旋转、被打印再拍照。你的文字要在这一路折腾之后还能被读出来。
这个场景已经包含了数字水印的三个核心要求。第一,藏进去的东西不能被人看见,否则画就毁了。第二,画被折腾之后,藏进去的东西还在,否则水印就没意义了。第三,你可能想藏的不只是一句”这里有水印”,而是一个具体的编号,一段版权声明。信息越多,藏起来越难。
这三件事的学名是不可见性、鲁棒性、容量。它们构成了数字水印里最根本的矛盾:你不可能同时把三件事都做到满分。从 Cox、Miller、Bloom 的教科书开始,这个约束被概括为”不可能三角”,之后每一篇水印论文的选择,本质上都是在这三个角之间做取舍。
最简单的衡量方式是把加了水印的图和原图并排,问:看得出区别吗?工程上用的指标是 PSNR 和 SSIM,都是数学化地衡量两幅图有多像。PSNR 超过 40 dB,基本人眼区分不了。SSIM 超过 0.95,结构上几乎不变。近年 WAVES benchmark 进一步引入了 LPIPS。这是一种用神经网络模拟人类感知的评估方式,比传统指标更接近”人真的觉得像不像”。
不可见性真正的挑战在于人眼感知不均匀。人对平滑天空区域的微调很敏感,对纹理密集的草地则很迟钝。好的水印会自适应:在天空里嵌轻一点,在草地上嵌重一点。JND(Just Noticeable Difference)就是量化这个问题的数学模型,它给出”这个像素最多能变多少而不被察觉”的精确上界。
鲁棒性回答的问题更直接:画被折腾了一圈之后,藏进去的字还在不在。
一张含水印的图在互联网上的典型命运是:上传到社交平台(压缩一次),被截图(分辨率变了),在聊天软件里转发(再压缩一次),再被裁掉水印可能所在的位置。鲁棒水印要在这条操作链之后仍然能被检测到。
学术论文衡量鲁棒性用两个经典指标:归一化互相关(NCC)和误码率(BER)。NCC 回答”提取出来的水印和原始水印有多像”,BER 回答”提取出来的比特有几个是错的”。但真实部署中更在意另一个指标:误报率。你不想把没水印的图误判成有水印。WAVES benchmark 采用的 [email protected]% FPR 就指向这个:在十万张没水印的图中只允许一次误判的前提下,检测率是多少。
容量就是你能藏多少信息。最简陋的水印只藏 1 比特:“这张图有没有水印”。稍微有用一点的方案需要藏几十比特,一个版权 ID、一个用户序列号、或者一段来源标记。当你要在每张分发出去的图里嵌入不同的用户 ID(这叫”指纹追踪”:谁泄露了就能追溯谁),容量需求就跳到了几十到几百比特。
容量和鲁棒性是直接互换的。想象你要往画里藏 1 个比特。你可以把它重复嵌 100 次。即使 90 个被破坏了,剩下的 10 个还能读到,鲁棒性极高。现在你要藏 100 个比特。每个比特只能嵌一次,没有冗余。破坏一个就丢一个,鲁棒性直线下降。
现在可以把三件事串起来看了。
不可见性要求对图像改动极小。鲁棒性要求即使经过压缩和裁剪,改动过的信息还在。这在数学上已经冲突:要对抗压缩,水印信号必须足够强,强到压缩器不敢丢掉;但要维持不可见,这个信号强度被严格限死。
容量进一步压缩了选择空间。如果把 1 比特重复嵌 100 次,信噪比提升了 100 倍。但你要嵌 100 比特,就没有任何冗余了。你只能在”改动很小”和”压缩不怕”之间找到一个极窄的区间,把全部 100 比特刚好放下。
这个问题有更严格的说法。Moulin 和 O’Sullivan 把水印建模为一个数学游戏:嵌入方选嵌入策略,攻击方选攻击策略,双方都知道对方的规则,在给定的失真约束下博弈。他们证明了隐藏容量等于这个游戏的值。这就是三角的数学证明。物理极限不允许三者同时做到,这是定理,不是工程还没做到。
截至目前,讨论都假设攻击方只是在做”无脑操作”:压缩、裁剪、加噪。但如果攻击方知道你的算法呢?
一个安全的水印系统遵循 Kerckhoffs 原则:算法可以完全公开,安全只靠密钥保证。知道你怎么嵌的,没有密钥也去不掉。此外,一个安全的系统还需要防止”假水印攻击”。你嵌了一个水印宣称自己是版权所有者,但另一个人也嵌了一个假水印来搅浑水。Fridrich 1999 年的方法论论文提出了公平比较的基本规则:先把感知失真固定在同一水平,再把误报率对齐,然后比谁更抗打。
另一个容易被忽略的维度是实用性。水印检测是否需要原始图像?如果需要,你在 YouTube 上传服务器上不可能配一个全球图像原版库。嵌入和提取的延迟多大?如果需要一秒处理一张图,视频网站的吞吐量就撑不住。密钥怎么管理、怎么分发、怎么轮换?这些问题和”PSNR 高不高”不在同一层级,但在真实工程中,一个在设计纸上”最优”的方案往往死在这一步。
这些要求构成了坐标。接下来看人们是怎么沿着这几个维度一步一步往前走的。
按嵌入位置的不同,数字水印的方法可以分成三大类。区分它们的,是各自假定了一个不同的攻击模型。
最早的数字水印(Schyndel, Tirkel & Osborne 1994)是在像素值上直接做文章:把水印比特藏进每个像素的最低有效位(LSB)。8 位灰度值从 128 改到 129,人眼无法察觉。但 JPEG 压缩一来就全没了。量化的本质恰好就是丢掉 LSB。
改进版的空域方案对这个问题有认识。它们不再动 LSB,而是把水印伪装成微弱的伪随机噪声,散布到整张图的每个像素上(spread spectrum)。检测时不找特定位置,而是做整图相关:和已知的水印模式相关度高,说明这颗水印大概率存在。散布到全局的好处是局部破坏不致命。裁掉一半图,剩下的那一半仍然够做相关。
但空域方案对各类全局攻击非常脆弱。中值滤波、高斯噪声、甚至一张图的多次转发过程中的重编码,都会逐渐抹掉空域信号。这个问题指向了一个更深层的直觉:如果水印只在像素层,任何像素层的操作都会干扰它。要让水印更鲁棒,必须把它放在一个更底层、更不容易被触碰的位置。
1997 年,Cox、Kilian、Leighton、Shamoon 的 DCT 水印方案给出了这个”更底层的位置”:变换域。DCT(离散余弦变换)把图像从像素空间映射到频率空间。直觉是:图像的整体视觉特征由频率分量中的低频大系数定义,高频小系数只是细节。JPEG 压缩也工作在 DCT 域。它量化时,先丢高频,最后丢低频。所以如果把水印嵌在低频大系数上,就是在和压缩器赌在同一个位置上:它不敢丢你。
DCT 在水印和压缩两端同时出现不是巧合。压缩器和水印器都在优化同一个目标:人眼感知。压缩器看着 DCT 系数问:丢掉哪些人眼不会注意?水印器看着同样的系数问:存在哪里才不会被丢掉?Cox 选最大的 1000 个系数来嵌水印,本质上是在把水印的生存策略和压缩器的保留策略做了一次对齐。JPEG 鲁棒性几乎是免费得来的。水印藏在压缩器被编程为必须保护的那个位置。
Cox 的方案在 DCT 系数中选最大的 1000 个,把水印比特叠加在上面。检测时,对着候检图和原始图的 DCT 差异做相关。这个方案定义了此后十几年变换域水印的基本范式。
同期出现了一个不同的变换:DWT(离散小波变换)。DWT 比 DCT 多提供了一层信息:空间位置。变换后图像被拆成四个子带,低频近似(LL)和三个方向的高频细节(LH、HL、HH),可以继续对 LL 逐级分解。因为高频子带天然对应图像的边缘和纹理区域,而人眼对这些区域的微小变化不敏感,所以 DWT 水印天生带有视觉掩蔽效果。水印自动落到不容易被看到的地方。
最早的两篇 DWT 水印论文同时出现在 1997 年 10 月的 ICIP 上:Xia、Boncelet、Arce 把高斯噪声加到中高频子带上做逐级相关检测;Kundur 和 Hatzinakos 结合人类视觉系统的对比度敏感性调水印强度。此后 DWT 成为学术论文中占比最高的一类方法。几乎所有声称”robust watermarking”的后继论文都基于 DWT 或 DWT 的混合变体。
但变换域方案也有它的阿喀琉斯之踵:几何同步。DCT 和 DWT 都不是平移不变的。如果图像被旋转几度、缩放 90%、或者裁掉边缘 10%,嵌入时水印的位置和检测时对不上。相关检测器看到一堆”错误位置”的系数,相关值直接掉到阈值以下。
变换域方案有一个盲区:它们不知道图像被旋转过。DCT 和 DWT 两种变换都对几何变形敏感。原图和水印图哪怕只差几度旋转或几个百分点的缩放,变换后的系数位置就对不上,检测器看到一堆”错误位置”的系数,相关值直接归零。
这个问题催生了 1998 到 2006 年间最大规模的学术投入。解决的思路大体归为两族。
第一族的策略是换一个坐标系。既然旋转和缩放让像素域的坐标全乱了,为什么不直接在数学上找一个旋转和缩放在其中不过是平移的坐标系?这个想法是可行的:把图像做傅里叶变换取幅度谱,平移就消失了;再把结果映射到对数-极坐标,旋转和缩放就变成了沿着某一轴的平移。嵌在这个域里的水印天然扛旋转、扛缩放、扛平移。代价是逆变换回图像时会产生扭曲。域换得越彻底,回去时画质伤得越重。实际工程中只用一个一维投影来部分实现这个好处。
第二族的策略是不换坐标系,加一组路标。不试图让整张图在旋转下不变,而是事先在图像里找几十个”无论怎么转都能识别出来”的参考点。借用计算机视觉的特征检测器,在参考点的局部坐标下嵌入水印。图像被旋转后,参考点跟着旋转,水印位置自动重新对齐。这族方法的好处是把水印检测拆成了两步:先找路标恢复坐标,再在这个坐标下读水印。两个问题独立处理,每个都更简单。
这两族思路共享同一个核心设计:把”水印在哪里”和”水印是什么”解耦。检测时先定位,再解码。这个解耦在后来几乎所有的工程部署中都被继承了下来。Digimarc 的水印检测器用的就是层次化搜索,本质上是在做同一件事。
这一轮修修补补的成果和局限同样清晰。成果是:单独面对旋转、或单独面对缩放、或单独面对裁剪时,水印基本能活下来。局限是:这三种攻击一旦叠加,几乎所有方案都会失效。一根一根筷子能掰断,一把筷子握在一起就掰不断。几何攻击的组合难度是指数级的,不是线性的。
如果连学术界投入最密集的几何鲁棒性攻到叠加态就基本无解了,那真正部署的系统是靠什么活下来的?打开任何一个工业级水印系统的技术文档,答案都在一个和论文完全不同的维度上。
学术论文的默认坐标系是三个指标、五种攻击:PSNR、BER、NCC 在 JPEG 压缩、高斯噪声、中值滤波下的表现。打开任意一篇 2010 年代的水印论文,摘要里就是这个配方。工业系统不玩这个坐标系。它只关心一件事:在各种操作链下,水印检测的可靠性。这个”操作链”和学术论文的”攻击列表”有本质差异。前者是不可穷举的,后者是提前写好的。
这个差异直接决定了设计逻辑的不同。学术论文的逻辑是”找一个变换组合让水印在已知攻击下更鲁棒”。工业系统的逻辑是”不管你用什么攻击,我靠冗余扛过去”。
Digimarc 是这个逻辑最极致的体现。他们的技术直接来自 Cox 1997 的扩频水印,没有用到此后学术界发明的任何一个混合变换。核心手段只有一个:嵌入冗余。同一个水印在图像中被重复嵌成百上千次,以 tile 形式铺满整个画面。检测器不需要知道水印的精确位置。它遍历图像,找足够多匹配的 tile 来积累检测置信度。
代价是容量直线下降。嵌入 100 份拷贝,有效比特数就除以 100。回报是:即使图像被裁掉一半、打印再拍照、折叠污损,只要有一部分 tile 还在,检测就成立。Digimarc 在做的事不是”抵抗 JPEG 压缩”,是”无论你怎么折腾我都有备份”。
这个策略的验证来自部署环境本身。他们的水印嵌入了多国央行货币(近 30 年合作),嵌入了美国 36 个州的驾照(年产 6000 万份),用于反伪造和自动识别。运行环境不是 benchmark 测试套件,是钱包里的物理磨损、超市收银台的扫描仪、洗衣机的意外漂洗。
另一个同样规模的案例是 Verance 的 Cinavia,嵌入电影音轨的音频水印。被 AACS 强制要求,所有蓝光播放器必须检测。影院盗录(麦克风收音、环境噪声、重压缩)之后水印仍在,否则播放器静音。300M+ 设备已部署。
Digimarc 和 Cinavia 的共同点是设计哲学:承认未知攻击的存在,用冗余覆盖全部可能,而不是用数学证明去对抗每一个已知攻击。冗余是唯一一个不挑攻击类型的防御。它用数量替代精度。
2018 年,HiDDeN(Zhu et al., ECCV 2018)发表,数字水印进入了学习型时代。HiDDeN 的框架此后成了模板:一个编码器网络把比特串嵌进图像,一个可微分的噪声层模拟攻击,一个解码器网络恢复比特。训练时端到端优化,编码器靠反向传播自学如何在特定攻击分布下最大化恢复率。
这段的历史意义不在于 HiDDeN 本身的数据比前人好了多少。在于它把水印设计从”手工写变换规则”变成了”把攻击分布喂进网络,让优化器自己找解”。此后五年出现了两个主线张力。
第一个张力:训练分布决定鲁棒边界。 学习型方案对训练时见过的攻击类型(JPEG、模糊、裁剪)可以做到远超经典方案的效果,因为它直接在梯度上优化了对抗这些攻击的嵌入策略。但它对训练时没见过的攻击类型(比如一个没被建模的旋转角度、一种新型压缩算法)没有任何保证。经典方案虽然没有在任何一项上做到极致,但它的退化是均匀的。攻击变强,检测率逐渐下降。学习型方案在分布外可能从 99% 直接跳到随机猜测。这不是工程缺陷,是方法论本身的后果:把设计交给数据,就得接受数据的边界。
第二个张力:攻防军备竞赛。 2018 年以来的论文结构变成了一个循环:有人提出新的水印方案,一年内就有人发表论文展示一种特定的攻击能移除它,再过一年有针对性的防御出现。Zhao 等人在 NeurIPS 2024 展示了一种通用的”再生攻击”:先加噪破坏水印信号,再用扩散模型重建图像质量。四个像素级后处理水印方案全部被显著减弱。对这种攻击最有抵抗力的反而是马里兰大学的 Tree-Ring。它的水印嵌在扩散模型采样的初始噪声中,不在最终的图像像素里,所以像素级的再生攻击打不到它。但 Tree-Ring 的代价也直接:只适用于 AI 生成的图,没法嵌在普通相机拍的照片里。
这两条张力指向了同一个结论:这个领域的均衡态是动态的。不存在一个固定的”最优方案”,只存在一个特定的 threat model 和它的最优应对。威胁模型一变,最优方案跟着变。这不是工程还没做到位,是这个博弈本身的结构决定的。
把空域、变换域和学习型三类方案放到同一个评价平面上,会看到它们各自的生存区间。
面对 JPEG 压缩、加噪、低通滤波这类像素级或频域攻击,变换域方案(DCT、DWT 及其混合)仍然是最可靠的选择。Digimarc 用扩频加变换域跑了三十年,说明这组攻击在实际生产环境中是主要威胁,而变换域方案对它们有成熟的解法。
面对大角度旋转、透视变形、打印再拍照这类几何物理攻击,传统和学习的混合正在成为默认选择。StegaStamp 用空间变换网络在训练时模拟几何攻击,在打印场景下表现超过了纯 DWT 方案。这种场景下传统几何不变方案(Fourier-Mellin 等)因为逆变换的质量损失,实际上很少能匹敌端到端学习的效果。
面对知道算法的针对性攻击,目前没有任何方案在全面对抗中占优。攻击者了解嵌入方案的原理,可以专门设计攻击来移除水印。经典方案对估计型攻击和串谋攻击尤其脆弱:如果你手上有多个嵌了同一个水印的不同图像,取平均就可以去掉大部分水印信号。学习型方案在训练时可以通过对抗训练(加一个试图移除水印的对抗网络)来增强韧性,但对抗训练本身又引出了新的分布外脆弱性。目前最抗打的是 Tree-Ring 这类”水印绑定生成过程”的方案,代价是只适用于 AI 生成内容。你没法在普通相机拍的照片上嵌入一个绑定扩散模型的水印。
过去十年里,数字水印的评价标准自身也在快速变化。经典的 PSNR、SSIM 和 BER 假设了一个”信号加噪声”模型,攻击是随机的、非自适应的。WAVES benchmark 在 2024 年引入的 [email protected]%FPR、再生攻击和分类攻击,实质上把水印安全从”信号处理领域”拉进了”对抗机器学习”领域。只要评价标准还在信号处理的框架里,攻防就会持续是攻击方占优。防守方必须覆盖所有可能的攻击,而攻击方只需要找到一条路。
数字水印的三十年,在技术层面回答了三个层递的问题:一个信号能藏多少比特。这信号在多变的现实环境里能不能活下来。攻击方也懂游戏规则时这套机制还撑不撑得住。
有两个判断在反复读文献和工业信息的过程中变得比较明确。
第一,不存在一个”最好的”水印方案。如果把几千篇论文放在一起看,很多文章宣称的”我们的方案在 X 种攻击下比前人有提升”,都是在一个特定数据集的特定攻击集合的特定参数区间内成立的结论。换一个基准或者在攻击组合里多加入一类操作,排名就变了。这正是”不可能三角”的真实表现:你必须选你更在意的角。
第二,学术界和工业界的割裂比表面上看起来大得多。学术论文的主导范式是提出一个新型变换组合,在若干标准攻击下测 BER 和 PSNR,和已有方案对比。工业系统的设计逻辑是选一个在特定威胁模型下以最低误检率运行的方案,用极端的冗余和层次化检测来兜底。Digimarc 的核心技术本质上仍然是 Cox 1997 扩频思想的工程化延伸,没有用到 DWT 加 SVD 加优化算法的任何一个组合,它已经在世界最敌对的使用环境运行了三十年。并非说论文没有价值,而是论文与论文之间的对比框架,和真实部署场景之间的重合度,可能比很多人以为的要低。
这些判断,对今天正在快速扩张的”AI 内容水印”领域同样成立。SynthID 和 C2PA 面临的不是传统的 JPEG 压缩和 Stirmark benchmark。它们面对的是有约束优化的攻击者、能自动搜索”如何去除 AI 水印”的 LLM、以及一个对”AI 或非 AI”的判断成本极其敏感的信息生态。理解传统水印三十年的技术累积和工程教训,至少可以帮人把一部分坑提前绕过去。