缓存时间:
2026/07/05 10:32
# Meta的不稳定签名 - Hacker Factor博客
来源:https://hackerfactor.com/blog/index.php?/archives/1098-Metas-Un-Stable-Signature.html
我正在结束对隐形水印算法的调查,结果令我极度失望。不仅现代基于AI的算法没有一个能像它们声称的那样工作,而且事实证明它们都犯了同一个根本性错误。
我之前评估了Google的SynthID(https://hackerfactor.com/blog/index.php?/archives/1092-Reversing-SynthID.html)和Adobe的TrustMark(https://hackerfactor.com/blog/index.php?/archives/1097-TrustMarks-False-Positive-Problem.html)算法。两者都*声称*拥有极其准确的结果。
- 根据Google经过同行评审并发表的论文(https://arxiv.org/abs/2510.09263),他们声称真阳性率(TPR)高于99.97%——这意味着他们漏掉自己水印的概率低于万分之一。然而,我自己的实证测试(https://hackerfactor.com/blog/index.php?/archives/1092-Reversing-SynthID.html)发现实际更接近二十分之一。此外,SynthID是专有的,只能通过Google的“Gemini”AI系统访问。Gemini已被观察到产生幻觉结果(https://hackerfactor.com/blog/index.php?/archives/1092-Reversing-SynthID.html),并且根据问题的措辞方式提供相互矛盾的结论。
- 根据Adobe的内容真实性倡议(https://opensource.contentauthenticity.org/docs/trustmark/faq/),他们的TrustMark“在严重噪声退化下,可以在约42-45dB PSNR质量下实现超过96%的比特准确率”。然而,该统计数据(https://hackerfactor.com/blog/%3Ca%20target=)侧重于鲁棒性而非准确性。在我的实证测试(https://hackerfactor.com/blog/index.php?/archives/1097-TrustMarks-False-Positive-Problem.html)中,我发现TrustMark的假阳性率高达10%-20%,这实际上使其毫无用处。(如果你看到一个TrustMark签名,那么它很可能是随机噪声,而不是真正的签名。)
这次,我评估了Meta的“Stable Signature”(稳定签名)算法。(他们的论文和代码在GitHub上:https://github.com/facebookresearch/stable_signature)。该系统将一个48位序列编码到图片的视觉内容中。其理念是,你可以将一个唯一的48位序列编码为你的水印。如果你的解码器找到了相同的48位序列,那么它就能识别出你自己的水印。
**警告:** 这篇博客文章大量使用数学和统计学来证明Stable Signature、TrustMark和SynthID远没有其开发者声称的那么可靠。
### 基本算法
传统的(非AI)隐形水印通常隐藏在微小的位置,例如最低有效位、亮度的变化(如Digimarc)或频谱(DCT或FFT)中。始终存在图像编码可能破坏隐藏数据的风险,因此这些算法通常依赖图像上的重复来帮助识别真实信号。此外,它们可能包含纠错码(数据中的额外比特)来修复任何细微的数据错误。
然而,传统方法存在一个问题:在图像中注入隐藏数据可能造成可见的失真。现代方法使用AI系统来更好地隐藏数据,同时增加更少的失真。
与SynthID和TrustMark一样,Stable Signature对二进制数据进行编码,并使用AI模型来决定将其隐藏在图像中的何处。AI被调整以在嵌入数据时最小化可见失真。之后,一个基于AI的解码器查看图像,识别可能存储比特的位置,然后提取数据。
数据总是可能混合噪声。不同的基于AI的水印系统依赖不同的技术来减少噪声。例如:
- Google的SynthID只存储很少的比特数据(实际上是一个标志或版本号)。这使得他们可以使用大量数据作为重复,从而提高准确率。
- Adobe的TrustMark使用Bose-Chaudhuri-Hocquenghem(https://en.wikipedia.org/wiki/BCH_code)(BCH)算法。这相当于校验和与纠错码的组合,应该能减少错误数量。
Meta的Stable Signature使用简单的汉明距离(https://en.wikipedia.org/wiki/Hamming_distance)。
汉明距离衡量为了纠错需要交换的比特数量。实际上,它定义了一组稳定状态(例如,10110和11000),并在每个状态周围放置一个代表单比特变化的环。如果你改变了足够多的比特,那么你将达到一个不同的稳定状态。
根据Meta的Stable Signature研究论文(https://arxiv.org/abs/2303.15435),这48位应该是均匀分布的,并且声称“假阳性率低于10⁻⁶”,即百万分之一。这意味着你可以选择一个48位序列作为你的签名。每张图片*都会*生成一个48位序列,并且该序列可能会根据图片中的噪声略有变化。然而,如果你发现一个代码与你代码的汉明距离很近(例如,差异少于6位),那么你可以以高可靠性确定它是相同的代码。
至少,理论上是这样。
### 实证测试
我进行这个实验时假设一切如他们所声称的那样工作。我希望能够可靠地识别与Meta相关的隐形水印。我不知道他们使用什么序列,也不知道他们是否根据图像来自Meta的AI系统、Facebook、Instagram、WhatsApp等使用多个代码。
幸运的是,这是可以测试的!我从FotoForensics抓取了一组未经筛选的图片样本:上个月(2026年5月)上传的前10,000张独特图像。如果比特序列是均匀分布的,碰撞率为“百万分之一”,那么我应该会看到大量唯一的比特序列,以及围绕Meta图片(Meta AI、Facebook、Instagram等)的一些小簇。这些簇将代表Meta使用的隐形水印。
我的实证测试结果绝对出乎我的意料。我发现:
- 没有与任何Meta图像相关的簇。这表明Meta没有使用他们自己的在GitHub上找到的Stable Signature水印软件。
- 在随机分布的情况下,不应该有簇。然而,我有25张不同的图片具有*完全相同的*比特序列:110110100111111011101001111000100111011000011101。在百万分之一的碰撞率下,这*不应该发生*!这些图片来自完全不同的来源。以下是其中的四张图片(从行星到灯泡,再到带有透明(黑色)背景的文字):
[](https://fotoforensics.com/analysis.php?id=1d1bc10b39edeb7b77344bd217bba66d758fe231.10936)
[](https://fotoforensics.com/analysis.php?id=4768c04999e85fef94b90094163b32237afc2fd3.122410)
[](https://fotoforensics.com/analysis.php?id=e81fba7e0299fb683e0caa1e20920555306bb9a7.12255)
[](https://fotoforensics.com/analysis.php?id=8fa2cabca7334e14b79c31628ca3ed2695d5574a.592422)
所有这些图片都有深色/黑色背景,中间有明亮的东西。这表明Stable Signature更像是一个感知哈希(https://hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html),而不是隐形水印。
- Stable Signature使用汉明距离来识别簇。如果我将这25张图片视为簇的中心(质心),并使用6位汉明距离,那么有356张图片是相似的。而如果我假设这25张图片不是中心而是簇的一部分,那么汉明距离为6的情况下,有一个以3位偏移为中心的簇,包含450张图片,中心序列为110110**0**001111110111010**1**11110001001110**0**1000011101。这个簇占未经筛选图像数据集的4.5%!以下是一些来自这个较大簇的样本:
[](https://fotoforensics.com/analysis.php?id=38b873d1b33a2330240cfb8e9d717097fb8e4138.1517303)
[](https://fotoforensics.com/analysis.php?id=1acefed79c14628eb77022bc9da8ec51c900f4be.543287)
[](https://fotoforensics.com/analysis.php?id=5883aa33d8576cef29b369ef6b234b3a5eb633df.527489)
(我明确不分享包含个人信息的图片,如发票、可识别的人物和GPS信息。)
不仅仅是这一个随机簇异常庞大(10,000张中有450张)。还有一个包含184张图片的簇,序列为110101001011001011001011111000100111001000011101;另一个包含58张图片的簇,序列为110100000011111010001001111000100111011000011101,等等。在汉明距离为6的情况下,我发现了超过60个包含至少10张图片的簇。在“百万分之一”的碰撞率下,这不应该发生。
### 独立分析
我回到Meta的研究论文,试图找出差异所在。然后我在第3.1节中找到了:他们对系统进行了测试,假设48位是相互独立且均匀分布的。问题在于,他们使用一个神经网络来生成这些比特。这明确意味着比特是依赖的,而非独立的。
他们的论文假设了一个二项分布。也就是说,给定一张任意图片,48位代表一次随机抛硬币。其数学表达式为:
P(X ≤ T) = Σ_{k=0}^{T} (48 choose k) (0.5)^k (0.5)^{48-k}
这计算了48个随机比特落在汉明距离(*T*)内的概率。概率表如下:
| 汉明距离阈值 (*T*) | 比特错误率 (BER) | 随机图片偶然匹配的概率 |
| :--- | :--- | :--- |
| 14位或更少 | ≤ 29.17% | 1/362.63 |
| 13位或更少 | ≤ 27.08% | 1/957.81 |
| 12位或更少 | ≤ 25.00% | 1/2,788.35 |
| 11位或更少 | ≤ 22.92% | 1/8,999.08 |
| 10位或更少 | ≤ 20.83% | 1/32,416.80 |
| 9位或更少 | ≤ 18.75% | 1/131,390.28 |
| 8位或更少 | ≤ 16.67% | 1/605,094.89 |
| 7位或更少 | ≤ 14.58% | 1/320万 |
| 6位或更少 | ≤ 12.50% | 1/1983万 |
| 5位或更少 | ≤ 10.42% | 1/1.4619亿 |
| 4位或更少 | ≤ 8.33% | 1/13.2亿 |
| 3位或更少 | ≤ 6.25% | 1/152.4亿 |
| 2位或更少 | ≤ 4.17% | 1/2391.5亿 |
| 1位或更少 | ≤ 2.08% | 1/5.74万亿 |
| 0位(完美匹配) | = 0.00% | 1/281.47万亿 |
Meta的论文说他们使用7位的汉明距离(要求48位中匹配41位),这符合他们声称的“假阳性率低于10⁻⁶”。然而,我在汉明距离为6(应该是两千万分之一)甚至碰撞为0(两百八十一万亿分之一)时都看到了问题!
### 核心问题
理论概率与实证测试之间显然存在差异。当我回顾Meta的研究论文(https://arxiv.org/abs/2303.15435)时,我看到了问题:
根据Meta的论文,48位中的每一位都是独立的。在一个完全独立的48位超立方体中,无水印图像应该均匀分布在所有2⁴⁸个可能值上。然而,神经网络通过这个超立方体映射了一个非线性流形(https://en.wikipedia.org/wiki/Nonlinear_dimensionality_reduction)(一个多维波浪曲面)。这个数学地形被扭曲了,有自己的山峰、沟壑和山谷。它有形成簇的吸引子,以及形成稳定值永远无法存在的空洞的排斥子;这是神经网络的一个特征。最重要的是,输出比特显然不是独立的。
左图说明了如果所有比特都是独立时预期的均匀分布。右图是当比特依赖时形成的理论上的簇的类型。在排斥区域周围应该有吸引子的簇和空洞(没有点的区域)。
从理论转向实证,我绘制了数据图。48位可以表示为字节。我取了前24位,将其转换为8位红、绿、蓝像素颜色。如果数据真正随机,那么彩色点应该分布在RGB立方体中。然而,如果比特是依赖的,那么应该会有非常清晰的簇、结构和空洞。以下是图表:
是的,存在非常清晰的结构,看起来像平面和线条。平面内有簇,而平面外有非常大的空洞——完全没有点的区域。Meta的Stable Signature实现生成的数据未能通过这个基本独立性检验。
我发现的最大簇代表一个零信号偏差(ZSB)。当他们的神经网络没有找到水印时,它会将48位移向一个强吸引子,就像一个巨大的引力井。在6位错误时,它应该有两千万分之一的碰撞。但实际上,由于ZSB,我的10,000张图片中有一个包含450张图片的簇,误差在6位以内。仅ZSB一项就产生了大约二十二分之一的错误率。如果我们加上所有其他包含至少10张图片的簇,那么有2327张图片位于不同的簇中;我们看到的错误率大约是四分之一——这还是在使用比他们论文中使用的7位汉明距离更保守的6位距离的情况下。(用AI术语来说,这是深度神经网络典型的*表示崩溃*或*结构偏差*。)
(顺便一提:鉴于他们“百万分之一”的声称,我可以寻找任何包含2张或更多图片的簇。在包含2张或更多图片的簇中,10,000张测试图片中有5,237张位于簇内,即52%。如果你向他们的算法展示10,000张图片,那么有超过50%的几率发生假阳性匹配。)
### 不如随机
我声称存在可见的簇并展示簇的图片是一回事,但用数学证明是另一回事。(是时候掸去我的《统计学导论》大学教科书了……)
我将Meta的代码应用于2026年5月的前10,000张图片。其中一些图片是未支持的格式(HEIC、WebP和一些损坏的JPEG文件),最终得到9,847张有效的图片。我使用NIST统计测试套件(https://csrc.nist.gov/pubs/sp/800/22/r1/upd1/final)(SP 800-22)中的元素来评估这些数据的随机性,包括单比特测试和用于独立性的卡方(χ²)检验。
单比特测试确定相邻比特的基准频率是否看起来独立。
- 处理的总比特数:9,847张图片 × 48位/签名 = 472,656位
- 观察到的1的计数:266,419
- 观察到的0的计数:206,237
- 每个的期望计数(*E*):236,328
对这个比特平衡进行简单的标准卡方拟合优度检验:
χ² = (266419 - 236328)² / 236328 + (206237 - 236328)² / 236328 = 3816.14 + 3816.14 = 7632.28
- 用数学术语说:自由度为1时,χ²统计量7,632.28产生的*p*值无限接近于0.0(*p* ⋘ 10⁻¹⁰⁰)。(顺便一提,大多数卡方分布表(https://www.itl.nist.gov/div898/handbook/eda/section3/eda3674.htm)通常评估自由度为1时直到χ²=10左右。这个χ²值如此天文数字般高,以至于概率*p*实际上变为零。)
- 用大白话说:这绝对不随机也不独立。
水印提取对各种全局任意图像强烈偏向于产生1而非0(大约56%的1对44%的0)。这立即违反了均匀分布假设。
第二个测试是用于序列独立性的卡方(χ²)检验。如果比特是独立的,相邻比特之间的转换概率应该只是它们各自概率的乘积。下表显示了在所有观察到的10,000张(实际上是9,847张)图片中转换对的出现率:
| 转换对 | 观察计数 (*O*) | 独立性下的期望计数 (*E*) |
| :--- | :--- | :--- |
| 0到0 | 106,750 | 90,051 |
| 0到1 | 95,296 | 116,186 |
| 1到0 | 95,302 | 116,186 |
| 1到1 | 165,461 | 149,976 |
χ² = Σ (O - E)² / E
χ² = 16699²/90051 + (-20890)²/116186 + (-20884)²/116186 + 15485²/149976
= 3096.7 + 3756.2 + 3754.0 + 1599.0
= 12,205.9
- 用数学术语说:自由度为3时,χ²统计量12,205.9