初探无水印信息图片加密技术

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: #背景 ####随着手机APP越来越多,对于APP信息安全面临的挑战越来越大,像接口传递的验证信息这些相对保密的信息如果直接放在app中明文,那么毫无疑问,很容易就被破解出来,想干嘛就干嘛。因此为了对部分本地信息加密,想出过无数的办法,本次讨论的重点,无水印信息图片加密。** ---------------------------------------------------- ##原

背景

随着手机APP越来越多,对于APP信息安全面临的挑战越来越大,像接口传递的验证信息这些相对保密的信息如果直接放在app中明文,那么毫无疑问,很容易就被破解出来,想干嘛就干嘛。因此为了对部分本地信息加密,想出过无数的办法,本次讨论的重点,无水印信息图片加密。**


原理

无水印信息图片加密,基本原理,就是将信息负载再图片上,然后程序通过特定的算法将信息再度拿出来,而图片一看下去也是正常显示的,肉眼看不出任何的猫腻。那么到底怎么附加法?


1. 追加信息法:

利用不同格式图片的特性,例如 BMP文件头标记了图片文件大小,后面信息不读取,或JPG文件拥有FFD9 标志结束符,因此就算将再多信息附加上去,也不会影响原来图片查看。

2.颜色特征法:

根据 颜色的特点,因为颜色的最后一个位含有的信息量就算改变也不会改变大局,所以颜色的最后一个bit作为信息记录点。

3.颜色特征法Ex:

颜色特征,按一定的算法,获取约定的图片特征,例如,都获取RGB中G的整张图的波形,通过某种滤波器,分析出来某段,然后加上校验码进行校验信息是否有效,而且多段,含冗余,分布图片各个地方,几时压缩,或者截图后,信息也有可能被获取到。


各自优缺点

追加信息法:

优点:

加密后图片正常显示,无信息长度限制,可以无限追加信息。我们都不明白为啥某个 “正常” 图片竟然有1,2G那么大,到底后面附加了什么???嘿嘿

缺点:无限追加,也是致命缺点,你不会傻到真的认为 阿强那张1,2G的图片真的只是单纯的图片那么简单吧?


颜色特征法:    

优点:

加密后图片正常显示,信息保密度更强,不会增加图片本身的大小,当然转格式例外,而且根据算法,整体的保密性更强。

缺点:

能加密得信息的长度受图片size限制,如果对图片进行过压缩,信息将会损失得一塌糊涂。**

颜色特征法EX:

优点:

经过压缩后,信息仍有机会提取出来,耐操,加密后不会改变图片大小,有冗余信息,破解难度大。

缺点:

图片容易显示不正常,当然搞成类似白噪点也是个技术活,能加密得信息的长度受图片size限制。




颜色特征法原理剖析


这里重点解释下颜色特征法是怎么实现得。


颜色原理

说之前,必须要说下颜色的组成。大家都知道平时开发中我们使用的颜色值例如白色  #FFFFFFFF  黑色 #00000000 这些数字代表什么呢?


**

他们以2位16进制数字位一个单位分别代表  A,R,G,B。记得在保存的时候别忘记了A,透明度,否则出来的都是黑色一片哦。**

这里讨论 R,G,B,他们代表红,绿,蓝,三原色,**

而2位16进制的数字联合代表256个色值,换算2进制就是 8位。因为主要决定颜色的信息其实都储藏在这里,而前面的值表示颜色的变化越大,而最后以为相对改变的话,对颜色本身的影响是非常小的,255和254是相差很小的颜色变化。**因此只要我们改变三原色随便一个或者几个的最后一位,其实对颜色变化影响微乎其微。肉眼压根不能看出变化。

                int rgb = image.getPixel(curX, curY);

                r = (rgb & 0x00ff0000) >> 16;
                g = (rgb & 0x0000ff00) >> 8;
                b = (rgb & 0x000000ff);
                al = (rgb & 0xff000000) >> 24;

                if (bitLength >= 0) {
                    switch (iRGB) {
                        case 0:
                            r = (r & 0x000000FE);
                            r |= value;
                            break;
                        case 1:
                            g = (g & 0x000000FE);
                            g |= value;
                            break;
                        case 2:
                            b = (b & 0x000000FE);
                            b |= value;
                            break;
                    }
                }
                rgb = al << 24 | (r << 16) | (g << 8) | b;

图片格式原理


如果你以为只是改个颜色值,就大功告成,呵呵,那你马上哭着发现,压根你加密的信息从来就没正确拿出来过。因为图片是含有头部信息的,而且不同格式的图片头信息肯定也不一致的,相对固定的头部是BMP图片的,因此俺们这次也是采用输出BMP图片作为加密后的结果图片。首先我们看看BMP文件头组成:


bmp文件头

变量名 大小 作用
bfType 2bytes 默认直接写死 424d 说明文件类型的
bfSize 4bytes 图片总大小,包括头信息
bfReserved1 2bytes 保留,必须设置为0
bfReserved2 2bytes 保留,必须设置为0
bfOffBits 4bytes 说明文件头开始到实际图片数据之间的偏移量,其实也是相对恒定的



位图信息头


变量名 大小 作用
biSize 4bytes BitmapInfoHeader结构需要的字数,固定的40
biWidth 4bytes 图像的宽度,用像素为单位
biHeight 4bytes 图像的高度,用像素为单位。还有个作用,标志图片是正向还是倒向的。如果该值是正数,说明图像是倒向的,如果该数是负数,那么图像是正向的
biPlanes 2bytes 为目标设备说明颜色的平面数,他的值总是设为1
biBitCount 2bytes 说明比特数/像数,其值为1、4、8、16、24、32,现在通常用24位
biCompression 4bytes 说明图像数据压缩的类型。
0 表示不压缩
1 表示8比特编码,只用于8位图
biSizeImage 4bytes 图像大小,单位为字节
biXpelsPerMeter 4bytes 说明水平分辨率,像素/米 表示
biYPelsPerMeter 4bytes 说明垂直分辨率,像素/米 表示
biClrUsed 4bytes 说明位图实际使用的彩色表中的颜色索引数
biClrImportant 4bytes 说明对图像显示有重要影响的颜色索引的数目如果是0,表示都很重要



so,在修改完图像信息后,需要将这些信息补上头信息,再将颜色信息附上,关键代码如下

补充头信息:

            FileOutputStream fileos = new FileOutputStream(filename);
            // bmp文件头
            int bfType = 0x4d42;
            long bfSize = 14 + 40 + bufferSize;
            int bfReserved1 = 0;
            int bfReserved2 = 0;
            long bfOffBits = 14 + 40;
            // 保存bmp文件头
            writeWord(fileos, bfType);
            writeDword(fileos, bfSize);
            writeWord(fileos, bfReserved1);
            writeWord(fileos, bfReserved2);
            writeDword(fileos, bfOffBits);
            // bmp信息头
            long biSize = 40L;
            long biWidth = nBmpWidth;
            long biHeight = nBmpHeight;
            int biPlanes = 1;
            int biBitCount = 24;
            long biCompression = 0L;
            long biSizeImage = 0L;
            long biXpelsPerMeter = 0L;
            long biYPelsPerMeter = 0L;
            long biClrUsed = 0L;
            long biClrImportant = 0L;
            // 保存bmp信息头
            writeDword(fileos, biSize);
            writeLong(fileos, biWidth);
            writeLong(fileos, biHeight);
            writeWord(fileos, biPlanes);
            writeWord(fileos, biBitCount);
            writeDword(fileos, biCompression);
            writeDword(fileos, biSizeImage);
            writeLong(fileos, biXpelsPerMeter);
            writeLong(fileos, biYPelsPerMeter);
            writeDword(fileos, biClrUsed);
            writeDword(fileos, biClrImportant);



最后把图像信息也附上去。

for (int nCol = 0, nRealCol = nBmpHeight - 1; nCol < nBmpHeight; ++nCol, --nRealCol)
    for (int wRow = 0, wByteIdex = 0; wRow < nBmpWidth; wRow++, wByteIdex += 3) {
         int clr = bitmap.getPixel(wRow, nCol);
         bmpData[nRealCol * wWidth + wByteIdex] = (byte) Color.blue(clr);
         bmpData[nRealCol * wWidth + wByteIdex + 1] = (byte) Color.green(clr);
         bmpData[nRealCol * wWidth + wByteIdex + 2] = (byte) Color.red(clr);
         }


效果



gif5新文件.gif



后续


这只是相对最简单的图像加密,图像并压缩后容易出现损失,因此,后面要加上特征值作为验证,还有应该有一定冗余,还需要部分对其做成类似噪点的研究。



目录
相关文章
|
算法 安全 数据安全/隐私保护
互联网并发与安全系列教程(13) - 信息加密技术(对称&非对称加密)
互联网并发与安全系列教程(13) - 信息加密技术(对称&非对称加密)
82 0
|
安全 算法 Java
互联网并发与安全系列教程(12) - 信息加密技术(单向散列加密)
互联网并发与安全系列教程(12) - 信息加密技术(单向散列加密)
97 0
|
2月前
|
安全 网络协议 网络安全
【Azure 环境】从网络包中分析出TLS加密套件信息
An TLS 1.2 connection request was received from a remote client application, but non of the cipher suites supported by the client application are supported by the server. The connection request has failed. 从远程客户端应用程序收到 TLS 1.2 连接请求,但服务器不支持客户端应用程序支持的任何密码套件。连接请求失败。
|
2月前
|
SQL 安全 算法
网络安全的隐形盾牌:漏洞防御与信息加密的艺术
【10月更文挑战第36天】在数字世界的海洋中,网络安全犹如一艘船的保护罩,守护着我们的隐私和数据安全。本文将揭开网络安全的神秘面纱,从常见的网络漏洞到先进的加密技术,再到培养必要的安全意识,我们将一步步构建起防御的堡垒。文章不仅分享技术细节,还强调了在个人和组织层面采取积极措施的重要性。
|
8月前
|
XML Java 关系型数据库
如何给application.yml文件的敏感信息加密?
本文介绍了如何在SpringBoot应用中使用jasypt进行配置信息的加密解密。首先,需要添加jasypt-spring-boot-starter的依赖,版本至少为3.0.5。接着,在配置文件中设置`jasypt.encryptor.password`等参数。jasypt提供`StringEncryptor`接口用于加密解密,通过该接口可以在测试类中对敏感信息(如数据库用户名和密码)进行加解密。加密后的信息需带有`ENC()`前后缀。推荐将加密密码作为系统属性、命令行参数或环境变量传递,而不是直接写入配置文件。
397 3
|
3月前
|
SQL 安全 算法
网络安全与信息安全:构建数字世界的防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系社会秩序、保障个人隐私与企业机密的重要基石。本文旨在深入探讨网络安全漏洞的本质、加密技术的前沿进展以及提升安全意识的有效策略,为读者揭示数字时代下信息保护的核心要义。
本文聚焦网络安全与信息安全领域,详细剖析了网络安全漏洞的形成机理、常见类型及其潜在危害,强调了及时检测与修复的重要性。同时,文章系统介绍了对称加密、非对称加密及哈希算法等主流加密技术的原理、应用场景及优缺点,展现了加密技术在保障数据安全中的核心地位。此外,针对社会普遍存在的安全意识薄弱问题,提出了一系列切实可行的提升措施,如定期安全培训、强化密码管理、警惕钓鱼攻击等,旨在引导公众树立全面的网络安全观,共同构筑数字世界的安全防线。
|
3月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
219 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
4月前
|
SQL 安全 网络安全
网络安全的盾牌:漏洞防御与信息加密技术
【9月更文挑战第27天】在数字时代,网络安全和信息安全成为维护数据完整性、保密性和可用性的关键因素。本文将探讨网络安全漏洞的概念、成因及预防措施,同时深入讨论加密技术在保护信息安全中的作用。通过分析安全意识的重要性和提升方法,旨在为读者提供一套全面的网络安全知识框架,以增强个人和组织对抗网络威胁的能力。
52 5
|
4月前
|
安全 网络安全 数据安全/隐私保护
网络安全漏洞与加密技术:保护信息的艺术
【8月更文挑战第31天】在数字时代,网络安全和信息安全的重要性日益凸显。本文将探讨网络安全漏洞、加密技术以及提升安全意识等方面的内容。我们将通过实际代码示例和案例分析,深入了解网络攻击者如何利用安全漏洞进行攻击,以及如何运用加密技术来保护数据安全。同时,我们还将讨论如何提高个人和组织的安全意识,以应对不断变化的网络安全威胁。让我们一起探索这个充满挑战和机遇的领域吧!
|
5月前
|
存储 SQL 安全
网络防线:揭秘网络安全漏洞与信息加密的奥秘
在数字时代,网络安全与信息保护如同一场没有硝烟的战争。本文将带您深入了解网络安全的薄弱环节,探索加密技术如何成为守护信息安全的利剑,并强调提升个人和组织安全意识的重要性。从常见漏洞到防护策略,再到加密技术的演变,我们将一步步揭开网络安全的神秘面纱,让您在这个充满未知的数字世界中更加从容不迫。
44 2