1. 程式人生 > >計算機網路——如何保證網路傳輸的安全性

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

# 一、前言   前幾天在面試時,被問到了如何保證網路資料傳輸的安全性的問題,當時對這一塊沒怎麼研究過,所以當時並沒有回答出來。所以,今天花了點時間,研究了一下這方面的內容。這篇部落格就來簡單說一說保證網路傳輸安全性的一些方式。
# 二、正文 ## 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``演算法(如``MD5``、``SHA-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``。雖然使用者可能可以通過一些手段,獲取到這個金鑰,但是過程是應該是非常複雜的,這就對竊取的技術要求非常高,所以在大部分情況下可以保證資料不被篡改。   說實話,對於使用者自己傳送虛假資料這個問題,由於我知識水平不足,一直無法想清楚,網上也沒有找到相關的資料,所以上面的描述都是基於我目前的理解。如果有了解這個問題相關知識,以及解決方案的,麻煩告知。
# 三、總結   以上就對資料的安全傳輸方案做了一個大致的介紹,歸根到底,就是基於資料隱祕性,報文完整性以及傳送方鑑別這三個問題,這三者缺一不可,只有全部解決,才能保證傳輸的可靠。   希望上面的內容對需要了解這一方面的人有所幫助,若存在錯誤或不足,也歡迎指正。
# 四、參考 - 《計算機網路——自頂向下方法(原書第七