在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求。尤其在一些政府部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据。我在最新的GG 4.5中,增加了对即时聊天消息进行加密的功能,但这一功能并不是强制的,可以通过开关来进行控制。本文就从 为什么要加密消息、不加密有什么风险开始说起,一直到把GG即时通信系统中实现加密消息的完整实现介绍清楚。
想要直接下载体验的朋友请点击:下载中心
一.为什么要加密即时聊天消息?
我们知道所有的消息在底层是以bytep[]进行传输的,如果文字聊天消息不加密,表示的意思是:直接将string使用utf-8或者unicode编码成byte[],然后,通过网络进行传送。如果在传送过程中的某个环节byte[]被恶意截取,则拦截者将byte[]使用utf-8或unicode进行解码,即可看到原来string的内容。这个过程如下图所示:
对于某些重要的消息而言,这样明文传输的方式实在是太危险了。
将聊天消息加密的意思是:将string使用utf-8或unicode编码成byte[]后,再做一次加密运算,得到一个新的byte[],然后将这个新的byte[]通过网络发送给对方;对方接收到byte[]后,先将其做解密运算,然后再用utf-8或unicode转为string。这个新过程如下图所示:
这样,即使在网络传送过程中的某个环节byte[]被恶意截取了,拦截者也无法正确的解析它,如此就规避了原来方案的风险。
二.3DES加密
3DES(或称为Triple DES)是非常常用的对称加密算法,是对DES算法的增强,它相当于是对每个数据块应用三次DES加密算法。
在GG即时通信系统 4.5的客户端源码中,Des3Encryption类是实现3DES算法的类,我是根据3DES的算法原理实现的,可能与某些标准的3DES算法实现细节不一样,但是,使用其进行3DES加密、解密是完全能正常运作的。
可以将Des3Encryption类作为一个工具类,从GG即时通信系统中抽离出来,复用在任何需要的地方。
三.加密/解密即时聊天消息
现在我们正式回到GG即时通信系统的文字聊天逻辑上面来,看看GG是怎么实现聊天消息的加密解密的。
1.准备工作
GG2014客户端项目中,增加了Des3Encryption.cs文件,实现了3DES算法。
GlobalResourceManager类增加了加密组件的设置:
private static Des3Encryption des3Encryption = new Des3Encryption("abcd123