加密

加密序列化

一个漏洞

标准情况下,私有目录的文件权限最后三位应为空(类似“rw-rw—-”),即除应用本身外任何人无法读写;目录则允许多一个执行位(类似“rwxrwx—r/w/rw”)。
漏洞模拟:
1、编写漏洞App 存储sp 为 MODE_WORLD_READABLE(应该使用MODE_PRIVATE)
2、编写黑客 App 获取 漏洞 App的数据内容。

1
2
3
4
5
6
7
SharedPreferences sp = getSharedPreferences("sp", MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putInt("password", 123456);
edit.apply();
mTvSp.setText("密码存储完毕");


对称加密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
mTvAes.setOnClickListener(new View.OnClickListener() {
//原文 or 密文
String content = "AES对称加密";
//秘钥
String key = "todayinformation"; //不好,明文
//"算法/工作模式/填充模式"
String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
@Override
public void onClick(View v) {
if (isAdle) {
//去加密
try {
//生成秘钥
SecretKey secretKey = new SecretKeySpec(key.getBytes("utf-8"), "AES");
//加密解密器
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
//Cipher.ENCRYPT_MODE 加密模式
cipher.init(Cipher.ENCRYPT_MODE,secretKey);
//bytes 解密后的字节数组
byte[] bytes = cipher.doFinal(content.getBytes());
//如果不转成16进制 会出现乱码,因为我们加密的原文有中文
content = ByteUtil.parseByte2HexStr(bytes);
mTvAes.setText("加密后的结果 = " + content);
} catch (Exception e) {
e.printStackTrace();
}
} else {
//去解密
try {
SecretKey secretKey = new SecretKeySpec(key.getBytes("utf-8"), "AES");
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
//仅仅只有这里不一样 解密模式
cipher.init(Cipher.DECRYPT_MODE,secretKey);
byte[] bytes = cipher.doFinal(ByteUtil.parseHexStr2Byte(content));
content = new String(bytes,"UTF-8");
mTvAes.setText("解密后的结果 = " + content);
} catch (Exception e) {
e.printStackTrace();
}
}
isAdle = !isAdle;
}
});

替换式加密

按规则使⽤不同的⽂字来替换掉原先的⽂字来进⾏加密

码表:
原始字符:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密码字符:BCDEFGHIJKLMNOPQRSTUVWXYZA
原始书信:I love you
加密书信:J mpwf zpv
解读后:I love you

加密算法:替换⽂字
密钥:替换的码表

现代密码学

  • 可以加密任何⼆进制数据

  • ⾮对称加密的出现使得密码学有了更⼴泛的⽤途:数字签名

对称加密

加密和解密是用的同一把钥匙

把数据改得别人看不懂,即为加密;按照原路倒退着把数据改回来,即为解密。

经典算法
DES(56 位密钥,密钥太短⽽逐渐被弃⽤)、AES(128 位、192 位、256 位密钥,现在最流⾏)

对称加密作⽤
加密通信,防⽌信息在不安全⽹络上被截获后,信息被⼈读取或篡改。

反破解
⼀种优秀的对称加密算法的标准是,让破解者找不到⽐穷举法(暴⼒破解法)更有效的破解⼿段,并且穷举法的破解时间⾜够⻓(例如数千年)。

对称加密的缺点
密钥泄露:不能在不安全⽹络上传输密钥,⼀旦密钥泄露则加密通信失败。

非对称加密

原理:使⽤公钥对数据进⾏加密得到密⽂;使⽤私钥对数据进⾏解密得到原数据
私有密钥:一方保管
公有密钥:双方公有
发送数据之前要先和服务端约定生成公钥和私钥,使用公钥加密的数据可以用私钥解密
unknown_filename

由于私钥和公钥互相可解,因此⾮对称加密还可以应⽤于数字签名技术。
通常会对原数据 hash 以后对 hash 签名,然后附加在原数据的后⾯作为签名。这是为了让数据更⼩,别人公钥解密即可验证加密者的身份
unknown_filename.1

经典算法:RSA(可⽤于加密和签名)、DSA(仅⽤于签名,但速度更快)
RSA加密简单过程

  1. 服务端生成配对的公钥和私钥
  2. 私钥保存在服务端,公钥发送给客户端
  3. 客户端使用公钥加密明文传输给服务端
  4. 服务端使用私钥解密密文得到明文

⾮对称加密的优缺点
优点:可以在不安全⽹络上传输密钥
缺点:计算复杂,因此性能相⽐对称加密差很多

Md5

1+6=7,但是给你个7你能知道这是几跟几加得的吗?如果有人坚持认为 MD5算法是可逆的,请不妨设想一下将 MD5算法应用到文件压缩方面,那岂不是又出现了一种超级压缩技术了。。好几个 G 大小的文件都能压缩成一串 MD5,反正”可以求逆”也就是解压缩 (如果应用于压缩技术,算法就是公开的了,也不用费劲去破解了)。可惜这个显然是不可能的,哈哈哈

Base64

将⼆进制数据转换成由 64 个字符组成的字符串的编码算法

什么是⼆进制数据?
⼴义:所有计算机数据都是⼆进制数据
狭义:⾮⽂本数据即⼆进制数据

算法
将原数据每 6 位对应成 Base 64 索引表中的⼀个字符编排成⼀个字符串(每个字符8 位,3/4)。算法是公开的

Base64 的⽤途

  1. 将⼆进制数据扩充了储存和传输途径(例如可以把数据保存到⽂本⽂件、可以通过聊天对话框或短信形式发送⼆进制数据、可以在 URL 中加⼊简单的⼆进制数据)
  2. 普通的字符串在经过 Base64 编码后的结果会变得⾁眼不可读,因此可以适⽤于⼀定条件下的防偷窥(较少⽤)

Base64 的缺点
因为⾃身的原理(6 位变 8 位),因此每次 Base64 编码之后,数据都会增⼤约1/3,所以会影响存储和传输性能。

Base64 加密图⽚传输更安全和⾼效???
不。⾸先,Base64 并不是加密;另外,Base64 会导致数据增⼤ 1/3,降低⽹络性能,增⼤⽤户流量开销,是画蛇添⾜的⼿段。(最好不要拿来 diss 你们公司的后端哟,友善)
Base64 对图⽚进⾏编码的⽤于在于,有时需要使⽤⽂本形式来传输图⽚。除此之外,完全没必要使⽤ Base64 对图⽚进⾏额外处理。

URL 使⽤的百分号编码

在 URL 的字符串中,对⼀些不⽤于特殊⽤途的保留字符,使⽤百分号 “%” 为前缀进⾏单独编码,以避免出现解析错误。
例如,要在 http://hencoder.com/users 后⾯添加查询字符串,查询 name 为「隐秘&伟⼤」的⽤户,如果直接写成 http://hencoder.com/user/?name=隐秘&伟⼤
,”&” 符号就会被解析为分隔符号,因此需要对它进⾏转码,转码后的 URL 为 http://hencoder.com/user/?name=隐秘%26伟⼤
这种编码仅⽤于 URL,⽬的是避免解析错误的出现。

压缩与解压缩

含义
压缩:将数据使⽤更具有存储优势的编码算法进⾏编码。
解压缩:将压缩数据解码还原成原来的形式,以⽅便使⽤。
⽬的
减⼩数据占⽤的存储空间。

压缩是编码吗?
是。所谓编码,即把数据从⼀种形式转换为另⼀种形式。压缩过程属于编码过程,解压缩过程属于解码过程。
常⻅压缩算法
DEFLATE、JPEG、MP3 等。

图⽚与⾳频、视频编解码
将图像、⾳频、视频数据通过编码来转换成存档形式(编码),以及从存档形式转换回来(解码)。
⽬的:存储和压缩媒体数据(⼤多数媒体编码算法会压缩数据,但不是全部)。

Hash

定义
把任意数据转换成指定⼤⼩范围(通常很⼩,例如 256 字节以内)的数据。
作⽤
相当于从数据中提出摘要信息,因此最主要⽤途是数字指纹。
Hash 是把任意数据转变成一小段数据,以便使用这一小段数据作为原数据的数字指纹,降低甄别成本。

Hash 的实际⽤途
唯⼀性验证

例如 Java 中的 hashCode() ⽅法。

怎么重写 hashCode ⽅法?
把 equals() ⽅法中的每个⽤于判断相等的变量都放进 hashCode() 中,⼀起⽣成⼀个尽量不会碰撞的整数即可

为什么每次重写 equals() ⽅法都需要?因为你要把新的判断条件放进hashCode() 啊。

数据完整性验证

从⽹络上下载⽂件后,通过⽐对⽂件的 Hash 值(例如 MD5、SHA1),可以确认下载的⽂件是否有损坏。如果下载的⽂件 Hash 值和⽂件提供⽅给出的 Hash 值⼀致,则证明下载的⽂件是完好⽆损的。

快速查找

HashMap

隐私保护

当重要数据必须暴露的时候,有事可以选择暴露它的 Hash 值(例如 MD5),以保障原数据的安全。例如⽹站登录时,可以只保存⽤户密码的 Hash 值,在每次登录验证时只需要将输⼊的密码的 Hash 值和数据库中保存的 Hash 值作⽐对就好,⽹站⽆需知道⽤户的密码。这样,当⽹站数据失窃时,⽤户不会因为⾃⼰的密码被盗导致其他⽹站的安全也受到威胁。(加盐)
注意:这不属于加密。

Hash 是编码吗?
不是。 Hash 是单向过程,往往是不可逆的,⽆法进⾏逆向恢复操作,因此 Hash 不属于编码。
Hash 是加密吗?
不是。Hash 是单向过程,⽆法进⾏逆向回复操作,因此 Hash 不属于加密。(记住,MD5 不是加密!)1+6=7,7=?+?,推导不出来


加密
http://peiniwan.github.io/2024/04/b26286405067.html
作者
六月的雨
发布于
2024年4月6日
许可协议