1. 整体预览
- 整体思想为:
先使用AES对数据进行加密,再使用RSA对AES密钥进行加密。
- 至于为什么要使用这种方式呢?总结起来大致就是又安全速度又快。
1. RSA算法复杂,比较耗时,但比较安全
2. AES密钥固定,双方使用同一密钥,但速度快效率高
3. 所以用AES密钥加密数据,RSA加密AES密钥,形成混合加密
-
至于RSA和AES是什么?文章篇幅有限,还请大家到网上自行了解。
-
接下来是实现加密的具体流程。
- 请求:
- 客户端发起请求时,客户端使用随机生成的AES密钥对数据进行加密
- 使用服务器的 公钥 对AES密钥进行加密
- 将 加密后的数据和AES密钥 作为请求数据发送至服务器。
- 服务器收到请求后,使用服务器的 私钥 对加密过的AES密钥进行解密
- 再使用获取到的AES密钥对加密的数据进行解密。
- 以此保证客户端发送的数据只能被服务器解密进行处理。
- 响应:
- 服务器处理完数据后,将响应数据先使用随机生成(新)的AES密钥进行加密
- 使用服务器的 私钥 对AES密钥进行签名(签名算法为[ MD5withRSA ])
- 将 加密后的响应数据、AES密钥、签名 作为响应数据发送至客户端。
- 客户端收到响应后,先使用服务器的 公钥 对签名过的AES密钥进行验证
- 验签成功后再使用的AES密钥对加密的响应数据进行解密。
- 以此保证客户端收到的响应数据为合法服务器返回的。
2. 加密方式
- 加密算法: AES
- KEY长度: 16 * 8
- 加密模式: ECB
- 数据填充方式: PKCS5Padding
- 加密算法: RSA
- RSA位数: 2048
- 加密模式: ECB
- 数据填充方式: PKCS1Padding
3. 例
- 需要加密的数据:
{"staffUid": "zs"}
- 生成的AES密钥:
1@HLKMUCHkywdrel
- 数据加密后:
1qQL/+ufmvg124o5lc/IvzNVKsJniWomAaTrwWLX/4E=
- 服务器公钥:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnYnyTKWgBrrPeP/5D0w8Ts5aSiJKOgZ2TV9WkTDLwnE4nHpKxkE80uEP0jocJYboZ2wY+M9w4U01RBc7V5uqI4w46EoD0t3oBWkymKYsOfs0FLdPsqeGc7wUBkysJ3oGJcv3DRBXUrnJo3LJbxpOW/34CdGsLpfND6rAQFnR6oQNWUUskZYobsbhNSO7MGp0FSZNnXdz9ahS2QAHQWkycBZfqx6iLqA701LTsBrA4cAWTMxmlKrCSUCwZb85hrK7fCNkS8NMqpMLuN466TQgfZ/umFD38LwdiW2k/5glxNkhGsrjFmPzEnGqYhhIG1BJ3npdX/dhU69D3r91g8Hf4wIDAQAB
- 使用公钥加密后的AES密钥:
ihPxFWDmLPDw5VUXu4ClbFBZxy92ZKhp4E8ypl7uM/9gWJpKPMcMPk1GERPKmzD24Rx06v3ROuo5Dj1Lryc1XVjvvSC9Z6Jq7fmCtMUjQJW/7PdXgO9PQmId/3J2q5NtWPutyyuyTAz5J+tDPGKUlzGvO5vcxQVJXj4O3kBYZqZu8yVqbtx23zeXclQPmtmJYxNaZO84eJb1HymlngbmDKgDtH0+UyRM9fgksDDBbI6gfeRvSOdUmlD/oTqnnS0AFzucjnnNFeugeoRlE1sXnKuv47ePpJDLzgX+XHZjwhWhMLmNLZscE0IL1Ue4JUdRmzKc3Xb3SUu+/b6zBiHl6w==
- 发送的请求数据:
data: 1qQL/+ufmvg124o5lc/IvzNVKsJniWomAaTrwWLX/4E=
aesKey: ihPxFWDmLPDw5VUXu4ClbFBZxy92ZKhp4E8ypl7uM/9gWJpKPMcMPk1GERPKmzD24Rx06v3ROuo5Dj1Lryc1XVjvvSC9Z6Jq7fmCtMUjQJW/7PdXgO9PQmId/3J2q5NtWPutyyuyTAz5J+tDPGKUlzGvO5vcxQVJXj4O3kBYZqZu8yVqbtx23zeXclQPmtmJYxNaZO84eJb1HymlngbmDKgDtH0+UyRM9fgksDDBbI6gfeRvSOdUmlD/oTqnnS0AFzucjnnNFeugeoRlE1sXnKuv47ePpJDLzgX+XHZjwhWhMLmNLZscE0IL1Ue4JUdRmzKc3Xb3SUu+/b6zBiHl6w==
- 响应结果如下:
{
"code": 200,
"message": "操作成功",
"data": {
"data": "zKpHLUQ9NtvRizSUwdEtuM5pMOWf8qBGmGuW1ZYqGeQMw/00i4wwhXMCS0MoabdJ4zP6ETdZip02xq9sb/4EtRvLFWEqoVOs4MXtFV8QYiWsMxw1jbmRQmWCc8WBlqtQVkLyQfdQw51LIapbLtfrZGXhryqSHZhil6RUHU4RuXqwUPBMzlsobquhxKMNePJ6hGcEi5Z+JIcAeUNVWCP9hrfNPl/zYNrf4WWvmCW/tnBS2ffg34Unqho+iywEW+46bUfbgnE34LgeZqCNMG7MfyNY+DHueaWcwcPekNzzbdmawWUfs4miTUkh7Uz7Fm7+AdrmM/ZCgIqwene1LpYZVaJyHgLwlLX31gzXVeQxYpdshnbz+x6Rmf81xS+gysVrQywXVY13/QWz+mb9jmPqcS04vHf9sbA0pZ7UjUMVe+3mXK4mUdL11eq+Ti+ZvqnEIYKkOxKrOJWoQ1mKT86cMoYcS18Fu8+oTgRch2S1QZrEVApnoHBvjJXsgsl4PRIHWZZEPGhFAohK0fXQXr7JQQLee8ALpxVEd1RyFOevoBnO/Dt5MeKsmKNBK7HMQpxB",
"aesKey": "U85n3MtPMlmPTwLs",
"sign": "F6mQbV40E9SbuV/m+jIH+VDCqtxFOhzO10XLCGZoZ2b8We5a1BSXPum8S+7oAu/JaqfYi3fPFjzLHCVu+uWhSMhch3m1IRFOpZp7Pa04AawbUv0MuyrtyBqgNjLxJna5FhTX4NbOc4VaT1gvLO3wi4KWuZ5Ymp1ALWDW1QrmJkYzKasp6lsVyovYuj6GWESykdlmskzdI6iECSXtRatb3NpIe2vc9By8sXd8VytbcNlTHQHcidnuQNprYexp53IpbMRNma9zpqM+iqzX+PWUYlaSMLxeUEskLT3h/V4YhMj2vorrf1HM+nyGxO2gR+sVQnb8sy7caJy8c/2m12AlwA=="
}
}
- 响应解密后:
{
"code": 200,
"message": "操作成功",
"data": {
"id": 1,
"staffUid": "zs",
"staffPassword": null,
"staffName": "张三",
"staffCardId": "123",
"staffLoginName": "zszs",
"staffEmail": "abc@123.com",
"staffPhone": "13696365412",
"staffAdmin": 1,
"staffStatus": 0,
"staffDepartment": "IT",
"staffCode": "qwer",
"remark": null,
"createdBy": "system",
"createdTime": "2022-10-27 14:14:50",
"updatedBy": "zs",
"updatedTime": "2022-11-21 17:54:22",
"status": 0
}
}
4. 代码
前端
- 在何处使用?某个vue文件中,将参数通过方法加密后传入请求,待请求结束后,对响应数据使用对应的方法验签解密。
// 测试用例 此处没有逻辑关系
loginForm: {
staffUid: ''
}