在IM即时通许开发过程中,我们会直接使用TCP/UDP去做一个开发,我之前接触的一个是使用TCP的方式,在这个过程中,为了避免被人拦截了之后对数据进行查找与篡改,需要进行加密。
通过TCP直发IM消息,一般都流程是:
- 链接TCP链接,通过IP+端口直连的方式
- 发送握手数据,包括token等一些可辨识的消息,让该链接成为一个有效的链接,而不是非法的链接
- 然后就可以直接收到IM消息了
在这个过程中,为了对抗NAT超时,还需要一定间隔的发送心跳数据,保持链接的可用。
我们为了消息的安全性,即在消息的收到过程中,即时别人拦截了也可以做到无法被解密,我们使用的是一套对称&非对称的方式,非对称使用的是RSA,对称使用的是AES算法。在链接建立的过程中,因为只能是通过IP+端口,这个过程无法干预,在消息收发的时候,这个消息的加解密已经是使用过程了。所以我们是在消息发送握手数据阶段进行消息的数据保密处理工作。
- 在发送握手数据之前,端上通过RSA算法生成私钥与公钥
- 在握手数据中把公钥携带发送到服务器
- 服务器通过公钥,把本次TCP链接使用到的AES的加解秘钥加密返回回来。
- 端上通过私钥把本次心跳得到的AES key解密出来。
- 后续端上发送消息的时候,先试用该AES的key加密之后再发送数据,服务发送过来的其他消息,使用该AES key进行解密再处理。
这样就可以做到每一次链接都使用一个新的AES进行加解密,在传输AES的key的过程中使用了RSA算法保证不会被别人拦截到该Key,同样我们的每一条消息也不用通过RSA算法来加解密使得速度变慢。