天天看點

Socket開發架構之資料加密及完整性檢查

在前面兩篇介紹了Socket架構的設計思路以及資料傳輸方面的内容,整個架構的設計指導原則就是易于使用及安全性較好,可以用來從用戶端到服務端的資料安全傳輸,那麼實作這個目标就需要設計好消息的傳輸和資料加密的處理。本篇主要介紹如何利用Socket傳輸協定來實作資料加密和資料完整性校驗的處理,資料加密我們可以采用基于RSA非對稱加密的方式來實作,資料的完整性,我們可以對傳輸的内容進行MD5資料的校驗對比。

前面介紹過Socket的協定,除了起止辨別符外,整個内容是一個JSON的字元串内容,這種格式如下所示。

Socket開發架構之資料加密及完整性檢查

上述消息内容,我們可以通過開始辨別位和結束辨別位,抽取出一個完整的Socket消息,這樣我們對其中的JSON内容進行序列号就可以得到對應的實體類,我們定義實體類的内容如下所示。

Socket開發架構之資料加密及完整性檢查

我們把消息對象分為請求消息對象和應答消息對象,他們對應的是Request和Response的消息,也就是一個是發起的消息,一個是應答的消息。其中上圖的“承載的JSON内容就是我們另一個傳輸對象的JSON字元串,這樣我們通過這種字元串來傳輸不同對象的資訊,就構造出了一個通用的消息實體對象。

另外這些傳輸的消息對象,它本身可以繼承于一個實體類的基類,這樣友善我們對它們的統一處理,如下圖所示,就是一個通用的消息對象BaseMessage和其中JSON内容的對象關系圖,如AuthRequest是登陸驗證請求,AuthorRepsonse是登陸驗證的應答。

Socket開發架構之資料加密及完整性檢查

當然,我們整個Socket應用,可以派生出很多類似的Request和Response的消息對象,如下所示是部分消息的定義。

Socket開發架構之資料加密及完整性檢查

對于非對稱加密的處理,一般來說會有一些性能上的損失,不過我們考慮到如果是安全環境的資料傳輸處理的話,我們使用非對稱加密還是比較好的。

當然也有人建議采用非對稱加密部分内容,如雙方采用約定的對稱加密鍵,通過非對稱加密的方式來傳輸這個加密鍵,然後兩邊采用對稱加密算法來處理也是可以的。不過本架構主要介紹采用非對稱加密的方式來加密其中的JSON内容,其他部分正常的資訊不進行加密。

消息加密資料的傳輸前,我們需要交換算法的公鑰,也就是伺服器把自己公鑰給用戶端,用戶端收到伺服器的公鑰請求後,傳回用戶端的公鑰給伺服器,實作兩者的交換,以後雙方的消息都通過對方公鑰加密,把加密内容通過标準的Socket消息對象傳遞,這樣對方收到的加密内容,就可以通過自身的私鑰進行解密了。

那麼要在傳遞消息前處理這個公鑰交換的話,我們可以設計在伺服器接入一個新的用戶端連接配接後(在登入處理前),向用戶端發送伺服器的公鑰,用戶端受到伺服器的公鑰後,回應自己的公鑰資訊,并存儲伺服器的公鑰。這樣我們就可以在登陸的時候以及後面的消息傳遞過程中,使用對方公鑰進行加密資料,實作較好的安全性。

公鑰傳遞的過程如下圖所示,也就是用戶端發起連接配接伺服器請求後,由伺服器主動發送一個公鑰請求指令,用戶端收到後進行響應,發送自身的公鑰給伺服器,伺服器把用戶端的公鑰資訊存儲在對應的Socket對象上,以後所有消息都通過用戶端公鑰加密,然後發送給用戶端。

Socket開發架構之資料加密及完整性檢查

前面我們介紹過,我們所有的自定義Socket對象,都是繼承于一個BaseSocketClient這樣的基類對象,那麼我們隻需要在它的對象裡面增加幾個屬性幾個,一個是自己的公鑰、私鑰,一個是對方的公鑰資訊,如下所示。

Socket開發架構之資料加密及完整性檢查

在程式的啟動後,包括用戶端啟動,伺服器啟動,我們都需要建構好自己的公鑰私鑰資訊,如下代碼是産生對應的公鑰私鑰資訊,并存儲在屬性裡面。

例如在伺服器端,在用戶端Socket成功接入後,我們就給對應的用戶端發送公鑰請求消息,如下代碼所示。

那麼在用戶端,接收到服務端的消息後,對消息類型判斷,如果是公鑰請求,那麼我們需要進行回應,把自己的公鑰發給伺服器,否則就進行其他的業務處理了。

如果我們交換成功後,我們後續的消息,就可以通過RSA非對稱加密進行處理了,如下代碼所示。

而解密消息,則是上面代碼的逆過程,如下所示。

最後我們把加密後的内容組成一個待發送的Socket消息,包含起止辨別符,如下所示。

這樣就是我們需要發送的消息内容了,我們攔截内容,可以看到大概的内容如下所示。

Socket開發架構之資料加密及完整性檢查

上面紅色框的内容,必須使用原有的私鑰才能進行解密,也就是在網絡上,被誰攔截了,也無法進行解開,保證了資料的安全性。

 資料的完整性,我們可以通過消息内容的MD5值進行比對,實作檢查是否内容被篡改過,不過如果是采用了非對稱加密,這種 完整性檢查也可以忽略,不過我們可以保留它作為一個檢查處理。

是以在封裝資料的時候,就把内容部分MD5值計算出來,如下所示。

然後在獲得消息,并進行解密後(如果有),那麼在伺服器端計算一下MD5值,并和傳遞過來的MD5值進行比對,如果一緻則說明沒有被篡改過,如下代碼所示。

以上就是我在Socket開發架構裡面,實作傳輸資料的非對稱加密,以及資料完整性校驗的處理過程。