为什么要讲这些东西?
- 因为这些东西经常会被用到,但需要真正理解才能正确使用
- 相关词: MD5、SHA1、RSA、DSA、AES、BASE64、encodedURL、Unicode、UTF-8、GBK、IOS-8859-1…
密码学
- 起源:古代战争
- 移位式加密:密码棒
具备密码学的两个要素
- 加密算法:缠木棍后横着写
- 密钥:木棍的规格
- 替换式加密
- 加密算法:替换
- 密钥:码表
现代密码学
- 不仅可以用于文字加密,还可以用于二进制内容加密。
- 对于计算机非常有用,因为计算机的通信是喊话式的。
- 对称加密
- 非对称加密
对称加密
- 原理:使用密钥和加密算法对数据进 转换,得到的无意义数据即为密文;使用 密钥和解密算法对密文进行逆向转换,得到原数据。
- 经典算法:DES(因密钥太短被弃用),AES
- 什么是对称加密的密钥破解。关键是拿到原文和密文之后。算出来密钥。最优的加密算法的破解方法是穷举法。
非对称加密 重点内容
- 原理:使用公钥加密得到密文,使用私钥解密得到源数据。
场景
- RSA 算法是比较简单的非对称加密算法。但是还是比较复杂
- 延伸用途 : 签名和验证
- 公钥能不能解私钥呢?
- 比特币 椭圆曲线算法 ECDSA (公钥就是依靠私钥算出来的)
- 经典算法:RSA、DSA(专门用来签名和验证)
- 破解思路 拿到公钥之后,可以算出私钥就成功了。
签名和验证
- 私钥签名
- 公钥验证
- 数字签名和验证(反过来用)。我用我的私钥对欠条进行签名。你用我的公钥对他进行解密,就可以拿到欠条。任何人都无法造出能够被我的公钥去还原成明文的加密数据。
加密+签名
- 防止别人伪造信息来源。
密码学密钥和登录密码
- 密钥(key) 完美的契合的东西。是我在拿到你密文之后可以得到原文。
- 场景:用于加密和解密
- 目的:保证数据被盗时不会被人读懂
- 焦点:数据
- 是一个数学性非常强的东西。
- 密码(password) 通行口令,是一个身份的验证。密码没有任何数学相关的东西。
- 场景:用户进入网站或者游戏前的身份验证
- 焦点:身份
- 目的:数据提供方或应用服务方对账户拥有者数据的保护,保证「你是你」的时候才提供权限
Base64
将二进制数据转换成由64个字符组成的字符 的编码算法
a-z A-Z 0-9 + /
什么是二进制数据?
- 广义:所有计算机数据都是二进制数据
- 狭义: 非本数据即二进制数据
Base64的缺点
因为自身的原理,因此每次 Base64 编码之后,数据都会增加约1/3,所以会影响存
储和传输性能。
Base64的用途
- 将 进制数据扩充 储存和传输途径( 如可以把数据保存到文本文件、可以通过聊天对话框或 短信形式发送二进制数据、可以在 URL中加入 简单的二进制数据)
- 普通的字符在经过 Base64 编码后的结果会变得 眼不可读,因此可以适用于一定条件下的防偷窥(较少用)
Base58
- 去掉I l O 0 + /
- 用于加密货币的地址
URL encoding
在 URL 的字符中,对一些用于特殊用途的保留字符,使用百分号"%"为前缀进行单独编码,以避
免出现解析错误。
- 将URL中的保留字符使用%进行编码
- 目的;消除歧义,避免解析错误
压缩与解压缩
- 压缩:将数据使 具有存储优势的编码算法进 编码。
- 解压缩:将压缩数据解码还原成原来的形式,以 方便使用 。
- 常见的压缩算法;DEFLATE、JPEG、MP3
- 压缩属于编码吗?
编码即把数据从一种形式转换为另一 种形式。压缩过程属于编码过程,解压缩过程属于解码过程。
媒体数据的编解码
- 将图像、音频、视频数据通过编码来转换成存档形式(编码),以及从存档形式转换回来(解码)。
- 优秀的压缩算法,使用的空间更小,压缩速度更快。
- WebP>PNG/JPEG
序列化
把数据对象( 一般是内存中的,如JVM 中的对象)转换成字节序列的过程。对象在程序内存 的里存放形式是散乱的(存放在 同的内存区域、并且由引用进行连接),通过序 化可以把内存中的对象转换成一个字节序 ,从而使 用byte[]等形式进行本地存储或网络传输,在需要的时候重新组装(反序列化)来使用。
- 序列化:把数据对象( 一般是内存中的,如JVM 中的对象)转换成字节序列的过程。
- 反序列化:把字节序列重新转化为内存中的对象。
- 目的: 使内存中的对象可以被存储和传输
Hash 重点内容
Hash是单向的
定义:把任意数据转换成指定范围(通常很小,如256 字节以内)的数据。
- 作用:摘要、数字指纹
- 经典算法:MD5、SHA1、SHA256
- 实际用途:数据完整性
- hashCode和HashMap
- 为什么hashCode 和 equals 都要重写呢
- 指纹信息,快读判断你是你。
- 隐私保护
- 加盐:使彩虹表失效
MD5是不可逆加密
- 加盐:使彩虹表失效
签名与验证(完整)
字符集
- ASCII:128 个字符,1 字节
- ISO-8859-1:对 ASCII 进 扩充,1 字节
- Unicode:13 万个字符,多字节
- UTF-8:Unicode 的编码分支
- UTF-16 :Unicode 的编码分支
- GBK / GB2312 / GB18030:中国 研标准,多字节,字符集 + 编码