由于Boss跟军方的特殊关系,我们又接到了军方的项目,这次呢是做一个即时通讯系统。虽然Boss跟军方很铁,拿到的项目款也很多,系统并不是很难,但是项目还是要好好做。无论如何,对系统的性能、友好性、安全性都还是要求很高的。30W也不是轻易就能搞到的。当然,也不算难,上周就已经发钱、发钱、发钱了!总共也就只不过花了2周而已。
在此首先要感谢一下园子里的大大大大神GG无私奉献出的GGtalk,Boss说了,过两天联系上了一定发一个 5K 的大大大红包!
今天呢主要想总结一波网络安全的问题。这也是军方最关心的。
一.网络安全的四种威胁
1.截获(比如抓包抓到了你传输的消息)
2.篡改(截获消息然后修改掉再发送,破坏消息的完整性)
3.伪造 (比如非法源站冒充合法源站给目的站发消息)
4.拒绝服务(向目的站发起大量的恶意连接或者发送大量无意义消息使得服务瘫痪)
二.两种加密方式
1.对称加密
对称加密就是加密秘钥和解密秘钥是相同的,其中具有代表性的就是DES算法。DES算法是公开的,但是秘钥是保密的,而保密性是由秘钥决定的。
2.非对称加密
非对称加密就是加密秘钥和解密秘钥是不一样的。其中公钥、加密算法、解密算法都是公开的,而私钥是保密的,非对称加密的保密性是由私钥来保障的。
三.防火墙
防火墙顾名思义就是一睹隔离危险的墙,能够阻止恶意的入侵或攻击,简而言之就是起到一个过滤的作用。其中分组过滤路由器能够对网络层和传输层的数据进行过滤。应用网关也称代理服务器,能够对应用层数据进行过滤。
四.即时通讯中的消息加密
3DES(或称为Triple DES)是非常常用的对称加密算法,是对DES算法的增强,它相当于是对每个数据块应用三次DES加密算法。GG即时通信系统中有Des3Encryption这个工具类,用以实现对该算法的封装。大家可以下载源码然后拿到该文件。
1.发送聊天消息
在得到聊天内容后,先进行简单的序列化,然后对序列化的结果进行3DES加密:
ChatBoxContent content = this.chatBoxSend.GetContent(); byte[] buff = CompactPropertySerializer.Default.Serialize(content); byte[] encrypted = buff; if (GlobalResourceManager.Des3Encryption != null) { encrypted = GlobalResourceManager.Des3Encryption.Encrypt(buff); }
然后,将加密的结果通过IRapidPassiveEngine发送出去。
2.处理接收到的聊天消息
接收到1对1的聊天消息或是群聊天消息后,首先要做的是解密,然后再反序列化:
byte[] decrypted = info; if (GlobalResourceManager.Des3Encryption != null) { decrypted = GlobalResourceManager.Des3Encryption.Decrypt(info); } ChatBoxContent content = CompactPropertySerializer.Default.Deserialize<ChatBoxContent>(decrypted, 0);
3.处理离线消息
离线消息是当接收者不再时,将该聊天消息暂存在服务器上,等接收者上线时,再发送给他。所以,离线消息的解密处理与普通聊天消息的处理是一样的。
if (informationType == InformationTypes.OfflineMessage) { byte[] bChatBoxContent = null; OfflineMessage msg = CompactPropertySerializer.Default.Deserialize<OfflineMessage>(info, 0); if (msg.InformationType == InformationTypes.Chat) //目前只处理离线的聊天消息 { sourceUserID = msg.SourceUserID; bChatBoxContent = msg.Information; byte[] decrypted = bChatBoxContent; if (GlobalResourceManager.Des3Encryption != null) { decrypted = GlobalResourceManager.Des3Encryption.Decrypt(bChatBoxContent); } ChatBoxContent content = CompactPropertySerializer.Default.Deserialize<ChatBoxContent>(decrypted, 0); } }
4.聊天记录如何处理?
根据上面的流程描述,我们可以知道,在服务端看到的聊天消息是经过加密的,而GGTalk在服务端有将聊天记录存储到数据库中的功能,因此,数据库中聊天内容那一列存储的数据也是加密的。在GG即时通信系统中,服务端不需要查看聊天消息的真正内容,所以,服务端不需要使用到Des3Encryption类。GG在客户端本地也有存储聊天记录(使用Sqlite),与服务器上数据库中存储的不一样的是,本地存储的是明文的。所以,在查看聊天记录时,要根据用户选择的是从本地查看还是从服务器查看来决定是否需要对数据进行解密:
byte[] decrypted = record.Content; if (this.skinRadioButton_Server.Checked) { if (GlobalResourceManager.Des3Encryption != null) { decrypted = GlobalResourceManager.Des3Encryption.Decrypt(decrypted); } } ChatBoxContent content = CompactPropertySerializer.Default.Deserialize<ChatBoxContent>(decrypted, 0);