日报标题:泄露内部信息丢了工作,因为截图上「看不见的水印」
在月饼事件中的新闻中提到。阿里对员工访问的界面做了一定的处理。貌似这不是简单的水印。这种处理是什么,是怎么做到的呢?
看了除了 @大湿 其他人提出的都是空域算法,这些空域直接叠加的算法抗攻击性太差了。
就数字图像处理来说是叫做数字水印,不可见则被称为「盲水印技术」。现在加水印都是频域图片加水印。其算法有基于傅里叶变换,小波变换,分数阶傅里叶变换等。这些算法的基本思路是将图像变换成频域 / 小波域 / 分数阶频域,再将想加密的内容做变换,再叠加,之后做逆变换,形成加密图像。dct 和分数阶的方法一般加中频,想要攻击就要破坏图片内容。小波变换一般加在 LL2 LH2 HH2 HL2 中。
这类算法解密困难,你不知道加密者加在那个频段,而且受到攻击往往会破坏图像原本内容。其实解码的基本思想是滤波,可是,你要滤除哪个频段呢?正统是匹配滤波,可是不知道基频如何做呢?
我感觉阿里工程师还是很善良的,几乎就是应付 HR 需求,真要好好做的话,被动性解密(又被称为被动性攻击,即你不知道加密具体过程)图片就直接毁了的可能性比较大。那样图片如果不带水印的化无论如何也不会流出,带水印就能知道谁干的。
看评论和答案,有同学在说剪切涂抹等破坏水印的方法,这对空域的方法是有效的。频域加水印的目的就是防止水印被破坏,破坏方式包括旋转,剪切,缩放,涂抹,加噪等。心血来潮,简单介绍一下频域加水印的方法。这里采用最简单的傅里叶变换的方式。特别说明一下,我就是简单科普一下频域加水印,我给出的方法抗攻击性相对较差的,有兴趣可以了解小波方面的加水印方法,真正做的好的真心不怕大部分空域的操作。代码附在原答案后。(看有同学问小波的,其实思路都差不多,我在文章最后附上了 Haar 小波变换加水印的代码)
这是原图像,尺寸 300*240
这是我想加的水印,尺寸 200*100
这是我编码后的水印,编码方式采用随机序列编码
之后将原图像做傅里叶变换,与编码后的水印叠加,再作傅里叶逆变换,得到了加水印的图像
肉眼几乎看不出来与原图像有什么区别,实际上是把水印已噪声的形式添加进去。
下图是在空域上的加水印图与原图的残差
可以看出实际上就是添加冗余信息也就是噪声,但这些噪声遍布全图,在空域上并不容易破坏
最终,均方误差(MSE)为 0.0244
信噪比(PSNR)为 64.2dB
之后再进行水印提取
这是一个很简单的 Demo,总得来说抗攻击性不强,现在利用小波、分数阶傅里叶变换所添加的盲水印抗攻击性好。
在文章最后附上了上述实验的源代码,以及 Harr 小波变换加水印的代码。
攻击实验区
下面进行抗攻击性测试
1.进行涂抹攻击,这是攻击后的图片,(在原加水印算法中,我调低了信噪比)
再进行水印提取
2.进行剪切攻击,就是网上经常用的截图截取一部分的情况
部分剪切的图像
进行循环补全:
提取水印:
5. 从 float32 量化到 uint8 的提取结果
6 JPEG 压缩后,(这个实验我好像是拿明码做的,能量主要加在了高频)
提取结果
7.PS 4 像素马赛克 / 均值滤波 等
攻击后图像:(这是我女朋友吗?丑死了)
提取水印后图像:
8.截屏:
截屏后我手动抠出要测试的图像区域,并且抽样或者插值到原图尺寸
测试结果:
9.对于背景纯色的图其实也是无所谓的
能量系数为 10 时加水印图片:觉得太显噪就把能量系数调低,不过水印的隐秘性和鲁棒性是互斥的
最终提取出的水印:
10.我用将 RGB>600 的像素设置成为(0,255,0)来模拟 PS 魔术手,
提取水印为:
11.屏摄,好吧,这个实验我做哭了
屏摄图:
实验结果:
我把水印能量系数调整到 2000 都没有用。
屏摄之后与原图信噪比为 4dB 左右,我用多抽样滤波的方式试过,滤不掉屏摄引入的噪声,屏摄不仅引入了椒盐噪声,乘性噪声,还有有规律的雪花纹理,求大神尝试一下。
我所用的这种方法针对屏摄不行,我试各种加放大器滤波器、还有多抽样滤波、谱增强等方法将近三个小时,没成功,哪位大神可以做一下或者讨论讨论。还有二值化不行,这是我想当然的,觉得肯定不行所以没做实验。其他的我试了试,用给出的方法调整一下能量系数都可以。
我想大家最关心的是什么最安全,不会被追踪。
不涉及图像的都安全,比如拿笔记下来。
涉及图像的屏摄最安全,截屏十分不安全。
以下是源代码:
%% 运行环境 Matlab2010a
clc;clear;close all;
alpha = 1;
%% read data
im = double(imread('gl1.jpg'))/255;
mark = double(imread('watermark.jpg'))/255;
figure, imshow(im),title('original image');
figure, imshow(mark),title('watermark');
……(阅读完整代码请点击「查看知乎讨论」查看)