加密类型
对称加密 - 共享秘钥加密
加密和解密使用相同的秘钥
常见对称加密算法有:DES、3DES、AES、RC5、RC6
缺点在于如何安全的把秘钥告知接受者让他用这个秘钥去解密
公钥加密 - 公开密钥加密
有一对秘钥,加密秘钥和解密秘钥
常见的公钥加密方法有:RSA
缺点是速度比对称加密慢
有一个问题是如何保证公钥的安全性,合法性
消息摘要 - 也称作散列函数或哈希函数
是一种不可逆算法
常见的有:MD5、SHA
https 加密实现
Https 就是网络请求的一套加密解密方案,可以自己模拟
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
// 1.[Server]生成一对密钥:公钥和私钥,我们称之为“publicKey”,“privateKey”
KeyPair keyPair = RSAUtil.generateRSAKeyPair();
System.out.println("[Service] gen publicKey and privateKey");
// 2.[Server]服务端将公钥(KeyPub)发送到客户端
PublicKey publicKey = keyPair.getPublic();
System.out.println("[Service] send publicKey to Client");
// 3.[Client]生成一个对称密钥 AES_KEY
final String AES_KEY = "boredream-aes-key";
System.out.println("[Client] gen AES_KEY ...... AES_KEY = " + AES_KEY);
// 4.[Client]使用公钥加密 AES_KEY 这时,AES_KEY 是安全的,因为只有服务端有私钥
byte[] aesKeyEncrypted = RSAUtil.encryptData(AES_KEY.getBytes(), publicKey);
System.out.println("[Client] encrypt AES_KEY by publicKey");
// 5.[Client]发送用key2加密后的信息及用KeyPub加密过的key2到服务端
System.out.println("[Client] send AES_KEY(encrypted by publicKey) to Service");
// 6.[Server]服务端使用KeyPri解密得到加密过的key2,得到真正的key2
PrivateKey privateKey = keyPair.getPrivate();
String aesKeyDecrypted = new String(RSAUtil.decryptData(aesKeyEncrypted, privateKey));
System.out.println("[Service] decrypt AES_KEY by privateKey ...... AES_KEY = " + aesKeyDecrypted);
System.out.println("==========================================");
// Client发送数据
final String dataFromClient = "i am client data";
final String encryptByClient = AESUtil.encrypt(dataFromClient, AES_KEY);
System.out.println("data from client = " + dataFromClient);
// Service接收数据
String decryptDataByService = AESUtil.decrypt(encryptByClient, aesKeyDecrypted);
System.out.println("service decrypt data = " + decryptDataByService);
运行结果
client发送的和service解析的数据一样,没问题~ 非对称加密效率较慢,不适合大数据传输,因此这里我们只用它加解密传输AES_KEY 这样因为私钥一直在服务端手里,所以传输过程中的AES_KEY很安全,无法破解~ 然后再利用这个AES_KEY加解密交互的数据,兼顾效率和安全~完美!