图片隐写,盲水印,加密logo

article/2025/11/7 15:21:07

 

1.定义

隐写术算是一种加密技术,权威的 wiki 说法是“ 隐写术是一门关于信息隐藏的技巧与科学,所谓信息隐藏指的是不让除预期的接收者之外的任何人知晓信息的传递事件或者信息的内容。”

example:

钱图(钱上面的水印)

个人理解类似加水印logo的做法,加密logo就是盲水印(加密水印)~~~ 上图:

2.用途

上面 的水印就叫做盲水印,隐藏式的水印是以数字数据的方式加入音频、图片或影片中,但在一般的状况下无法被看见。隐藏式水印的重要应用之一是保护版权,期望能借此避免或阻止数字媒体未经授权的复制和拷贝。

1.不同人加相同水印

声明版权

应用案例

  • 某些画师、摄影师、设计师会在其作品中加入水印。

 

13年左右有位自称是“超写实主义”的画家,声称自己纯手工画的画写实程度可以 超过摄影机,并开办培训班敛财。 后被一位加了盲水印的摄影师戳穿,原来其“画作”都是直接将照片用ps处理成手绘质感的图。

  • 淘宝防盗图功能

 

淘宝卖家图会被淘宝自动打上水印,如果有别的卖家存图作为自己的图上传会被检测出。

2.不同人加不同水印

将某份保密数字资料发送给不同人时,可加上不同标识,如果资料被复制、传播可根据解码出的唯一标识来追究责任人。

应用案例

  • 电影刚刚公映时,每个影院,影厅的 电影底片里都会加入不同的不可见水印, 如果电影流出,就可追究相关影院责任。

  • 国内大厂的内部论坛、平台会在HTML页面中加入足够数量 及不被发现的唯一标识。当有内部敏感信息通过截图等方式流出,也可追踪到个人。

example:

2018年7月5日,因涉嫌窃取商业秘密,国家“千人计划”专家、通用电气主任工程师(Principal Engineer at GE Power)***被FBI逮捕。值得注意的是***的“隐写术”:通过对电脑上的数据文件进行加密,然后将机密文件隐藏在一张“日落”的数码照片的代码中,他巧妙避开了公司限制。

类似图种

3.原理图

4.盲水印特性

隐蔽性

由于不希望被察觉、不希望干扰用户体验、不希望被模仿等等原因,我们的水印不可见,也就是隐匿性。

强健性

强健性通常也被称作鲁棒性,简单地说就是耐操性。

需要说明的一点是,鲁棒性和隐蔽性通常不可兼得。

不易移除性

不易移除性跟鲁棒性有些相似, 不同的是:

鲁棒性更加强调的是数字资源在传播过程中不要被不自觉地干扰和破坏。

不易移除性是在别有用心者察觉了盲水印的存在后,不被他们自觉地移除或者破坏。

明确性

没什么可说的,就是盲水印需要表示出明确的信息。

5.前端角度分析

聚焦到载体为图片的隐写术,一起来从前端角度分析其技术原理。

我们知道图片的像素信息里存储着 RGB 的色值,R、G、B 分别为该像素的红、绿、蓝通道,每个通道的分量值范围在 0~255,16 进制则是 00~FF。在 CSS 中经常使用其 16 进制形式,比如指定博客头部背景色为 #A9D5F4。其中 R(红色)的 16 进制值为 A9,换算成十进制为 169。这时候,对 R 分量的值+1,即为 170,整个像素 RGB 值为 #AAD5F4,别说你看不出差别,就连火眼金金的“ 像素眼” 设计师都察觉不出来呢。于此同时,修改 G、B 的分量值,也是我们无法察觉的。因此可以得出重要结论:RGB 分量值的小量变动,是肉眼无法分辨的,不影响对图片的识别

有了这个结论,那就给我们了利用空间,常用手段的就是对二进制最低位进行操作,下面就用 canvas 来演示一下。

6.代码分析

1)解密

下面是一张靓女照片,里面的 G 通道分量被我加入了些文本信息,下面通过canvas来解开其中的信息 。

1.首先在页面加入一个 canvas 标签,并获取到其上下文。

 
<canvas id="canvasShow" width="601" height="338"></canvas>
let ctx = document.querySelector('#canvasShow').getContext('2d')

2.接着将图片先绘制在画布上,然后获取其像素数据。

 
let img = new Image()let originalDataimg.onload = function () {ctx.drawImage(img, 0, 0)// 获取指定区域的canvas像素信息originalData = ctx.getImageData(0,0,ctx.canvas.width,ctx.canvas.height)console.log('加料图信息', originalData)processData(originalData)}img.src = require('../assets/下载.png')

打印出数据,会看到有一个非常大的数组。

这个一维数组存储了所有的像素信息,一共有 601 * 338* 4 = 812552个值。其中 4 个值一组,为什么呢?在浏览器中解析图片,除了 RGB 值外,每组第 4 个值为透明度值,即像素信息实际为大家熟知的 rgba 值。

这里的解密规则是对 G 通道进行处理,G 的分量最低位为 1 则该像素设为绿色,G 的分量最低位为 0 则该像素设为黑色,直接看代码实现,完成后我们再绘制到 canvas,即可看到结果。

 
let processData = function (originalData) { let data = originalData.data for (let i = 0; i < data.length; i++) { if (i % 4 == 1) { if (data[i] % 2 === 0) { data[i] = 0 } else { data[i] = 255 } } else if (i % 4 === 3) { // alpha通道不做处理 continue } else { // 关闭其他分量,不关闭也不影响答案,甚至更美观 // data[i] = 0 } } // 将结果绘制到画布 ctx.putImageData(originalData, 0, 0) }

在 img onload 事件中调用 processData 方法,就可以看到结果啦。

得到的结果可能是这个样子的。

2)加密(在图片中隐藏信息)

上面先说了解密过程,再来反向说说加密过程。

1.首先在页面加入2个 canvas 标签,并获取到其上下文,这两个canvas分别对应文字和原图。

 
<canvas id="canvasText" width="601" height="338"></canvas>
<canvas id="canvas" width="601" height="338"></canvas>let ctx = document.querySelector('#canvas').getContext('2d')
let ctxText = document.querySelector('#canvasText').getContext('2d')

2.既然要在图片中加入文字信息,那么首先要获取文字的像素信息,这里我先用 canvas 在画布上打印文字,获取像素信息。

 
let textData ctxText.font = '30px Microsoft Yahei'
ctxText.fillText('hello world!', 300, 260)
textData = ctxText.getImageData( 0, 0, ctxText.canvas.width, ctxText.canvas.height ).data console.log('加密信息data', textData)

3.先保存文字的像素信息,接着加载图片获取其像素信息,然后对两组像素进行处理,过程中我抽离了一个公共方法。

 
let mergeData = function (newData, color) {let oData = originalData.dataconsole.log('oData', oData)// bit[r,g,b,a]位置, offset+bit =a位置let bit, offsetswitch (color) {case 'R':bit = 0offset = 3breakcase 'G':bit = 1offset = 2breakcase 'B':bit = 2offset = 1break}for (let i = 0; i < oData.length; i++) {if (i % 4 == bit) {// 只处理目标通道if (newData[i + offset] === 0 && oData[i] % 2 === 1) {// 没有水印信息的像素,将其对应通道的值设置为偶数(奇变偶不变)if (oData[i] === 255) {oData[i]--} else {oData[i]++}} else if (newData[i + offset] !== 0 && oData[i] % 2 === 0) {// 有水印信息的像素,将其对应通道的值设置为奇数(偶变奇不变)if (oData[i] === 255) {oData[i]--} else {oData[i]++}}}}ctx.putImageData(originalData, 0, 0)}

这个公共方法做的是,接受要隐藏的数据以及隐藏的颜色通道,然后对原图进行操作,修改图片该通道分量的最低位,如果有文字信息,则最低位置为 1,否则为 0。我们知道,RGB 的三个通道可以分别隐藏不同信息。

4.在 img.onload 中调用 mergeData(textData, 'G'),处理好图像后,只要在浏览器中的 canvas 上右键保存图片就可以得到一张带有加密信息的图片。

 
let img = new Image()let originalDataimg.onload = function () {ctx.drawImage(img, 0, 0)// 获取指定区域的canvas像素信息originalData = ctx.getImageData(0,0,ctx.canvas.width,ctx.canvas.height)console.log(originalData)mergeData(textData, 'G')}img.src = require('../assets/20220721180808.jpg')

结尾

例子比较简单,只展示了基本的最低位隐藏文本信息,像二维码这些简单图形也可以这么处理~~~


http://chatgpt.dhexx.cn/article/cFfZXqdO.shtml

相关文章

CTF盲水印详解

原创稿件征集 邮箱&#xff1a;eduantvsion.com QQ&#xff1a;3200599554 黑客极客技术、信息安全热点安全研究分析等安全相关的技术文章 稿件通过并发布还能收获 200-800元不等的稿酬 前言 在CTF杂项题型中&#xff0c;盲水印的出现频率是相当高的&#xff0c;但大多数人处于…

盲水印(Blind-WaterMark)

盲水印是一种肉眼不可见的水印方式&#xff0c;对图片资源使用图片盲水印或者文字水印&#xff0c;借此避免数字媒体未经授权的复制和拷贝&#xff0c;可通过对原图进行解码操作&#xff0c;得到水印图来证明版权归属。 这类盲水印是怎样实现的呢&#xff1f;原理并不复杂&…

Windows系统通过CMD连接MySql

1.按压WindowsR快捷键后输入"cmd" 2.点击"确定"按钮后打开命令行 3.通过输入"cd"MySql安装的bin目录&#xff0c;按压"Enter"后进入MySql安装的bin目录 4.输入"mysql -h localhost -u root -p"&#xff0c;此处-h后为对应ho…

cmd中无法连接MySQL

本人电脑是win10系统&#xff0c;安装的是MySQL5.7版本的&#xff0c;最近在登录MySQL的时候老师出现下面的错误&#xff0c;有的时候重启电脑耶也会出现这样的情况 1.先检查你的环境变量是否配置好了&#xff1b; &#xff08;如果没有配置好&#xff0c;请参考一下的步骤&am…

如何使用cmd安装MySQL

步骤一&#xff1a; 在官网MySQL&#xff1a; 点击download显示下载页面&#xff1a; 点击 MySQL community download&#xff08;这个适个人合开发者&#xff0c;免费的&#xff0c;之前的MySQL Enterprise Edition是企业版付费需要 &#xff0c;MySQL cluster CGE 是免费版但…

navicat或者cmd远程连接mysql数据库

问题产生&#xff1a; 一般情况下&#xff0c;MySql数据库是不允许进行远程连接操作的&#xff0c;强行使用Navicat连接会报出下面的错误。 服务器连接错误主机XXX不允许连接到此的MySQL的服务器 方法步骤&#xff1a; 1、远程登录授权 在服务器端进行操作&#xff0c;下…

cmd窗口无法连接MySQL的解决方法

1.将下载Mysql中的bin目录的路径配置到Path环境变量中&#xff1b; 2.winR&#xff0c;输入services.msc&#xff0c;到服务窗口找到mysql服务&#xff0c;其中mysql的服务名可能是mysqlxx而不是mysql&#xff0c;比如我的是mysql80&#xff0c;找到之后点击&#xff0c;然后在…

cmd启动MySQL

命令行启动MySQL step1&#xff1a;打开命令行&#xff1a;win R step2&#xff1a;输入如下命令&#xff0c;root与1234分别为MySQL的用户名与密码 mysql -uroot -p1234出现如下信息即为启动成功 如果连接失败 显示如下错误信息&#xff1a; ERROR 2003 (HY000): Cant …

cmd的mysql命令_MySQL cmd命令

1.MySQL 登录: mysql -h localhost -u root -p test Enter password: ***** -h 指定数据库主机名,默认时登录主机。-u指定用户名(即安装数据库时的设置的用户名)。-p指明登录需要密码,如果没有密码,可省略-p参数。 -p 后面的test并不是密码,而是要登录的数据库名。如果-p后…

cmd命令创建连接MySQL数据库

欢迎大家关注我的公众号【老周聊架构】&#xff0c;Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 一、连接MYSQL 格式&#xff1a; mysql -h 主机地址 -u 用户名 -p 用户密码1、 连接到本机上的MYSQL。 首先打开DOS窗口&#…

解决在cmd情况下无法连接MySQL情况(无脑操作教程)

在输入外部命令&#xff1a;mysql -u root -p的时候&#xff0c;出现下面的情况&#xff1a; &#xff08;网图&#xff0c;侵删&#xff09; 问题分析&#xff1a;可能是MySQL路径问题没有解决&#xff1b; 解决方法&#xff1a;1.打开电脑高级设置&#xff1b; 2.点击环境变…

cmd控制台连接MySQL数据库_如何利用CMD连接本机mysql数据库

从事数据工作的IT人员&#xff0c;很多人都会与Mysql数据库打交道。因为mysql数据库是一个开源的数据库&#xff0c;利用它来学习数据库的人也有很多。笔者今天就给大家分享一下&#xff0c;安装好mysql之后&#xff0c;怎么利用CMD连接本机mysql数据库。 1.首先第一步是需要我…

cmd指令连接mysql数据库,以及创建数据库与表

cmd指令连接mysql数据库&#xff0c;以及创建数据库与表 1&#xff0c; 打开命令提示符cmd&#xff08;直接搜索cmd回车&#xff09; 2&#xff0c;进入mysql&#xff0c;在cmd命令行输入mysql -uroot -p,然后输入你的mysql密码&#xff0c;成功后进入数据库 3,查看mysql中的…

如何连接Mysql

利用services.msg命令 ctrlr&#xff0c;输入命令&#xff1a;services.msc 在“服务”中找到并开启MySQL即可 利用cmd命令 ①按住快捷键winr&#xff0c;打开“运行”命令。 ②输入cmd&#xff0c;运行进入命令提示符界面。 ③在cmd中&#xff0c;输入mysql -u root -p…

CMD连接MySQL,本地phpAdmin登陆

Ⅰ.cmd连接数据库 方法一 1.WINR输入CMD&#xff0c;进入到数据库安装的盘路径&#xff08;cd\&#xff0c;会进入c盘根目录&#xff0c;再d:就进入d盘了&#xff0c;再cd 进入你数据库的安装路径&#xff09; 2.输入mysql -P 端口号 -h mysql的主机名\ip -u root&#xff0…

Windows下cmd窗口连接mysql

mysql安装完毕后&#xff0c;命令窗口连接需配置path环境变量&#xff0c;值为mysql安装的目录/bin。如图&#xff0c;Windows下搜索cmd&#xff0c;回车 在DOS命令窗口输入 mysql -hlocalhost -uroot -p回车 进入mysql数据库&#xff0c;其中-h表示服务器名&#xff0c;local…

从cmd 连接mysql_通过cmd命令连接mysql

通过cmd的命令窗口连接mysql&#xff0c;只需要在命令行中输入 mysql -uroot -p123456 .它会出现这样的提示&#xff1a;mysql不是内部或外部命令。解决办法是在环境变量的path路径下加入 C:Program FilesMySQLMySQL Server 5.6bin。 如下图&#xff1a; 将mysql配置到环境变量…

cmd连接mysql的方法详解

cmd连接mysql的方法详解 首先需要进入mysql的安装文件夹bin目录下&#xff1a;cd C:\Program Files\MySQL\MySQL Server 5.5\bin 连接&#xff1a;mysql -h主机地址 -u用户名 -p用户密码 &#xff08;注:u与用户名之间不用加空格&#xff0c;密码也一样&#xff0c;若不写-h…

cmd连接mysql数据库_怎么用cmd连接mysql数据库

cmd连接mysql数据库的方法&#xff1a;1、按【winr】打开运行&#xff0c;输入cmd&#xff0c;回车&#xff1b;2、在打开的命令提示符中进入mysql的bin目录下&#xff1b;3、执行【mysql -u root -p】命令并输入密码即可。 具体方法&#xff1a; (推荐学习&#xff1a;Python入…

用cmd命令行连接mysql数据库

右击左下角菜单&#xff0c;选择“运行”菜单&#xff0c;弹出如下窗口&#xff0c; 输入“cmd”命令&#xff0c;点击“确认”按钮。 找到mysql的安装路径 C:Program FilesMySQLMySQL Server 5.7in 使用cd切换到msyqld.exe路径下&#xff0c;然后输入mysql连接命令&#xff0c…