計算機網路——如何保證網路傳輸的安全性

特務依昂發表於2020-05-14

一、前言

  前幾天在面試時,被問到了如何保證網路資料傳輸的安全性的問題,當時對這一塊沒怎麼研究過,所以當時並沒有回答出來。所以,今天花了點時間,研究了一下這方面的內容。這篇部落格就來簡單說一說保證網路傳輸安全性的一些方式。


二、正文

2.1 安全傳輸需要解決的問題

  先有問題,才有解決方案,所以我們先來討論一下,網路傳輸中,需要解決哪些問題,才能保證安全。需要解決的問題大致有如下三個:

  1. 傳送方鑑別:確保接收到的資料,確實是由我們認為的那個人(或主機)傳送來的,而不是其他人以虛假身份傳送的;
  2. 報文完整性:確保我們接收到的報文就是傳送方傳送的初始報文,而沒有被第三方進行篡改;
  3. 資料機密性:確保報文即使被其他人截獲,也無法讀出其中的資訊,也就是要對資料加密;

  如果上面三個問題都得到了解決,那我們基本上就可以保證資料傳輸是安全的。下面我們就針對上面三個問題,來談一談解決方案。


2.2 非對稱加密與對稱加密

  在網路安全中,有兩個非常重要的概念,就是對稱加密非對稱加密,後面要談的所有方案,都離不開這兩種機制。所以,在瞭解具體解決問題的方案前,我們先來了解這兩個概念。

(一)對稱加密

  對稱加密的原理很簡單,就是資料的傳送方和接收方共享一個加密資料的金鑰,使用這個金鑰加密的資料,可以使用這個金鑰進行解密。而這個金鑰是隱私的,只有資料的傳送方和接收方知道,這也就意味著,其他人如果截獲了資料,由於這個資料使用了金鑰加密,而它沒有這個金鑰,所有無法解析出原始資料。

(二)非對稱加密

  非對稱加密系統中,參與加密解密的共有兩個——公鑰私鑰,使用私鑰加密的資料,只能用公鑰解密,而使用公鑰加密的資料,只能用私鑰解出。在非對稱加密系統中,每一臺主機都有自己的私鑰和公鑰,私鑰只有自己知道,而公鑰是公開的,可以讓所有主機知道。傳送方在傳送資料時,使用接收方的公鑰進行加密,而接收方使用自己的私鑰進行解密,即可完成隱私的資料傳輸。如果資料被其它人截獲,但是因為它沒有接收方的私鑰,所以無法解析出資料。

  非對稱加密能夠工作的一個前提是,必須確保傳送方拿到的公鑰,就是接收方的公鑰,而不是其他人傳送來的假公鑰,如果公鑰是假的,那麼這個機制也就失去了意義。在實際應用中,解決這個問題的方式就是,每一臺主機的公鑰和私鑰,都是由官方機構所分配的,這些機構被稱為認證中心CA)。CA在分配公鑰私鑰時,會嚴格地驗證身份,然後對身份進行繫結,而我們在獲取公鑰時,通過CA獲取,即可保證獲取到的公鑰就是接收方的。

  需要注意的一點是,非對稱加密的效率一般比較低,而對稱加密的效率相對較高。下面,開始正式討論解決上面三個問題的方案。


2.3 解決資料機密性

(一)非對稱加密

  1. 傳送方獲取接受方的公鑰,使用公鑰對需要傳送的資料進行加密,然後傳送;

  2. 接受方接收到後,使用自己的私鑰進行解密,解析出資料;

總結:因為只有接受方知道自己的私鑰,所以只有接受方能讀出資料。但是,非對稱加密的執行效率比較低,所以每一次資料傳輸都使用非對稱加密,響應速度將會比較慢


(二)非對稱加密 + 對稱加密(多次傳輸)

  為了解決非對稱加密效率較低的問題,我們可以使用對稱加密,但是同步對稱加密的金鑰,卻需要依賴於非對稱加密:

  1. 傳送方隨機生成一個金鑰,然後獲取接受方的公鑰,使用公鑰加密這個金鑰,傳送給接受方;

  2. 接收方接收到加密的金鑰後,使用自己的私鑰解析出金鑰,此時雙方就完成了金鑰同步;

  3. 之後雙方傳送的所有資料,都可以使用這個金鑰進行加密解密;

總結:由於私鑰只有接收方自己知道,所以這個金鑰不會被其他人截獲;同時使用對稱加密的速度,要高於非對稱加密,所以解決了上一個方案效率不高的問題;需要注意,一般金鑰都比較短,所以使用非對稱加密對金鑰進行加密,一般比直接加密資料更快,而且只需要進行一次,所以速度能夠顯著提高

  HTTPS依賴於SSL保證資料傳輸的安全性,而SSL就是使用類似機制。


(三)非對稱加密 + 對稱加密(單次傳輸)

  如果傳送方只是需要向接收方傳送一次資料,那先進行一次金鑰同步可能有些浪費時間,可以使用如下方案解決:

  1. 傳送方隨機生成一個金鑰,然後使用這個金鑰對資料進行加密;

  2. 傳送方使用接收方的公鑰對資料金鑰進行加密,然後將加密的資料和加密的金鑰傳送;

  3. 接收方首先使用自己的私鑰解析出金鑰,然後使用解析出的金鑰將資料解析出來;

總結:此方案適合於進行單次資料傳送,因為不需要進行金鑰的同步,而是將金鑰與資料一同傳送;同時,這個金鑰使用了接收方的公鑰加密,所以這個金鑰只有接收方自己能解析出來,而其他人解析不出金鑰,自然無法解析資料;


2.4 同時解決傳送方鑑別和報文完整性

  下面我們來說說解決傳送方鑑別和報文完整性的方案。有一個經典的方案能夠同時解決這兩個問題,其過程如下:

  1. 傳送方使用一個hash演算法(如MD5SHA-1),計算需要傳送的資料的hash值;

  2. 使用自己的私鑰,對計算出的hash值進行加密;

  3. 將原始資料和加密後的hash值傳送到接收方;

  4. 接收方使用傳送方的公鑰解析出加密後的hash值;

  5. 使用與傳送方相同的hash演算法,計算接收到的資料的hash值,與解析出的hash值進行比較;

  6. 若這兩個hash值一致,表示這個資料並沒有被篡改;

總結:

1、首先,hash值是用傳送方的私鑰加密,私鑰只有傳送方自己知道,如果接收方能夠使用傳送方的公鑰解密,那就說明這個資料就是預期中的傳送方發的,不可能是其他人發的,於是完成了傳送方鑑別;

2、接收方使用同樣的hash演算法,計算原始資料的hash值,如果這個hash值與解密後的hash值一致,則就能保證這個資料沒有被篡改;

上面兩步中,但凡有一步出現了錯誤,就認為這是一個髒資料;

  這個方案被稱為數字簽名。為什麼是計算出hash值,對hash值加密,而不是直接使用私鑰對資料加密?這是因為hash值比較小,加密解密比較快。


2.5 同時解決三個問題的方案

  上面提到的三個問題中,但凡有一個沒有解決,資料傳輸都是不可靠的,這裡我們就通過上面提到的幾個辦法,來同時解決三個問題。辦法很簡單,直接將上面解決方案進行整合即可:

  1. 首先,我們使用2.4中所提出的辦法,對資料進行處理,也就是計算hash,然後使用自己的私鑰加密hash

  2. 然後,將第一步計算出的hash與原始資料組合,使用2.3中提出的非對稱加密 + 對稱加密的方式,進行加密,加密之後再進行傳送,保證資料的隱祕性;

  3. 接收方接收到資料後,使用2.3中的過程對資料解密,得到原始資料和加密後的hash

  4. 使用2.4中的方式完成傳送方鑑別以及資料完整性校驗;

總結:上面的方式非常簡單,就是將我們之前提過的加密,以及2.4中的方案組合,以此來同時解決三個問題。這是一個非常常用的方案,比如安全的郵件傳輸協議的實現就使用了類似方案。


2.6 解決傳送方鑑別的其他方案

  假設接收方和傳送方有一個共享的金鑰,則可以使用以下方式進行身份鑑別:

  1. 傳送方向接收方傳送自己的身份,比如傳送一個“我是xxx”;

  2. 接收方為了驗證不是其他人傳送的虛假資料,向傳送方傳送一個隨機數,這個隨機數短時間內不會重複;

  3. 傳送方使用它們共享的金鑰,對這個隨機數加密後發回接收方;

  4. 接收方接收後,使用金鑰解密,如果確實是自己之前傳送出去的隨機數,即可確認對方身份;

  這裡存在的問題是如何讓接收方和傳送方有一個共享金鑰,其實就可以通過2.3節中第二個方案提到的,使用非對稱加密的方式同步金鑰。

總結:

1、由於金鑰只有傳送方和接收方知曉,所以如果傳送方能夠將加密後的隨機數發回,即可確認它的身份;

2、為什麼不直接使用加密後的身份資訊傳送,而是使用隨機數?因為如果這個加密後的身份資料被截獲,其他人不需要進行解密,只需要向接收方傳送這個加密後的身份,即可偽造自己的身份;


2.7 解決資料完整性的其他方案

  假設傳送方和接收方有一個共享的金鑰,則可以使用如下步驟保證資料完整性:

  1. 傳送方將原始資料與金鑰拼接,然後計算拼接後的hash值,將這個hash值與原始資料一同傳送;

  2. 接收方接收到後,同樣將原始資料和金鑰拼接,並計算hash值,然後與發來的hash值比較;

  3. hash值一致,可以保證這個資料沒有修改,否則就是被篡改的資料;

總結:由於拼接進原始資料的金鑰只有傳輸雙方知道,這個hash值只有它們雙方能計算出來,所以如果hash值不一致,即可認為資料是有問題的。

  這個方案叫報文鑑別碼,和前面提過的數字簽名有些類似,但是不同的是,這個方案中,並不需要對傳送的資料進行加密,只是計算hash作為鑑別碼,只要保證金鑰不被竊取,即可保證資料的完整性。


2.8 如何防止傳送方自己傳送虛假資料

  需要注意的一點是,我們上面所提出的方案,都是針對第三方侵入的解決方法,也就是防止除傳送方和接收方外,有其他人對資料傳輸做手腳。但是,如果傳送方自己篡改資料,或偽造資料,然後傳送,這應該怎麼解決呢?接收方如何能夠識別出接收到的資料就是原始資料,而不是傳送方自己篡改或傳送的虛假資料呢?這是我最近一直在想的問題。

  在這種情況下,我們需要考慮的是,傳送資料的使用者可以做到什麼程度?由於傳送資料的裝置就在傳送者手上,是不是意味著資料傳送過程中的金鑰等資訊,使用者是可以通過一些手段看到的?如果是可以,那上面所說的機制應該就沒法保證安全性了。但是,本人水平有限,並不清楚有戶對於傳送到自己裝置上的資料,可以竊取到什麼程度。希望瞭解這個問題的人能夠為我解答。

  當然,上面的機制可能沒辦法保證完全可靠,但是也有很大的效果。比如說報文鑑別碼就能解決使用者自己篡改自己的資料這個問題。如果使用者沒有獲取到金鑰,則它自然無法傳送虛假資料,因為沒有金鑰就沒有辦法計算出虛假資料的hash。雖然使用者可能可以通過一些手段,獲取到這個金鑰,但是過程是應該是非常複雜的,這就對竊取的技術要求非常高,所以在大部分情況下可以保證資料不被篡改。

  說實話,對於使用者自己傳送虛假資料這個問題,由於我知識水平不足,一直無法想清楚,網上也沒有找到相關的資料,所以上面的描述都是基於我目前的理解。如果有了解這個問題相關知識,以及解決方案的,麻煩告知。


三、總結

  以上就對資料的安全傳輸方案做了一個大致的介紹,歸根到底,就是基於資料隱祕性,報文完整性以及傳送方鑑別這三個問題,這三者缺一不可,只有全部解決,才能保證傳輸的可靠。

  希望上面的內容對需要了解這一方面的人有所幫助,若存在錯誤或不足,也歡迎指正。


四、參考

  • 《計算機網路——自頂向下方法(原書第七版)》

相關文章