1. 编码解码 Encoding & Decoding
定义
- 编码
- 解码
2. 加密解密 Encryption & Decryption
2.1 古典密码学
2.1.1 移位式加密
比如密码棒(布条缠绕在木棒上面,然后书写正文,木棒充当密钥)
2.1.2 替换式加密
按照规则适用不同的文字来替换掉原来的文字来进行加密
2.2 现代密码学
- 可以加密任何二进制数据
- 非对称加密使得密码学有了更广泛的用途:数字签名
2.2.1 对称加密
-
定义
通信双方使用同一个密钥,使用加密算法配合密钥来加密;解密时使用解密算法(加密过程的完全逆过程)配合密钥来解密。
示意图如下
-
经典算法
- DES(56位密钥,密钥太短而逐渐被弃用)
- AES(128位、192位、256位密钥,目前最流行)
-
作用
加密通信,防止信息在不安全网络上被截获后,信息被人读取或篡改
-
缺点
不能在不安全网络上传输密钥,一旦密钥泄漏则加密通信失败
-
破解
5.1 思路
拿到一组或者多组原文-密文对;
设法找到一个密钥,可以将原文加密为密文,以及将密文解密为原文,即为破解成功
5.2 反破解
⼀种优秀的对称加密算法的标准是,让破解者找不到⽐穷举法(暴⼒破解法)更有效的破解⼿段,并且穷举法的破解时间⾜够⻓(例如数千年)。
2.2.2 非对称加密
-
原理
使用公钥对数据进行加密得到密文;使用私钥对数据进行解密得到原数据
-
非对称加密使用的是复杂的数学技巧,在古典密码学中没有对应的原型
-
使用非对称加密通信,可以在不可信网络上将双方的公钥传给对方,然后在发消息前,分别对消息使用对方的公钥来加密和使用自己的私钥进行签名,从而做到在不可信网络上的可靠密钥传播和加密通信
示意图如下
-
-
数字签名 Digital Signature
由于私钥和公钥互相可解,非对称加密还可以应用于数字签名技术
示意图如下
通常会对原数据hash以后对hash签名,然后附加在原数据的后面作为签名。这是为了让数据更小
示意图如下
-
经典算法
- RSA(可用于加密和签名)
- DSA(仅用于签名,但速度更快)
-
优缺点
- 优点:可以在不安全网络上传输密钥;
- 缺点:计算复杂,因此性能相比对称加密差很多;
-
破解
5.1 破解思路
- 非对称加密的公钥很容易获得,所以制造原文-密文对不困难;
- 非对称加密的解密的关键在于,找到一个正确的私钥;
- 由于非对称加密的自身特性,怎样通过公钥来推断出私钥通常是一种思路(例如RSA),但往往最佳手段仍然是穷举法。(和对称加密破解的区别在于,对称加密破解是不断尝试自己的新密钥是否可以将自己拿到的原文-密文对进行加密和解密,而非对称加密是不断尝试自己的新密钥是否和公钥互解)
-
反破解
和对称加密一样,非对称加密算法优秀的标准同样在于,让破解者找不到比穷举法更有效的破解手段,并且穷举法的破解时间足够长。
密码学密钥和登录密码
- 密钥 Key
- 场景:用于加密和解密
- 目的:保证数据被盗时不会被人读懂内容
- 焦点:数据
- 登录密码 password
- 场景:用户进入网站或游戏前的身份验证
- 目的:数据提供方或者应用服务方对账户拥有者数据的保护,保证[你是你]
- 焦点:身份
Base64
定义
将二进制数据转换成由64个支付组成的字符串的编码算法
算法
将原数据每6位,映射成Base64索引表中的字符,编排成的字符串(每个字符8位)
索引表
示例
- 把
Man进行Base64编码
- Base64的末尾补足
这里我理解的是,字符
A占8位,要编码成Base64,每6位映射成一个字符,那么取8和6的最小公倍数,即24
用途
- 将二进制数据扩充了储存和传输途径。例如可以把数据保存到文本文件,可以通过聊天对话框或者短信形式发送二进制数据,可以在URL中加入简单的二进制数据;
- 普通的字符串在经过Base64编码后的结果,会变得肉眼不可读,因此可以适用于一定条件下的防偷窥;
缺点
因为自身的原理(6位变8位),因此每次Base64编码之后,数据都会增大约1/3,所以会影响存储和传输性能。
常见问题:Base64加密图片会使得图片传输更安全和高效?
这个说法是错误的。原因如下
- Base64不是加密;
- Base64会导致数据增大1/3,降低网络性能,增大用户流量开销
- Base64对图片进行编码的用途在于,有时需要文本形式来传输图片。
变种:Base58
比特币使用的编码方式,去掉了数字0,字母大写O、I和字母小写l,以及+和/符号,用于比特币地址的表示。
改动的目的在于用户的便携性。去掉了难以区分的字符,使得Base58对于人工抄写更加方便;去掉了+、/符号以后也让大多数软件可以方便双击选取。
URL使用百分号编码
-
在URL的字符串中,对一些不用于特殊用途的保留字段,使用百分号
%为前缀进行单独编码,以避免解析错误例如
转码后为
压缩与解压缩 Compression & Decompression
定义
- 压缩:将数据使用更具有存储有时的编码算法进行编码
- 解压缩:将压缩数据解码还原成原来的形式,以方便使用
目的
减少数据占用的存储空间
常见问题:压缩是编码吗?
是。编码是把数据从一种形式转换为另一种形式。压缩过程属于编码过程,解压缩过程属于解码过程。
常见压缩算法
- DEFLATE
- JPEG
- MP3
图片与音视频编解码
定义
将图片、音视频数据通过编码转换成存档形式(编码),以及从存档形式转换回来(解码)
目的
存储和压缩媒体数据(大多数媒体编码算法会压缩数据,但不是全部)
序列化 Serialization
定义
把数据对象(一般是内存中的,比如JVM中的对象)转换成字节序列的过程。
对象在程序内存里的存放形式是散乱的(存放在不同的内存区域,并且由引用进行连接),通过序列化可以把内存中的对象转换成一个字节序列,从而使用byte[]等形式进行本地存储或者网络传输,在需要的时候重新组装(反序列化)来使用。
目的
让内存中的对象可以被存储和传输
常见问题:序列化是编码吗?
不是。
编码是把数据从一种数据格式转换成另一种数据格式;
序列化是把数据由内存中的对象(而不是某种具体的格式)转换成字节序列
哈希 Hash
定义
把任意数据转换成指定大小范围(通常很小,例如256字节以内)的数据
要求
- 碰撞率低
- 不易被破解
作用
相当于从数据中提出摘要信息,因此最主要的用途是数字指纹
Hash的实际用途
唯一性验证
比如Java中的hashCode()方法。重写hashCode方法:
把equals()方法中的每个用于判断相等的变量都放进hashCode()中,一起生成一个尽量不会碰撞的整数即可。
数据完整性验证
从网络下载文件后,通过比对文件的Hash值(例如MD5、SHA1),可以确认下载的文件是否有损坏。如果hash值一致,则证明下载的文件是完好无损的。
快速查找
HashMap
隐私保护
当重要数据必须暴露的时候,可以选择暴露它的Hash值(例如MD5),以保障原数据的安全。
比如网站登录时,可以只保存用户密码的Hash值,在每次登陆验证时只需要将输入的密码的Hash值和数据库中保存的hash值做比对就好,网站无需知道用户的密码。(这样,当网站数据失窃时,用户不会因为自己的密码被盗而导致其他网站的账户安全也受到威胁)
常见问题
Hash是编码吗?
不是。
Hash是单向过程,往往是不可逆的,无法进行逆向恢复操作,因此Hash不属于编码。
Hash是加密吗?
不是。
Hash是单向过程,无法进行逆向恢复操作,因此Hash不属于加密(MD5不是加密)
字符集 Charset
定义
一个由整数向现实世界中的文字符号的Map
分支
- ASCII
128个字符,1字节
-
ISO-8859-1
对ASCII进行扩充,1字节
-
Unicode
13万个字符,多字节
-
UTF-8
Unicode的编码分支
-
UTF-16
Unicode的编码分支
-
-
GBK / GB2312 / GB18030
中国自研标准,多字节,字符集 + 编码