盲水印技术在国内网站发布内容时过审的应用

1,564 阅读3分钟

前言

由于国内的审核规范原因,大部分年轻人平时娱乐的门户平台都有相对严格的审核制度。在知乎,B站,甚至CSDN发布点内容都要经过严格的审核,由于举报/恶意举报操作的频繁发生,许多优质的内容被迫下架转投youtube/quora/github。因此如何让做出的内容在国内传播且不会被删除就成为了技术工作者所要考虑的问题。联想到前几年阿里内部抢购月饼的时候,内部程序员由于写脚本被抓的过程使用的盲水印技术,这种技术的初衷是监控特定使用人群/在作品中加入水印以保护知识产权等;若将其用于传播信息领域,在当下说不定会成为一种新的解决思路。因此简单介绍一下其可能的应用方式(加水印,解密水印)

实现

大家可以谷歌搜一下watermask.js这个项目。建立一个html文件,引入js,调用方式如下:

watermark_txt是水印的内容,watermark_alpha是透明度,当然还有其他配置参数,但这两个是最基本的。打开html看看效果:

满屏幕都是拳王的大名,查看元素发现这个网站水印的实现是将固定宽度的absolute元素铺满页面,且元素都在shadowhtml里:

有了水印功能,接下来把水印变成盲水印,把watermark_alpha改成0.005(这里注意不能低于这个值,否则电脑屏幕有可能无法识别,当然低于0.05人的肉眼就已经分辨不出来了)。刷新一下会发现眼前一片白。这里我们截取页面的一部分备用:

这里有图片
接下来做解码的部分,原理其实很简单,用过ps的同学一定都不陌生,mix-blend-mode。利用色差将图片的文字显示出来:在图片上扑一层div,背景色与水印文字颜色相同,mix-blend-mode取color-burn。来看一下元素结构和效果:

这里适用watermask只是引子,显示适用时大家只需要将文字的opacity调成0.005即可,截图之后就能对应大量文字内容,字体的颜色/截图的底色/解码div用的底色有讲究,blend-mix-mode模式对应的是rgb色值的计算,搭配使用之后如果不知道相对应的色值很有可能无法识别文字,这又增添了一层破解难度。

适用范围

以b站为例,b站的审核制度是关键词过滤+人工审核+举报制度+仲裁(用户申请仲裁身份,之后由仲裁官投票决定是否删除内容)。

  • 在关键词过滤方面要实现审核首先要解码图片之后再对文字进行识别,并且解码要得到对应的rgb值,穷举的话对资源消耗不小。
  • 人工审核、举报制度、仲裁都需要人眼的识别,手动解码的过程对于身为用户的仲裁官来讲太过繁琐。

方便传播

由于破译困难(有的技术圈子甚至用特定频率的相位偏移在图片内加载内容),同时也导致了传播困难,因此破译脚本/插件必不可少,不然看到纯色的图片只能会心一笑并不能快速提取信息,至于这个内容就待以后再写。