1. Base64
定义:将二进制数据转换成由64个字符组成的字符串的编码算法。由A-Z,a-z,0-9,+,/,共64个字符组成的码表,所以叫base64。
原理:将原数据的二进制(8位)切割成6位(余下2位作为后面的前两位),然后转换为相应的索值引,根据这个值在base64的码表里找到对应的字符。如果字符不足6位用00补齐,没有数据时用=号填充。
缺陷:会导致数据变大。假如有3个字符占24位,那么Base64后就会24/6=4,变成4个字符,导致数据变大。
用途:让原数据具有字符串所具有的特性,如可以放在URL中传输,可以保存到文本文件,可以通过普通的聊天软件进行传输。
2. hash
定义:Hash算法可以将一个数据转换为一个标志,这个标志和源数据的每一个字节都有十分紧密的联系。hash是一个不可逆的过程。
经典算法:MD5,SHA1,SHA256等
-
实际用途:
数据完整性验证:如验证电影的完整性。
隐私保护:对用户密码进行hash后再进行存储,即使泄漏也不会泄漏用户原始密码
hashcode():hashCode是jdk根据对象的地址或者字符串计算出来的int类型的数值。所以重写equals方法时也要重写hashcode方法,否则继承了父类的hashcode值的话会导致2个本不相等的对象内存地址一样。
3. 加密
-
对称加密
- 原理:使用密钥和加密算法对数据进行转换,得到密文。使用密钥和解密算法对密文进行逆向转换,得到原数据。
-
经典算法:
- DES-密钥太短,易被破解,已被弃用。
- AES-密钥较长,目前主流使用。
缺点:密钥传输不便,传输过程中可能被窃取。
-
4. 非对称加密
原理:使用公钥对数据进行加密得到密文,使用私钥对密文进行解密得到原数据。(将公钥公开,对方使用公钥对数据进行加密,然后通过自己对私钥对对方加密过对数据进行解密)
特点:公钥公开,私钥保密。(公钥同样可以对私钥进行解密,但是不能互换,因为很多时候公钥是可以被计算出来的,或者是通过私钥计算出来对)
缺点:公钥公开,无法验证数据对合法性。虽然攻击者无法对数据进行解密,但是攻击者可以拿到公钥,然后伪造数据进行加密来欺骗公钥发行者。公钥发行者可以解密数据,但是无法对数据的来源安全性进行验证。
经典算法
- RAS:用来加密和签名
- DSA:专门设计用来签名,签名和验证速度很快。
- 延伸用途:数字签名
-
5. 数字签名
原理:原数据通过私钥进行加密得到签名数据,然后公开原数据和签名数据,通过公钥对签名数据进行解密得到原数据,然后对比公开的原数据与解密的原数据是否一致,一致则签名有效。
加密&签名及验证过程
- 使用对方公钥对原数据进行加密得到密文
- 对原数据进行hash,得到数据摘要(直接对数据签名的话会导致签名数据过大,效率低)
- 使用私钥对数据摘要进行加密得到加密后的数据摘要,也就是签名
- 将密文和签名合起来公开
- 对方通过自己对私钥对密文进行解密得到原数据
- 对方对得到的原数据进行hash得到数据摘要
- 对方使用发行方的公钥对签名进行解密得到数据摘要
- 对比2个数据摘要,一致,则验证成功,签名有效