警告
本篇文章所有内容仅供学习和研究使用。请各位读者遵循所在国家/地区的相关法律法规,勿将对应技术手段用于逃避监管或违法犯罪,否则产生的一切后果将由您自行承担。此外,本篇文章引用的所有内容、新闻均不代表本人态度、立场,列出或推荐的所有软件均与本人无任何利害关系。
前言
本文为专栏《隐私泄露与保护》的第二篇文章,主要围绕常见的水印追踪方案展开,期望在前人的智慧上,稍稍结合些自己的见解。另外,由于站长对图像处理等技术的细节不太熟悉,本文对实施细节的讨论比较简略,主要简略讨论现存实际方案。
明水印
财新、飞书的固定水印
站长认为,最常见的一类水印就是像财新覆盖所阅读文章内容、飞书这样全屏覆盖的明水印以及一些图床的自动水印。这类水印位置往往固定,以警告恶意搬运者、提升搬运内容的成本为主要目的。除了给图片、视频等媒体资源提前打上的固定水印,为了兼顾灵活性,目前在前端中添加盲水印比较倾向于用Canvas在线进行绘制,而不是在后端渲染完毕后再返回含水印的媒体内容。
因此,这类明水印存在直接拦截的可能。Github上也有针对Web端的财新、飞书的去水印脚本:
如木已成舟,希望移除截图中水印,就要再细分讨论了。当这类水印与背景差异较大或结构简单时,印象中10年前就有较为成熟的Photoshop“古法”方案,能通过二值化、调整色阶、污点修复、颜色减淡等方式缓解或消除水印。而现在,选用大模型对图片水印(特别是仅一块的特定位置水印)执行消除,或许是更简单粗暴的方案。
另注:字节跳动旗下的飞书只有全屏水印这类明水印吗?
据悉,目前隐藏水印算法已经应用到字节跳动旗下飞书全端场景中,让企业的协作与管理实现安全与高效的运作。在具体实践上,隐藏水印算法能够保护用户在使用飞书中的界面信息内容,防止信息外泄。此外,通过隐藏水印还可以有效帮助企业用户实现版权保护、泄露溯源与链路追踪,具有准确性高、实效性高、隐蔽性好及体验无感等诸多优势,为用户提供从物理到应用层面的全方位安全护航。
浮动水印/跑马灯水印
浮动水印(或类似的跑马灯水印),多出现于付费直播、视频等资源的盗录追踪中。在国内这一领域中,保利威应该算做的比较出名的。若有计算机科班出身的读者,或许会注意到,平日求职刷题用的牛客网的付费视频资源保护,采用的就是保利威方案。
目前,对待这种浮动水印(或类似的跑马灯水印),站长暂不知有什么好办法。如果是纯前端做的水印覆盖,或许还能使用与财新、飞书一样的去除方式将水印干掉,以便进行翻录。但如果是将水印内容下发前,就根据用户ID生成水印并嵌入至下发的视频片段中,则无法简单进行消除。特别地,类似保利威这种提供直播、视频版权保护的平台,往往还会提供另一种盲水印方案:3.5 视频AB流水印,来更好地保护版权。
一些云服务商同样提供视频版权保护服务,可参考其文档进一步了解此类水印的实施过程:
盲水印
盲水印,即肉眼难以感知的数字水印。与明水印不同,盲水印更注重追溯用户而不是威慑用户,因此相关技术更多聚焦在隐蔽性和鲁棒性上。
对于图片而言,既有2022年 3.2 知乎豆瓣截图盲水印风波 那样直接使用不明显颜色将用户ID隐写到图片中的方法,也有为了更加隐蔽,通过翻转每个图片的最低有效位暗藏信息的方式。不过,若要追求更高的鲁棒性以及安全性,采用DCT、SVD等方式嵌入 3.3 基于频域的盲水印 或是更合适的方案。
此外,盲水印的隐蔽性和鲁棒性多数时是互斥的。例如,盲水印的嵌入方式可根据是否离散嵌入分为两种方案。如对整个图像分块进行嵌入,将带来更强的鲁棒性,能更有效抵御局部截图等攻击情形,但因“均匀修改”,会降低水印的隐蔽性。下文多次引用的开源项目blind_watermark,使用的就是非离散嵌入方案。而离散嵌入方案则会从覆盖图像中随机稀疏地选择几个覆盖块,并由训练好的编码器嵌入一致的水印消息。这种方法相对更难察觉,但若覆盖块选择不当,其抗攻击性就会大大下降。后一方案实现可参考字节跳动文章及原论文:提升数字水印鲁棒性和隐蔽性的分析研究 - 字节跳动。
论隐写术
站长认为,盲水印可被看作平衡隐蔽性与鲁棒性的一种特殊的隐写术。为此,这里先引入几个简单的例子,提一下什么是隐写术。如希望了解更多,可参考guofei9987/HideInfo - Github以及【信息隐藏技术】隐写术、暗水印知识体系。
图种
构建图种,主要是基于以下前提:
图片的结束标志位压缩包等二进制数据的结束标志位不一致
看图软件读取文件时,会将图片文件结束标志位后的数据丢弃
解压软件读取文件时,会将压缩文件开始标志位前、结束标志位后的数据丢弃
基于以上前提,只需将压缩文件、图片文件拼接在一起(在Windows下,可使用copy /b aa.jpg + bb.zip output.jpg实现),就能产生一张看似正常,实则暗藏玄机的图片。当该文件的后缀名为jpg等图片文件的后缀时,默认将通过关联的看图软件打开,此时该文件将作为图片被展示;当该文件的后缀为rar等压缩文件的后缀时,默认将通过关联的解压软件打开,此时该文件将作为压缩包被展示。因此,如需读取隐藏在图片中的压缩包信息,只需修改图片后缀名为对应的压缩包类型的后缀名即可。
幻影坦克
幻影坦克,或称“隐藏图”,是一种借助背景颜色的变化实现在一张图片中隐藏另一张图片的技术。一般情况下,用户只能看到表层的普通图片。但当用户打开夜间模式或点开图片时,由于背景变为了黑色,原先表层的普通图片将消失,而另外一张里层的隐藏图片将出现。过去,幻影坦克主要被用来制作梗图或隐藏色图,常见于各类大型贴吧或QQ群。现在,幻影坦克流行度虽不及以往,但也偶然会在米游社等社区中出现。
以下为网络上一个幻影坦克的示例。其中,左侧图片为原图,在用户单击点开图片后,由于背景颜色的变化,左侧图片将变为右侧图片。更详细的原理介绍以及在线制作方案可见:教你造一台幻影坦克 - 寒夏摸鱼站


LSB隐写
由于不同的起始、结束标志位,用16进制编辑器打开图种文件可以很容易发现这是个图种文件。而幻影坦克技术设计之初多是为了制作梗图或隐藏色图,在隐蔽性上未作考虑。那么,有没有什么更切合「隐写术」中关于“隐”的部分,更不容易被人发现的算法呢?LSB (Least Significant Bit,最低有效位) 隐写就是这样一种相对更为隐蔽的方案。
在BMP、PNG等无损保存图片的格式中,每一个像素所对应的颜色都将被保存。同时,多数人类的肉眼很难识别出颜色的细微变化。因此,可以对这类无损保存图片的格式每一个像素点的最低位进行改写,以最小的扰动值将希望隐藏的信息嵌入到图片中,以便提高隐蔽性。
隐蔽性有了,那鲁棒性如何呢?很遗憾,未经改进的LSB算法难以对抗剪切、压缩等常见的攻击方式,且在通过jpg等有损压缩方案再次保存图片后,也很难保持原有的信息。为增强鲁棒性,可以参考二维码等带有冗余校验的数据保存方式,牺牲一定的数据容量换来一定的抗攻击能力。但“仅修改最低位”这一算法的核心思想注定了,在隐写信息到 * 图片 * 的场景,不论如何改进,都难以具备较强的鲁棒性。
最后,“仅修改最低位”真的如直觉般隐蔽吗?
并非如此。由于部分图片中像素点的分布是应服从二项分布的,而存在频率偏好的未经加密、未使用特定的编码方式,所嵌入的信息的二进制序列将影响像素点的二项分布情况,导致分布情况异常。在过去,这类偏好性可被利用进行词频分析,用于密码破译。在现在,可用来简单检验这一图片的像素点分布“是否正常”,是否可能含有潜藏的信息。通过卡方检测、拉普拉斯滤波等方式,可以更直观地感知到这一图片是否可能存在隐写的信息。
知乎、豆瓣截图盲水印风波
2022年,豆瓣、知乎前后被发现使用盲水印跟踪用户的行为:用户如截图并分享自己Web端、客户端的界面,那任一获得这张截图的攻击者将能通过截图反推出用户ID以及用户截图该页面的时间。
对此,知乎回应:“近期,站方在小范围进行了实验功能测试,短时间测试后,该实验功能已下线。”。而豆瓣回应称:“这是新增的“小组内容防搬运功能”,小组组长可以在「小组管理→小组内容防搬运设置」开启或关闭,开启后,对该小组内容进行截图时,截图上将自动生成经加密的【截图用户ID、被截图帖子ID、截图时间】信息。”
自风波后,知乎未明确重新上线盲水印功能。但是,豆瓣目前已将“防搬运小组功能”提供给普通用户使用,并已在相应文章下方明确“对本小组内容进行截图时,截图上将自动生成经加密的【截图用户ID、被截图帖子ID、截图时间】信息”。经测试,目前不论是否登录豆瓣,截图中都会被嵌入盲水印,导致Red Plane 0、Green Plane 0、Blue Plane 0中出现异常值。同时,最新的盲水印算法与以往不同,不会直接显示可读字符。 如需验证,读者可自行前往Image Blind Watermark Viewer对自己的截图进行测试。
另在此处补两张旧版豆瓣盲水印算法的截图,以供对比。图片均来自知乎 @猪猪侠 的专栏文章:《最近爆出豆瓣图片中的盲水印如何验证?》。


基于频域的盲水印
空间域,或称空域,不同于本节提到的频率域(经过傅里叶变换得到),是对原始的、输入图像的像素直接进行操作。前文提到的3.1.3 LSB隐写,就是一种典型的在空域嵌入盲水印的方式。由于人的肉眼对高频区域并不敏感,且频域操作对压缩、裁剪等常见攻击方式有更好的抵抗能力,现更多盲水印算法倾向于在频域进行操作。
具体而言(此处暂仅考虑传统算法,不考虑深度学习加持的水印算法),常见盲水印算法会基于图像和水印的特点采用离散余弦变换(DCT)、离散小波变换(DWT)、离散傅里叶变换(DFT)、奇异值分解(SVD)等方式的单种或多种组合将水印嵌入到实际图像中。开源项目guofei9987/blind_watermark中,提供的就是DCT+SVD的水印嵌入方案。详见下方代码:
| |
文字水印嵌入
在文字中嵌入水印方案有很多,例如基于目标语言的语法所产生的同义表达进行构造。但许多这类方案的适用范围窄,且要求苛刻。这里站长分享一种思想非常朴素且适用范围广的方法——「零宽字符」。
「零宽字符」法基于一个事实:现行字符集中存在一定字符,不作配置的情况下于用户而言是不可见、零感知的。多数时候,即时通讯软件或Office套件不会特别将零宽字符标注出来,因此,如未有提防或被平台编辑器自动过滤掉,当其他用户复制粘贴文字内容其他渠道时,嵌入其中的「零宽字符」也会无感知被一并被复制粘贴到其他渠道,实现水印的效果。同时,由于部分操作系统默认对剪贴板的保护程度极低,应用程序可以随意写入或读取剪贴板,为使用文字水印随时追踪用户提供了更丰富的可能。
基于「零宽字符」的方案是粗糙但简单有效的。读者若希望为自己的文字添加基于零宽字符的水印或查看零宽字符的适用范围,可访问【改进】文本盲水印 - 郭飞。更多文本水印方案,可参考综述《A Survey of Text Watermarking in the Era of Large Language Models》。



视频AB流水印
视频AB流水印是一种常用于追踪视频资源泄露源的方式,其技术基础如下:
用户请求视频资源时,每次请求得到的是特定视频片段,而不是完整视频
服务端可对视频资源进行转码以及将视频切割成A、B两套视频源
服务端能识别出一个完整的视频文件中,哪些视频片段来自A视频源,哪些视频片段来自B视频源
采用这类水印,服务端无需将用户ID和时间等追踪信息通过算法写入视频片段,而是通过组合不同视频源的片段的情况对不同的用户进行区分,无需多次对视频进行编辑转码操作,能有效节约服务端计算资源以及CDN流量资源。读者朋友们可参考数字水印(暗水印) - 溯源水印的原理文章中的图例,更直观了解何为视频AB流水印。
打印机追踪
据闻,因各个国家/地区的监管要求,打印机(特别是彩色打印机)在打印文件时,会在打印纸上留下肉眼难以察觉的水印信息,记录打印机序列号、打印时间等信息。其中,站长认为最经典的是「黄点追踪」。根据电子前哨基金会测试,大部分彩色打印机都会通过肉眼难以辨识的黄色小点将打印信息输出到纸张上,允许通过打印件追溯打印设备。部分政府机构已在一些事件中,通过这一方式锁定相关责任人并追责。为更直观体现水印追踪,此处引用电子前哨基金会在DocuColor Tracking Dot Decoding Guide中测试人员提供的实例,供各位读者参考:





为减小由「黄点追踪」技术引发的个资泄露风险,可以采用DEDA。这是一款允许用户检测并掩盖激光彩色打印机秘密隐藏在打印文档上的黄色圆点图案的工具,传送门如下:
Github仓库:https://github.com/dfd-tud/deda
论文链接:Forensic Analysis and Anonymisation of Printed Documents
深度学习水印方案
考虑到本文主题是规避隐私泄露风险,且站长本人技术“半桶水”,难以一一列举种类繁多的深度学习盲水印方案,因此这里站长摘选了些可供参考的技术文章,请各位读者自取:
结语
本文主要从隐私保护角度简要介绍溯源方面的水印,对保障文本完整性的脆弱水印等不做介绍。总的来说,截图并分享含水印的界面就跟把自己卖了差不多。相对来讲,采用屏摄法引入摩尔纹干扰或是最简单且低成本的应对水印追踪方式(但是,屏摄会引入新的泄露风险,如光线、背景等。其中不经意泄露的细节,可能会被「图寻」爱好者揪住,引发个资泄露风险)。而对于强大算法加持下具备较强鲁棒性且水印载荷远小于图片载荷的水印嵌入情形,或只能无奈感慨一句“防不胜防”。
最后,时间紧张,目前站长尚未测试一些“宣称”能抗屏幕拍摄的盲水印方案效果如何。如有读者朋友对此进行测试,欢迎在评论区进行交流。
感谢阅读。