一、前言
前幾天在面試時,被問到了如何保證網路資料傳輸的安全性的問題,當時對這一塊沒怎麼研究過,所以當時並沒有回答出來。所以,今天花了點時間,研究了一下這方面的內容。這篇部落格就來簡單說一說保證網路傳輸安全性的一些方式。
二、正文
2.1 安全傳輸需要解決的問題
先有問題,才有解決方案,所以我們先來討論一下,網路傳輸中,需要解決哪些問題,才能保證安全。需要解決的問題大致有如下三個:
- 傳送方鑑別:確保接收到的資料,確實是由我們認為的那個人(或主機)傳送來的,而不是其他人以虛假身份傳送的;
- 報文完整性:確保我們接收到的報文就是傳送方傳送的初始報文,而沒有被第三方進行篡改;
- 資料機密性:確保報文即使被其他人截獲,也無法讀出其中的資訊,也就是要對資料加密;
如果上面三個問題都得到了解決,那我們基本上就可以保證資料傳輸是安全的。下面我們就針對上面三個問題,來談一談解決方案。
2.2 非對稱加密與對稱加密
在網路安全中,有兩個非常重要的概念,就是對稱加密和非對稱加密,後面要談的所有方案,都離不開這兩種機制。所以,在瞭解具體解決問題的方案前,我們先來了解這兩個概念。
(一)對稱加密
對稱加密的原理很簡單,就是資料的傳送方和接收方共享一個加密資料的金鑰,使用這個金鑰加密的資料,可以使用這個金鑰進行解密。而這個金鑰是隱私的,只有資料的傳送方和接收方知道,這也就意味著,其他人如果截獲了資料,由於這個資料使用了金鑰加密,而它沒有這個金鑰,所有無法解析出原始資料。
(二)非對稱加密
非對稱加密系統中,參與加密解密的共有兩個——公鑰和私鑰,使用私鑰加密的資料,只能用公鑰解密,而使用公鑰加密的資料,只能用私鑰解出。在非對稱加密系統中,每一臺主機都有自己的私鑰和公鑰,私鑰只有自己知道,而公鑰是公開的,可以讓所有主機知道。傳送方在傳送資料時,使用接收方的公鑰進行加密,而接收方使用自己的私鑰進行解密,即可完成隱私的資料傳輸。如果資料被其它人截獲,但是因為它沒有接收方的私鑰,所以無法解析出資料。
非對稱加密能夠工作的一個前提是,必須確保傳送方拿到的公鑰,就是接收方的公鑰,而不是其他人傳送來的假公鑰,如果公鑰是假的,那麼這個機制也就失去了意義。在實際應用中,解決這個問題的方式就是,每一臺主機的公鑰和私鑰,都是由官方機構所分配的,這些機構被稱為認證中心(CA
)。CA
在分配公鑰私鑰時,會嚴格地驗證身份,然後對身份進行繫結,而我們在獲取公鑰時,通過CA
獲取,即可保證獲取到的公鑰就是接收方的。
需要注意的一點是,非對稱加密的效率一般比較低,而對稱加密的效率相對較高。下面,開始正式討論解決上面三個問題的方案。
2.3 解決資料機密性
(一)非對稱加密
-
傳送方獲取接受方的公鑰,使用公鑰對需要傳送的資料進行加密,然後傳送;
-
接受方接收到後,使用自己的私鑰進行解密,解析出資料;
總結:因為只有接受方知道自己的私鑰,所以只有接受方能讀出資料。但是,非對稱加密的執行效率比較低,所以每一次資料傳輸都使用非對稱加密,響應速度將會比較慢;
(二)非對稱加密 + 對稱加密(多次傳輸)
為了解決非對稱加密效率較低的問題,我們可以使用對稱加密,但是同步對稱加密的金鑰,卻需要依賴於非對稱加密:
-
傳送方隨機生成一個金鑰,然後獲取接受方的公鑰,使用公鑰加密這個金鑰,傳送給接受方;
-
接收方接收到加密的金鑰後,使用自己的私鑰解析出金鑰,此時雙方就完成了金鑰同步;
-
之後雙方傳送的所有資料,都可以使用這個金鑰進行加密解密;
總結:由於私鑰只有接收方自己知道,所以這個金鑰不會被其他人截獲;同時使用對稱加密的速度,要高於非對稱加密,所以解決了上一個方案效率不高的問題;需要注意,一般金鑰都比較短,所以使用非對稱加密對金鑰進行加密,一般比直接加密資料更快,而且只需要進行一次,所以速度能夠顯著提高。
HTTPS
依賴於SSL
保證資料傳輸的安全性,而SSL
就是使用類似機制。
(三)非對稱加密 + 對稱加密(單次傳輸)
如果傳送方只是需要向接收方傳送一次資料,那先進行一次金鑰同步可能有些浪費時間,可以使用如下方案解決:
-
傳送方隨機生成一個金鑰,然後使用這個金鑰對資料進行加密;
-
傳送方使用接收方的公鑰對資料金鑰進行加密,然後將加密的資料和加密的金鑰傳送;
-
接收方首先使用自己的私鑰解析出金鑰,然後使用解析出的金鑰將資料解析出來;
總結:此方案適合於進行單次資料傳送,因為不需要進行金鑰的同步,而是將金鑰與資料一同傳送;同時,這個金鑰使用了接收方的公鑰加密,所以這個金鑰只有接收方自己能解析出來,而其他人解析不出金鑰,自然無法解析資料;
2.4 同時解決傳送方鑑別和報文完整性
下面我們來說說解決傳送方鑑別和報文完整性的方案。有一個經典的方案能夠同時解決這兩個問題,其過程如下:
-
傳送方使用一個
hash
演算法(如MD5
、SHA-1
),計算需要傳送的資料的hash
值; -
使用自己的私鑰,對計算出的
hash
值進行加密; -
將原始資料和加密後的
hash
值傳送到接收方; -
接收方使用傳送方的公鑰解析出加密後的
hash
值; -
使用與傳送方相同的
hash
演算法,計算接收到的資料的hash
值,與解析出的hash
值進行比較; -
若這兩個
hash
值一致,表示這個資料並沒有被篡改;
總結:
1、首先,hash值是用傳送方的私鑰加密,私鑰只有傳送方自己知道,如果接收方能夠使用傳送方的公鑰解密,那就說明這個資料就是預期中的傳送方發的,不可能是其他人發的,於是完成了傳送方鑑別;
2、接收方使用同樣的hash演算法,計算原始資料的hash值,如果這個hash值與解密後的hash值一致,則就能保證這個資料沒有被篡改;
上面兩步中,但凡有一步出現了錯誤,就認為這是一個髒資料;
這個方案被稱為數字簽名。為什麼是計算出hash
值,對hash
值加密,而不是直接使用私鑰對資料加密?這是因為hash
值比較小,加密解密比較快。
2.5 同時解決三個問題的方案
上面提到的三個問題中,但凡有一個沒有解決,資料傳輸都是不可靠的,這裡我們就通過上面提到的幾個辦法,來同時解決三個問題。辦法很簡單,直接將上面解決方案進行整合即可:
-
首先,我們使用
2.4
中所提出的辦法,對資料進行處理,也就是計算hash
,然後使用自己的私鑰加密hash
; -
然後,將第一步計算出的
hash
與原始資料組合,使用2.3
中提出的非對稱加密 + 對稱加密的方式,進行加密,加密之後再進行傳送,保證資料的隱祕性; -
接收方接收到資料後,使用
2.3
中的過程對資料解密,得到原始資料和加密後的hash
; -
使用
2.4
中的方式完成傳送方鑑別以及資料完整性校驗;
總結:上面的方式非常簡單,就是將我們之前提過的加密,以及2.4中的方案組合,以此來同時解決三個問題。這是一個非常常用的方案,比如安全的郵件傳輸協議的實現就使用了類似方案。
2.6 解決傳送方鑑別的其他方案
假設接收方和傳送方有一個共享的金鑰,則可以使用以下方式進行身份鑑別:
-
傳送方向接收方傳送自己的身份,比如傳送一個“我是xxx”;
-
接收方為了驗證不是其他人傳送的虛假資料,向傳送方傳送一個隨機數,這個隨機數短時間內不會重複;
-
傳送方使用它們共享的金鑰,對這個隨機數加密後發回接收方;
-
接收方接收後,使用金鑰解密,如果確實是自己之前傳送出去的隨機數,即可確認對方身份;
這裡存在的問題是如何讓接收方和傳送方有一個共享金鑰,其實就可以通過2.3
節中第二個方案提到的,使用非對稱加密的方式同步金鑰。
總結:
1、由於金鑰只有傳送方和接收方知曉,所以如果傳送方能夠將加密後的隨機數發回,即可確認它的身份;
2、為什麼不直接使用加密後的身份資訊傳送,而是使用隨機數?因為如果這個加密後的身份資料被截獲,其他人不需要進行解密,只需要向接收方傳送這個加密後的身份,即可偽造自己的身份;
2.7 解決資料完整性的其他方案
假設傳送方和接收方有一個共享的金鑰,則可以使用如下步驟保證資料完整性:
-
傳送方將原始資料與金鑰拼接,然後計算拼接後的
hash
值,將這個hash
值與原始資料一同傳送; -
接收方接收到後,同樣將原始資料和金鑰拼接,並計算
hash
值,然後與發來的hash
值比較; -
若
hash
值一致,可以保證這個資料沒有修改,否則就是被篡改的資料;
總結:由於拼接進原始資料的金鑰只有傳輸雙方知道,這個hash值只有它們雙方能計算出來,所以如果hash值不一致,即可認為資料是有問題的。
這個方案叫報文鑑別碼,和前面提過的數字簽名有些類似,但是不同的是,這個方案中,並不需要對傳送的資料進行加密,只是計算hash
作為鑑別碼,只要保證金鑰不被竊取,即可保證資料的完整性。
2.8 如何防止傳送方自己傳送虛假資料
需要注意的一點是,我們上面所提出的方案,都是針對第三方侵入的解決方法,也就是防止除傳送方和接收方外,有其他人對資料傳輸做手腳。但是,如果傳送方自己篡改資料,或偽造資料,然後傳送,這應該怎麼解決呢?接收方如何能夠識別出接收到的資料就是原始資料,而不是傳送方自己篡改或傳送的虛假資料呢?這是我最近一直在想的問題。
在這種情況下,我們需要考慮的是,傳送資料的使用者可以做到什麼程度?由於傳送資料的裝置就在傳送者手上,是不是意味著資料傳送過程中的金鑰等資訊,使用者是可以通過一些手段看到的?如果是可以,那上面所說的機制應該就沒法保證安全性了。但是,本人水平有限,並不清楚有戶對於傳送到自己裝置上的資料,可以竊取到什麼程度。希望瞭解這個問題的人能夠為我解答。
當然,上面的機制可能沒辦法保證完全可靠,但是也有很大的效果。比如說報文鑑別碼就能解決使用者自己篡改自己的資料這個問題。如果使用者沒有獲取到金鑰,則它自然無法傳送虛假資料,因為沒有金鑰就沒有辦法計算出虛假資料的hash
。雖然使用者可能可以通過一些手段,獲取到這個金鑰,但是過程是應該是非常複雜的,這就對竊取的技術要求非常高,所以在大部分情況下可以保證資料不被篡改。
說實話,對於使用者自己傳送虛假資料這個問題,由於我知識水平不足,一直無法想清楚,網上也沒有找到相關的資料,所以上面的描述都是基於我目前的理解。如果有了解這個問題相關知識,以及解決方案的,麻煩告知。
三、總結
以上就對資料的安全傳輸方案做了一個大致的介紹,歸根到底,就是基於資料隱祕性,報文完整性以及傳送方鑑別這三個問題,這三者缺一不可,只有全部解決,才能保證傳輸的可靠。
希望上面的內容對需要了解這一方面的人有所幫助,若存在錯誤或不足,也歡迎指正。
四、參考
- 《計算機網路——自頂向下方法(原書第七版)》