前后端分离项目接口数据加密的秘钥交换逻辑(RSA、AES)
在前后端分离的项目中,往往需要传输一些敏感的信息,例如密码、金额等,签名验签算法只能保证数据不被篡改,但是却无法对数据进行保密,如果用户输入的密码明文传输,就会被网络中的节点截获,虽然大部分网络运营商并不会去截取网络传输的内容,但是不能排除用户连接的WiFi网络是不是钓鱼网络,所以在传输敏感信息的时候需要加密,本文就讨论如何安全的让客户端和服务器交换秘钥。
加密算法的选择,RSA还是AES
涉及到加解密就涉及到加解密算法的选择,比较常见的是非对称加密RSA和对称加密AES,它们各有什么特点和选择呢?我们逐个说明
RSA非对称加密
RSA算法会生成两个秘钥,一个公钥,一个私钥,使用公钥加密的数据必须使用私钥解密,这样的好处是只有服务器有私钥,其他人无法解密。但是他有个非常致命的弱点,那就是加密内容的长度不能大于秘钥长度,以RSA 1024为例,PKCS#1建议的padding占用了11个字节,这样,128字节(1024bits)-减去11字节是117字节,也就是说我们使用RSA 1024最多只能加密117字节的内容,如果超过这个内容就会报错,可往往我们要传输的内容非常庞大,我们也不能无限制的增加秘钥长度。而且在移动设备上性能有限,并不适合大量加解密运算。所以我们还需AES。
AES对称加密
因为上述的RSA受到秘钥长度的加密限制,我们还需要AES加密,AES的优点是无论明文有多大它都可以加解密。但是缺点是它不区分私钥和公钥,密钥只有一个,任何知道秘钥的人都可以加解密信息。
RSA和AES结合使用取长补短
RSA和AES都有各自的优缺点,如果我们把他们结合使用就可以取长补短,我们可以使用RSA来保护AES的秘钥,这样可以保证只有双方知道AES的秘钥,并且AES可以加密任何长度的信息,这样就解决了它们各自的缺点。
秘钥交换逻辑
一、客户端向服务器端申请RSA公钥;服务器生成一个RSA秘钥对,将公钥发送给客户端。我们起名为「Server公钥」
二、客户端收到服务器给出的「Server公钥」,客户端生成自己的RSA秘钥对,我们起名为「Client公钥」,客户端使用「Server公钥」去加密自己的「Client公钥」,发送给服务器
三、服务器收到客户端的请求,使用「Server私钥」解密得到「Client公钥」
四、服务器生成一个「AES秘钥」,使用「Client公钥」加密「AES秘钥」发送给客户端
五、客户端使用「Client私钥」解密得到「AES秘钥」
后续双方的交互使用「AES秘钥」进行加解密,秘钥交换流程完成。

实例代码:
@Test
public void reaTest() {
//服务器端的
Map<Integer, String> serverKeyMap = RSAUtils.genKeyPair(2048);
//客户端的
Map<Integer, String> clientKeyMap = RSAUtils.genKeyPair(1024);
String clientPubKey = clientKeyMap.get(0);
try {
//客户端使用服务器公钥加密自己的公钥
String encrypt = RSAUtils.encrypt(clientPubKey, serverKeyMap.get(0));
//服务器端使用自己的私钥解密拿到客户端公钥
Assert.assertEquals(clientPubKey, RSAUtils.decrypt(encrypt, serverKeyMap.get(1)));
String AESkey = "aeskey123456";
//使用客户端的公钥加密AES的秘钥
String encryptAES = RSAUtils.encrypt(AESkey, clientPubKey);
//客户端用自己的私钥解密拿到AES的秘钥
Assert.assertEquals(AESkey, RSAUtils.decrypt(encryptAES, clientKeyMap.get(1)));
} catch (Exception ex) {
ex.printStackTrace();
Assert.assertNull(ex);
}
}
商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
相关推荐
猜你还喜欢这些内容,不妨试试阅读一下评论与留言
以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。- 2021-03-12 11:52:48
- Nanjing, Jiangsu, China
- 回复
- 2021-03-12 09:54:38
- Nanjing, Jiangsu, China
- 回复
- 2021-03-12 10:40:39
- Beijing, Beijing, China
- 回复
- 2021-03-12 10:46:23
- Nanjing, Jiangsu, China
- 回复
- 2021-03-12 11:06:49
- Beijing, Beijing, China
- 回复
- 2021-03-11 20:48:20
- Shanghai, Shanghai, China
- 回复
- 2021-03-11 20:56:32
- Beijing, Beijing, China
- 回复
- 2021-01-11 16:13:17
- Guangzhou, Guangdong, China
- 回复
- 2021-01-11 16:20:39
- Beijing, Beijing, China
- 回复
- 2020-12-16 17:17:50
- Guangzhou, Guangdong, China
- 回复
- 2020-12-16 16:59:10
- Guangzhou, Guangdong, China
- 回复
- 2020-06-30 17:24:22
- Shenzhen, Guangdong, China
- 回复
- 2020-06-30 17:43:51
- Beijing, Beijing, China
- 回复
- 2020-06-03 15:45:50
- Shenzhen, Guangdong, China
- 回复
- 2020-06-03 15:50:59
- Beijing, Beijing, China
- 回复
- 2020-06-03 15:53:12
- Shenzhen, Guangdong, China
- 回复
- 2020-06-03 16:03:24
- Beijing, Beijing, China
- 回复
- 2020-06-03 16:05:46
- Shenzhen, Guangdong, China
- 回复
- 2020-05-20 12:07:07
- Suzhou, Jiangsu, China
- 回复
- 2020-05-20 12:17:01
- Beijing, Beijing, China
- 回复
微信订阅号
扫码关注「任霏博客」微信订阅号- 你写得非常清晰明了,让我很容易理解你的观点。
- 感谢分享!拿走了~
- 您是说 UCClient 类接收来自Discuz的UCenter的消息吧,请求是来自 Discuz 的 UCenter吗?code 为 null 说明请求URL地址中没有 code 参数 (?code=xxx) ,确定是 UCenter 发起的请求吗?
- String code = request.getParameter("code"); code一直是null 这是为什么啊
- 你好,我想问一下如果是分析型的数据库要怎么制作docker镜像呢 是修改V008R003C002B0320版本号吗
- 可以的,我也正在开发分享的程序,可以邮件或群联系我都可以,关于页面里有联系方式:https://www.renfei.net/page/about 。
- 有破解软件的需要可以私下联系您吗?
- 您好,手机APP只是个客户端,用于数据呈现展示,数据均保存在服务器上,只留个APP没有任何用处,无能为力哦。
- 老哥 看你弄了这么多软件好厉害啊。 我有个软件 我买过几个小会员 没用几天 然后商家跑路了,软件服务器关闭了,连不上去 用不了。 你能做成一个打补丁版本可以本地用的么? 方便看下么?https://haodezhe.lanzouw.com/iD0f30h9joza 谢谢老哥!
- 您好,由于版权投诉和我国知识产权法的完善,我已经下架所有破解软件的下载链接了。
- 生花妙笔信手来 – 基于 Amazon SageMaker 使用 Grounded-SAM 加速电商广告素材生成 [1]
- github.renfei.net 不再完整代理 Github 页面改为代理指定文件
- 优雅的源代码管理(三):本地优雅的使用 Git Rebase 变基
- 优雅的源代码管理(二):Git 的工作原理
- 优雅的源代码管理(一):版本控制系统 VCS(Version Control System)与软件配置管理 SCM(Software Configuration Management)
- ChatGPT 开发商 OpenAI 买下极品域名 AI.com
- 火爆的 AI 人工智能 ChatGPT 国内注册教程、使用方式和收费标准
- 解决 SpringCloud 中 bootstrap.yml 不识别 @activatedProperties@ 参数
- Cron表达式书写教程搞定Linux、Spring、Quartz的定时任务
- 阿里云香港可用区C发生史诗级故障