RSA与AES在数据安全传输中的应用方式

RSA与AES在数据安全传输中的应用方式

数据安全传输在日常开发中常常被忽略,以至于自问怎么样保证数据从浏览器传输到服务器端的安全性?我的认识还只停留在使用HTTPS协议这上。同样在对称加密、非对称加密算法也只停留在概念阶段,也从未使用过。正好在毕业设计中遇上了这个问题,下面将通过时序图+代码的方式来进行说明和展示。

本文的思路参考自《结合RSA,AES128,MD5—移动端与服务端在通信层的加密处理》,感谢该文作者的分享。

本文将在该文章的思路上,完善开发者所关注的前后端交互流程,并附上简单的示例代码进行说明。这里就不再介绍RSA算法和AES算法了,并省去了加签处理步骤。

1 时序图

下面通过一幅时序图来对RSA与AES如何运用在数据传输中进行说明。
RSA与AES在数据安全传输中的应用方式_第1张图片
从交互对象上分为:客户端(也就是浏览器)、服务器端、Redis,在这个流程中Redis的目仅仅是为存储公钥(pubKey)和私钥(pvtKey),所以不使用Redis也是可以的。

处理流程上分为:获取服务器公钥、加密数据、解密数据。接下来,将按流程逐步将时序图进行分解说明。

1.1 获取服务器公钥

客户端所需要做的第一步就是获取服务器公钥(pubKey):
RSA与AES在数据安全传输中的应用方式_第2张图片
服务器端会为每一个客户端生成一对pubKey和pvtKey,每个用户使用独立的密钥对更加安全。然后将密钥对缓存到Redis当中,并将pubKey返回给客户端,客户端将使用pubKey加密关键数据(对称加密密钥AESKey)。

1.2 加密数据

第二步便是加密客户端即将发送给服务器端的数据信息:
RSA与AES在数据安全传输中的应用方式_第3张图片
客户端首先生成一个随机的字符串(16位)作为AES对称加密所用的AESKey。

使用AESKey,通过AES对称加密算法将客户端需要发送给服务器端的data(Json字符串)加密为encryptedData。

使用1.1中获得的pubKey,通过RSA非对称加密算法将AESKey加密为RSAKey。

这样便完成了数据加密步骤。将上述数据封装为以下形式:

{
    "key": RSAKey,
    "value": encryptedData
}

1.3 解密数据

服务器端只需要解密客户端发送过来的key-value就能正常的进行处理了:
RSA与AES在数据安全传输中的应用方式_第4张图片
服务器端首先取出Redis中存储的pvtKey,通过pvtKey解密RSAKey,便能得到AESKey。再通过AESKey解密encryptedData,便能得到明文数据了。

对明文数据处理完成后,边能将响应结果发送回客户端。

当然这里服务器端没有对自己的响应数据进行加密了。如果还需要对相应数据加密,那么只需要在第一次完成上述流程后,将AESKey存储到Redis中,后续的通信过程双方都只需要使用AESKey加解密了,因为密钥(AESKey)已经完成了交换。

2 代码

代码通过Client类、Server类、Redis类分别模拟了时序图中的三个交互对象,并将RSA和AES的算法的加解密过程(使用Hutool,非常棒的开源项目)封装到了RSAUtil和AESUtil工具类中,代码就不贴在这里了,欢迎点击这个链接:github项目地址进行查看。

3 最后

使用这种方式,其实网站的数据传输也并非一定安全,因为在步骤1.1中,需要向服务器获取公钥,后续的所有加解密的处理都是简历在服务器端可信的基础之上,如果用户遭受中间人攻击,那么同样不安全。所以还需要额外为域名部署HTTPS协议,以证明用户正在使用的网站是真实的、可信的。

你可能感兴趣的:(RSA,AES,Web安全,Web安全)