在Retrofit的基础上结合OpenSSL实现服务器和客户端之间数据加密通信

安全加密C语言库OpenSSL,在Android中服务器和客户端之间的签名验证和数据加密通信等。

OpenSSL系列文章:

一、Android CMake轻松实现基于OpenSSL的HmacSHA1签名
二、Android CMake轻松实现基于OpenSSL的SHA(1-512)签名
三、Android CMake轻松实现基于OpenSSL的MD5信息摘要&异或加解密
四、Android CMake轻松实现基于OpenSSL的AES加解密
五、Android CMake轻松实现基于OpenSSL的RSA加解密
六、Android CMake轻松实现基于OpenSSL的RSA签名和验证
七、在Retrofit的基础上结合OpenSSL实现服务器和客户端之间数据加密通信

实现原理:

要实现服务器端和客户端数据加密通信,客户端可以通过RSA公钥加密,服务器端接收到客户端数据之后,用私钥进行解密就可以获取到客户端的明文数据。在数据传输的过程中,即使数据暴露了也没事,因为通过RSA公钥加密的数据,只能通过对应的私钥才能解密,而私钥只存在于服务器端,别人是无法获取的。但是上文中已经讲过了,当RSA加解密大量数据的时候,速度是很慢的,这在服务器和客户端之间通信是觉得不允许的。况且有的时候服务器端返回数据的时候也需要进行加密处理,而公钥是开放的,所以用私钥加密也就没有多大意义了。所以就有了RSA和AES结合,实现服务器端和客户端的安全,高效数据加密通信。

在Retrofit的基础上结合OpenSSL实现服务器和客户端之间数据加密通信_第1张图片
在Retrofit的基础上结合OpenSSL实现服务器和客户端之间数据加密通信_第2张图片
在Retrofit的基础上结合OpenSSL实现服务器和客户端之间数据加密通信_第3张图片
在Retrofit的基础上结合OpenSSL实现服务器和客户端之间数据加密通信_第4张图片
在Retrofit的基础上结合OpenSSL实现服务器和客户端之间数据加密通信_第5张图片

实现过程:

举个列子说明,在这只是为了说明服务器端和客户端加密通信。用户输入用户名和密码注册成功之后,返回用户ID和Token。在此过程中客户端需要把数据加密之后向服务端发起请求,同时,服务器端也要把数据进行加密之后返回客户端。客户端通过AES加密用户名和密码得到密文A,此时通过AES加密需要秘钥B,在这里我们随机生成;然后,用RSA公钥对此随机生成的秘钥B进行加密得到密文C。服务器端接收到的数据有用户名和密码的密文A、AES秘钥的密文C;接下来服务器端就可以通过RSA私钥解密C得到秘钥B,然后通过秘钥B进行AES解密A得到用户名和密码的明文。服务器端通过秘钥B对用户ID和Token进行加密后返回给客户端,客户端接收到数据后,通过秘钥B解密得到原始数据。如果客户端需要保存此用户ID的话,可通过AES加密后存储到SharedPreferences中,这里有一个不变的秘钥,可写死在.so文件中,提高反编译门槛。
结合Retrofit来使用的话,可在interceptor中统一封装加密过程;自定义解析器先解密后再进行数据解析。

下载代码运行,在控制台中输入“body”,将看到所有调试信息。欢迎star,fork,转载。

源码:https://github.com/GitPhoenix/OpenSSL

你可能感兴趣的:(在Retrofit的基础上结合OpenSSL实现服务器和客户端之间数据加密通信)