1. 项目背景与需求分析
在商业标书系统中,经常需要向内部员工分发包含敏感信息的图片资料。这些图片一旦被截图外泄,往往难以追踪具体的泄露源头。我们面临的核心需求是:即使图片被截图后传播,也能从截图中识别出最初接收人的身份信息。
传统解决方案通常采用数字水印技术,但实际测试发现,大多数水印方案在截图场景下几乎完全失效。这主要是因为:
- 截图过程不是简单的文件复制,而是对显示器像素的二次采样
- 操作系统、浏览器渲染、色彩配置转换、DPI缩放等多个环节都会改变原始像素值
- 截图工具通常会对图片进行JPEG/PNG重编码
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 初版DCT方案的技术实现与失败原因
2.1 DCT水印原理
离散余弦变换(DCT)是JPEG压缩的核心算法。我们将图片分割为8×8的小块,在每个块中选取特定位置的频率系数来隐藏信息:
python复制# 伪代码示例:DCT系数嵌入
def embed_dct_watermark(block, bit):
if bit == 1:
block[3][3] -= 22.0
block[4][4] += 22.0
else:
block[3][3] += 22.0
block[4][4] -= 22.0
return block
为了提高鲁棒性,每个bit信息会分散存储在多个DCT块中,采用多数表决机制解码。
2.2 实际测试结果
我们对多种截图工具进行了测试:
| 截图工具 | 输出格式 | 识别结果 |
|---|---|---|
| iShot | PNG→PNG | 失败 |
| 钉钉 | PNG→JPEG | 失败 |
| 微信 | PNG→PNG | 失败 |
| PNG→PNG | 失败 |
识别成功率接近0%,完全无法满足业务需求。
2.3 失败原因深度分析
DCT水印失效的根本原因在于其三个关键假设都被截图过程破坏:
- 像素精确值保留假设:截图过程中的色彩空间转换和重编码会改变像素值
- DCT块边界对齐假设:浏览器缩放会导致块边界错位(如原图1000×1000显示为700×700时,8×8块变为约5.6×5.6)
- 频率域系数稳定假设:JPEG重压缩会改变频率域系数分布
3. 微纹理追溯方案的设计思路
3.1 核心设计转变
我们放弃了传统的"信息隐藏"思路,转而采用"微纹理模板匹配"方案:
- 为每个接收人生成独特的纹理模板
- 将模板以极弱强度(PSNR>40dB)叠加到原图RGB值上
- 检测时通过统计相关性识别最匹配的模板
3.2 方案优势
与传统DCT水印相比,微纹理方案具有以下优势:
- 全局性:纹理分布在整个图片,抗局部裁剪
- 统计性:不依赖精确坐标,抗几何变形
- 尺度不变性:通过标准化画布解决缩放问题
