现代密码学
- 可以加密任何二进制数据
- 非对称加密的出现使得密码学有了更广泛的用途:数字签名
对称加密
通信双方使用同一个密钥,对 原数据 使用加密算法配合上密钥加密生成 密文。解密时对 密文 使用加密过程的完全逆过程配合密钥来进行解密 生成原文。
经典算法
- DES(56为密钥,密钥太短而被逐渐弃用)
- AES(128位、192位、256位密钥,现在流行
对称加密的作用
加密通信,防止信息在不安全的网络上被截获后,信息被人读取或篡改
对称加密的破解
破解思路
- 拿到一组或多组原文-密文对
- 设法找到一个密钥,这个密钥可以将原文-密文对中的原文加密为密文,并可以将密文解密为原文,即成功破解
反破解
一个优秀算法的对称加密的标准是,让破解者找不到比穷举法更有效的破解手段,并且穷举法的破解时间总够长
对称加密的缺点
密钥泄漏:不能在不安全的网络上传输密钥,一旦密钥泄漏则加密通信变得毫无意义
非对称加密
使用 公钥 对数据使用 加密算法 得到密文;使用 私钥 对数据使用 同样的加密算法 得到原数据。
非对称加密使用的是复杂的数学技巧。
加密和解密使用同样的算法。
公钥和私钥间可以进行互解
数字签名
由于私钥和公钥互相可解,因此非对称加密还可以用于数字签名技术
通常会对原数据进行 hash 以后对 hash 值签名,然后附加在原数据后面作为签名。对原数据 hash 是为了让签名比较小。
数字签名和加密的不同
数字签名是使用自己的 私钥 签名,对方用 公钥 解密,以验证数据是否正确,所有人都能看到原数据。
加密是使用对方的 公钥 进行加密,对方的 私钥 解密,防止数据在传输过程中泄漏 ,只有通信双方可以看到原数据
经典算法
- RSA,可用于加密和签名
- DSA,仅用于签名,但速度更快
非对称加密的优缺点
-
优点:可以在不安全的网络上进行传输密钥
通信时,通信双方在不可信的网络上将公钥传给对方,然后在发消息前分别对消息使用对方的公钥来加密和使用自己的私钥来签名,做到不可信网络的可靠密钥传播和加密通信
-
缺点:计算复杂,因此性能相比对称加密差很多。
非对称加密的破解
破解思路
- 因为非对称加密的公钥很容以获取,制造原文-密文对没有困难,所以破解非对称加密的关键是:如何找到一个正确的私钥,可以解密所有经过公钥加密过的密文。找到这样的密钥即可成功破解
- 怎样通过公钥来推断出私钥通常是一种思路,但往往最佳手段是穷举法,和对称加密破解不同的是,对称加密是不断尝试自己的密钥是否可以将正确的原文-密文对进行加密和解密,而非对称加密是不断尝试自己的私钥是否和公钥可以互解。
反破解
和对称加密一样,非对称加密算法的优秀标准是让破解者找不到比穷举法更好的破解手段,并且穷觉法的破解时间足够长。
密码学密钥和登录密码
- 密钥(key 钥匙)
- 场景:用于加密和解密
- 目地:保证数据被盗时不会被人读懂内容
- 焦点:数据
- 登录密码(password 通行证)
- 场景:用于进入网站等的身份验证
- 目地:数据提供方或应用服务方对账户拥有者数据的保护,保证【你是你】的时候才提供权限
- 焦点:身份
Base64
将二进制数据转换成 由64个字符组成的编码算法 编码的 字符串
什么是二进制数据
- 广义:所有的计算机数据都是二进制数据
- 狭义:非文本数据即二进制数据
Base64 算法原理
将原数据每 6 位 对应成 Base64 索引表中的一个字符,所有的字符组合成一个字符字符串(每个字符 8 位)
Base64 的用途
- 将二进制数据扩充了储存和传输路径(例如可以把数据保存到文本文件、可以通过聊天对话框或短信形式发送二进制数据、可以在URL中加入简单的二进制数据
- 普通的字符串在经过 Base64 编码后的结果变的肉眼不可读,因此可以适用于一定条件下的防偷窥(较少用)
Base64 的缺点
由于自身的原理(6 位变 8 位),因此每次 Base64 编码后,数据都会增大约 1/3,所以会影响存储和传输性能。
Base64 加密图片传输更安全和高效?
首先Base64 不是加密,另外Base64由于上述缺点,降低了网路性能,增大用户,是更低效的手段
Base64 对图片进行编码是为了 有时需要使用 文本形式来传输图片。其他时候不需要对图片额外处理
变种:Base58
比特币的编码方式,去掉了Base64中的数字 “0”,字幕大写 O,字母大写 i,和字幕小写 L,以及 + 和 / 符号,用于比特币地址的表示。
Base58 对于 Base64 的改动,主要的目地在于用户的便捷性。由于去掉了难以区分的字符,使得 Base58 对于 人工抄写 更加方便。另外,去掉了 + / 符号后也让大多数软件可以方便的双击选取。
URL 使用的百分号编码
在 URL 的字符串中,对于一些不用于特殊用途的保留字符,使用百分号 “%” 为前缀进行单独编码,以避免出现解析错误
压缩和解压缩
含义
-
压缩:将数据使用更具存储优势的编码算法进行编码
-
解压缩:将压缩数据解码还原为原来的形式,以方便使用
编码:把数据从一种形式转换为另一种形式。并且编码后的数据可以解码为原来的数据
目地
减小数据占用的存储空间。
序列化
把数据对象(一般是内存中的)转换成字节序列的过程。对象在程序内存里的存放形式是散乱的,通过序列化可以把内存中的对象转换成一个字节序列,从而使用 byte[] 等进行性本地存储或网络传输,在需要的时候重新组装(反序列化)来使用
目地
让内存中的对象可以被储存和传输
和编码的区别
编码是把数据由一种格式转换成另一种格式;而序列化是把数据由内存中的对象(而不是某种具体的格式)转换为字节序列
Hash
定义
把任意数据转换成指定大小(通常很小,例如 256 字节以内)范围的数据
作用
相当于从数据中提出摘要信息,因此做主要的用途是数字指纹
Hash的实际用途
-
唯一性验证
-
数据完整性验证
对比下载后文件的 hash 值 和文件提供方给出的 hash 值,可以判断文件的完整性
-
快速查找
HashMap
-
隐私保护
当重要数据必须暴露的时候,有时可以选择暴露它的Hash值(例如 MD5),以保障原数据的安全。
例如网站登录时,只保存密码的Hash值,在登录验证时只要对比密码的Hash值可以确认用户,这样即使网站数据失窃,用户的密码也不会暴露
Hash 不是编码,Hash 是单向过程,往往是不可逆的,无法进行逆向恢复操作,因此 Hash 不属于编码
Hash 也不是加密,加密也是一个可逆的。
字符集
含义:一个由整数向现实世界中的文字符号的 Map
分支:
- ASCII:128 个字符,1 字节
- ISO-8859-1:对 ASCII 进?行行扩充,1 字节
- Unicode:13 万个字符,多字节
- UTF-8:Unicode 的编码分?支
- UTF-16 :Unicode 的编码分?支
- GBK / GB2312 / GB18030:中国?自研标准,多字节,字符集 + 编码