文档隐写实验室

文件泄露了,怎么知道是谁干的?两种商业级文档溯源技术的真实演示。
文字指纹:同义词替换,文本层面的隐写。字间距水印:把 ID 藏进像素间距,截图也能提取。

注入文字指纹

输入一段文本,为不同收件方生成看起来完全一样、但指纹不同的版本。 文件泄露后,把泄露版本粘贴进来,就能知道是谁泄露的。

指纹提取 / 溯源

把你收到的「疑似泄露版本」粘贴进来,系统会提取指纹并告诉你是哪个收件方泄露的。

文字指纹是怎么工作的

1
同义词替换

「总金额」↔「总价款」,「交付」↔「完成」,「保证」↔「确保」。每个替换点是一个 bit,0 或 1。

2
零宽字符编码

在句号后插入不可见的零宽空格序列,编码额外的 bit。复制粘贴时会一起带走,肉眼完全看不到。

3
编码为 ID

N 个替换点编码 2ᴺ 个版本。10 个替换点 = 1024 个不同收件方,每人一份唯一版本。

4
提取溯源

拿到泄露版本,逐个检查替换点,还原出 ID,对应到具体收件方。

局限:文本被大幅改写或翻译后指纹可能失效。商业级方案(如 Digimarc)会结合字间距微调、行高变化等更隐蔽的方式,抗改写能力更强——这正是下一个 tab 演示的内容。

注入字间距水印

文本渲染成图片时,对特定字符间距做 ±0.3px 的微调来编码 ID。 肉眼完全看不出差异,但像素分析能读出 bit 序列。截图转发后水印依然存在。

0.3px

提取字间距水印

上传一张用上面方法生成的图片,系统会分析每个字符间距,还原出隐藏的收件方 ID。

拖拽图片到这里
或点击选择,支持 PNG / JPG
提示:先在左侧生成一张水印图片,下载后再上传到这里,验证提取是否准确。

字间距水印是怎么工作的

1
选取编码位置

从文本中选出 N 个「间距锚点」——相邻两个字符之间的空隙。N 个锚点可以编码 2ᴺ 个不同 ID。

2
微调间距

ID 的第 i 位为 1,就把第 i 个锚点的间距加 +δ;为 0 就减 −δ。δ 通常取 0.2~0.5px,肉眼不可见。

3
Canvas 逐字渲染

用 Canvas 2D API 逐字符绘制,精确控制每个字符的 x 坐标,实现亚像素级间距控制。

4
像素分析提取

对图片做列扫描,找到每个字符的左右边界,计算实际间距,与基准间距比较,判断每个 bit 是 0 还是 1。

抗攻击性:截图、缩放(等比)后水印依然可提取。JPEG 压缩会引入噪声,但只要质量 ≥ 85%,通常仍可正确提取。大幅裁剪或旋转会破坏水印。企业级方案会在多行同时编码,用冗余纠错提高鲁棒性。