在此首先要感謝一下園子里的大大大大神GG無(wú)私奉獻(xiàn)出的GGtalk,Boss說(shuō)了,過(guò)兩天聯(lián)系上了一定發(fā)一個(gè) 5K 的大大大紅包!
今天呢主要想總結(jié)一波網(wǎng)絡(luò)安全的問(wèn)題。這也是軍方最關(guān)心的。
一.網(wǎng)絡(luò)安全的四種威脅 
1.截獲(比如抓包抓到了你傳輸?shù)南ⅲ?/span>
2.篡改(截獲消息然后修改掉再發(fā)送,破壞消息的完整性)
3.偽造 (比如非法源站冒充合法源站給目的站發(fā)消息)
4.拒絕服務(wù)(向目的站發(fā)起大量的惡意連接或者發(fā)送大量無(wú)意義消息使得服務(wù)癱瘓)
二.兩種加密方式
1.對(duì)稱加密
對(duì)稱加密就是加密秘鑰和解密秘鑰是相同的,其中具有代表性的就是DES算法。DES算法是公開(kāi)的,但是秘鑰是保密的,而保密性是由秘鑰決定的。

2.非對(duì)稱加密
非對(duì)稱加密就是加密秘鑰和解密秘鑰是不一樣的。其中公鑰、加密算法、解密算法都是公開(kāi)的,而私鑰是保密的,非對(duì)稱加密的保密性是由私鑰來(lái)保障的。
三.防火墻

防火墻顧名思義就是一睹隔離危險(xiǎn)的墻,能夠阻止惡意的入侵或攻擊,簡(jiǎn)而言之就是起到一個(gè)過(guò)濾的作用。其中分組過(guò)濾路由器能夠?qū)W(wǎng)絡(luò)層和傳輸層的數(shù)據(jù)進(jìn)行過(guò)濾。應(yīng)用網(wǎng)關(guān)也稱代理服務(wù)器,能夠?qū)?yīng)用層數(shù)據(jù)進(jìn)行過(guò)濾。
四.即時(shí)通訊中的消息加密
3DES(或稱為Triple DES)是非常常用的對(duì)稱加密算法,是對(duì)DES算法的增強(qiáng),它相當(dāng)于是對(duì)每個(gè)數(shù)據(jù)塊應(yīng)用三次DES加密算法。GG即時(shí)通信系統(tǒng)中有Des3Encryption這個(gè)工具類,用以實(shí)現(xiàn)對(duì)該算法的封裝。大家可以下載源碼然后拿到該文件。
1.發(fā)送聊天消息
在得到聊天內(nèi)容后,先進(jìn)行簡(jiǎn)單的序列化,然后對(duì)序列化的結(jié)果進(jìn)行3DES加密:
ChatBoxContent content = this.chatBoxSend.GetContent(); byte[] buff = CompactPropertySerializer.Default.Serialize(content);
byte[] encrypted = buff;
if (GlobalResourceManager.Des3Encryption != null)
{
encrypted = GlobalResourceManager.Des3Encryption.Encrypt(buff);
}
然后,將加密的結(jié)果通過(guò)IRapidPassiveEngine發(fā)送出去。
2.處理接收到的聊天消息
接收到1對(duì)1的聊天消息或是群聊天消息后,首先要做的是解密,然后再反序列化:
byte[] decrypted = info;
if (GlobalResourceManager.Des3Encryption != null)
{
decrypted = GlobalResourceManager.Des3Encryption.Decrypt(info);
}
ChatBoxContent content = CompactPropertySerializer.Default.Deserialize<ChatBoxContent>(decrypted, 0);
3.處理離線消息
離線消息是當(dāng)接收者不再時(shí),將該聊天消息暫存在服務(wù)器上,等接收者上線時(shí),再發(fā)送給他。所以,離線消息的解密處理與普通聊天消息的處理是一樣的。
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.聊天記錄如何處理?
根據(jù)上面的流程描述,我們可以知道,在服務(wù)端看到的聊天消息是經(jīng)過(guò)加密的,而GGTalk在服務(wù)端有將聊天記錄存儲(chǔ)到數(shù)據(jù)庫(kù)中的功能,因此,數(shù)據(jù)庫(kù)中聊天內(nèi)容那一列存儲(chǔ)的數(shù)據(jù)也是加密的。在GG即時(shí)通信系統(tǒng)中,服務(wù)端不需要查看聊天消息的真正內(nèi)容,所以,服務(wù)端不需要使用到Des3Encryption類。GG在客戶端本地也有存儲(chǔ)聊天記錄(使用Sqlite),與服務(wù)器上數(shù)據(jù)庫(kù)中存儲(chǔ)的不一樣的是,本地存儲(chǔ)的是明文的。所以,在查看聊天記錄時(shí),要根據(jù)用戶選擇的是從本地查看還是從服務(wù)器查看來(lái)決定是否需要對(duì)數(shù)據(jù)進(jìn)行解密:
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);