聊这个话题之前先看看下面这两张图片,能看出来有什么区别吗?

图片一
图片一
图片二
图片二

直观来看,左图左下角有文字水印,右图是“原图”。其实除了画面内容,两张图片承载了相同的文字信息,只不过右图不是明文显示,而是通过暗水印的方式把文字藏了进去。

关于暗水印

图片暗水印(也叫隐形水印、盲水印)是一种把标识信息嵌入图片内部、肉眼看不见但能被算法提取出来的技术。和传统明晃晃的文字水印(明水印)不同,暗水印不破坏画面观感,主要用于版权追踪和泄露溯源。

典型用途

  1. 版权追踪: 比如摄影师、设计师、平台给图片加入暗水印,后续即使别人裁剪、转发,也可能检测出原始来源。

  2. 平台溯源: 有些社交平台、图片平台、AI 图片生成工具,可能会在图片里加入隐藏标记,用来判断图片来源、生成工具、上传渠道等。

  3. 防盗图: 即使别人把明水印裁掉,只要暗水印还在,就可能证明图片来源。

  4. AI 生成图片识别: 一些 AI 图片系统会尝试给生成图加入不可见标记,用于说明“这张图可能由 AI 生成”。(借助 AI 工具生成的视频、图片,会被抖音、视频号、小红书等平台识别出是 AI 生成的作品,可能就是这个原理。)

暗水印不等于 EXIF 信息

很多人容易把两者混在一起,EXIF 信息是照片文件里的元数据,比如:

1
2
3
4
拍摄设备:iPhone
拍摄时间:2026-06-21
GPS 位置:
镜头参数:

这种信息比较容易被查看,也容易被删除。但暗水印一般是嵌进图片内容本身的,即使你删掉 EXIF,它可能还在。

做个小实验

核心原理很简单:明文 → AES-GCM 加密 → LSB 隐写嵌入 PNG 图片 → 接收端逆向提取。

方法一:自己写隐写工具

借助 AI 脚本做了一个图片隐写工具,实现加、解暗水印:

脚本代码
脚本代码

stego.py 共 185 行,结构清晰分为四层:

加密层(L33-58)

  • derive_key:scrypt 从口令派生 32 字节密钥(参数 n=2¹⁴,抗 GPU 暴力破解)
  • encrypt:随机 salt + nonce,AES-GCM 加密,输出 MAGIC | salt | nonce | len | 密文+tag
  • decrypt:先校验 MAGIC,再 AES-GCM 解密,口令错会在这里抛异常

LSB 隐写层(L62-101)

  • embed_lsb:图片展平为一维数组,每个像素值最低位替换为 payload 的一个 bit,强制输出 PNG
  • extract_lsb:先读固定头部 36 字节,拿到 payload 长度,再按需读取剩余 bits

实验辅助(L105-125)

  • capacity:计算可用容量,并提示 >10% 容量会被隐写分析识破
  • lsb_visualize:把 LSB 平面放大成黑白图,嵌入区域呈现随机噪点

CLI(L129-184):argparse 驱动,四个子命令 embed / extract / capacity / lsb

暗水印嵌入
暗水印嵌入
暗水印提取
暗水印提取

方法二:用 GitHub 上高 star 的项目

GitHub 上有一个 13.7k 星的项目:https://github.com/guofei9987/blind_watermark,作者 6 年前的项目,最后一次维护是 9 个月前。

把这个项目部署到本地,用命令行使用:

1
2
3
4
# embed watermark into image:
blind_watermark --embed --pwd 1234 examples/pic/ori_img.jpeg "watermark text" examples/output/embedded.png
# extract watermark from image:
blind_watermark --extract --pwd 1234 --wm_shape 111 examples/output/embedded.png

借助 AI 做了一个 web 界面:

嵌入暗水印
嵌入暗水印
提取暗水印
提取暗水印
水印错误无法提取水印
水印错误无法提取水印

这个代码里除了自定义暗水印和解密密码之外,还有一个水印长度参数。解密时如果不知道水印长度,即便知道解密密码,也是看不到暗水印信息的。

一个简单的本地实验,可以根据实际需要自行使用;如果定期更换密钥,也算是一种可用的加密消息方式。

谁在用暗水印

涉及产品 / 系统公开说法主要用途 / 类型
钉钉客户端、钉钉专属版、企业安全管理能力官方文档中有“全局暗水印”使用手册,目录里也明确列出“访问&数据安全 → 全局暗水印”。企业内部数据防泄露、截图 / 拍照溯源。
飞书客户端、飞书云文档、飞书管理后台飞书官方文档和社区文章公开提到“透明水印”,并说明可在飞书客户端、云文档、管理后台等场景启用;飞书安全文章称“明水印和透明水印结合”可用于追踪数据泄露源头。企业协作场景下的数据保护、截图泄密追踪。
字节跳动安全体系、内部业务场景、视频内容保护场景字节跳动安全中心公开称,其自研“隐藏水印算法”通过 ChinaDRM 实验室安全评估,并称技术应用于字节跳动内部不同业务场景。视频版权保护、内部数据安全、泄露溯源。
阿里云 DMS 数据管理控制台阿里云帮助文档明确写到,DMS 开启防泄露数字水印后,控制台同时提供明水印与暗水印;暗水印是“阿里安全团队自研的肉眼不可见数字水印技术”。数据库控制台防泄露、最终溯源。
阿里云媒体处理、视频点播、SASE、AIGC 标识能力阿里云文档中直接使用“数字水印(暗水印)”,说明可把数字信息隐藏式嵌入音视频载体;SASE 文档也提到 AIGC 内容需添加隐式标识,如元数据标识或数字水印。视频版权保护、泄露溯源、AIGC 合规标识。
腾讯云 COS、数据万象、云直播、图片 / 视频数字水印能力腾讯云文档公开“盲水印”“暗水印(数字水印)”功能,说明可把水印以不可见形式嵌入图片或直播视频,并支持提取验证。图片版权、视频直播版权、盗播追踪、内容溯源。
百度智能云数字水印、文心一格、文心一言、一念智能创作平台百度智能云数字水印产品页称,文心一格、文心一言、一念智能创作平台已集成“图片隐形水印能力”,针对 AIGC 图片植入唯一水印信息。AIGC 图片版权保护、政策合规、内容追踪;图片隐形水印。
华为云 DSC 数据安全中心华为云文档称 DSC 支持“明暗双重水印”,可打上看得见的明水印或看不见的暗水印。文档、数据版权保护、内部 / 第三方使用溯源。
ChatGPT 生成图片、Codex、OpenAI API 图片、Sora 视频OpenAI 帮助文档写明:ChatGPT、Codex 和 API 生成的图片包含 C2PA metadata 和 SynthID watermarks;Sora 官方说明称视频包含可见水印、C2PA 元数据和其他不可见来源信号。图片:SynthID 暗水印 + C2PA;视频:C2PA + 来源信号 / 可见水印。
Gemini、Imagen、Veo 等 Google 生成式媒体产品Google DeepMind 公开称 SynthID 会给 AI 生成图片或视频片段加入不可见数字水印;Google 还称已将 SynthID 集成进生成式媒体模型和产品。图片、视频、音频、文本的 SynthID 暗水印体系。
Meta AI 图片;Facebook / Instagram / Threads 相关 AI 图片识别体系Meta 官方称,Meta AI 图片使用 IPTC metadata 和 invisible watermarks;Meta FAIR 还发布了 Meta Seal,用于图像、视频、音频、文本的不可见鲁棒水印研究框架。图片暗水印 + 元数据;研究层面覆盖多模态。
Amazon Titan Image Generator、Amazon Nova Canvas、Amazon BedrockAWS 文档明确写到:Titan Image Generator 会给所有生成图片加入 invisible watermark 和 C2PA metadata,并提供水印检测能力。图片暗水印 + C2PA。

暗水印怎么破、怎么用

图片经过这些处理后,暗水印可能受损:截图、多次压缩、裁剪、调色、改尺寸、AI 重绘、模糊处理、转换格式等。

如果担心图片里被加了暗水印,最快的解决方式是把图片丢到微信、QQ 等即时通讯软件中——腾讯会帮你把这些数据删掉。普通发送会压缩、丢失大量 EXIF 信息,地理位置之类的就无从获取,这没争议,绝对是腾讯出于安全考虑在保护自己的用户。

关键是“原图”。有人在 2025 年做了二进制对比,发现微信“原图”的画质是保真的(JPG 压缩块完全保留),但文件头部的一些元数据被删除了,比如 GPS 位置信息。也就是说,现在微信原图 = 像素保真,但元数据(至少 GPS)被剥掉

钉钉 / 企业微信 / 飞书这三个企业级工具对图片处理更激进。有资料明确指出,它们可能不支持查看 EXIF 扩展信息;上传的图片如果经过系统再处理(加水印、压缩),EXIF 会被清除。

真正能完整保留原信息的,只有文件方式:通过「文件」发送,对方收到的是一份文件,会保留原始信息。

工具当“照片”发(压缩)“原图”当“文件”发
微信⚠️ 画质保真但删 GPS 等
QQ⚠️ 多数保留(建议实测)
钉钉
企业微信
飞书

比较强的暗水印可以扛住一部分处理,但没有一种暗水印是完全不可破坏的。


以上是关于暗水印的个人收集和小实验。