計算機網絡中的兩個節點希望安全通信,需要具有以下的特性
- 機密性。這說明通信的內容只有發送方和接收方纔能知道,竊聽者截獲報文後也無法理解報文的內容
- 報文完整性。發送方和接收方希望報文在傳輸過程中沒有被篡改
- 端點鑑別。發送方和接收方都能確定另一方的確有其聲稱的身份
- 運行安全性。能夠連接到互聯網的主機,都希望不會因爲惡意者的攻擊而癱瘓
密碼學原理
要達到安全通信中的機密性,就需要對傳輸的報文加密。被加密的報文稱爲 明文(plaintext,clear text);使用 加密算法(encryption algorithm) 可以加密明文得到 密文(ciphertext);在加密的過程中需要使用 密鑰(key);如果需要把密文重新轉成明文,就需要用到 解密算法(decryption algorithm);類似的,解密算法也需要解密密鑰。在對稱加密中,加密密鑰和解密密鑰是相同的;而在公開密鑰系統中,加密和解密的密鑰是不同的,且加密密鑰是公開的
凱撒密碼
凱撒密碼是以羅馬共和國執政官尤里烏斯·凱撒的名字命名的一種加密技術,原理非常簡單:對於一個明文輸入,將明文中的字母替換成另一個字母。每一種替換規則就是一個密鑰
凱撒密碼有一個重要缺陷,即相同的明文字母對應同一個密文字母,因此可以用統計分析的方式去破解密碼。比如英文中字母 e 出現的頻率大約是 13%,而字母 t 出現的頻率是 19%,而且英文單詞 the 出現的概率也特別高,這樣就能統計密文中字母或單詞出現的頻率來估算加密的密鑰
如果嘗試攻擊凱撒密碼,根據攻擊者所擁有的信息,可以把攻擊方法分爲下面 3 種
- 唯密文攻擊:攻擊者只知道密文,這時可以使用對字母頻率的統計分析來攻擊凱撒密碼
- 已知明文攻擊:攻擊者知道明文中一定會出現一些單詞,根據這些單詞的密文來攻擊凱撒密碼
- 選擇明文攻擊:攻擊者能夠得到一些明文對應的密文,從而展開攻擊。這與已知明文攻擊有些類似
針對這幾種攻擊,後來發展出了 多碼代替密碼(polyalphabetic encryption) 技術,這種技術嘗試用多個凱撒密碼密鑰去加密一段密文
塊密碼
塊密碼 是對稱加密的一種方法,它將明文分爲 k 比特的塊,將每一個塊映射爲另一個塊,映射的結果就是密文,每一種映射就是一個密鑰。對於 k 比特的塊,共有 (2^k)!
種密鑰。當 k 的值比較大時(如 k = 64),保存 (2^k)!
個映射關係的成本太高了,因此實際應用中會使用函數模擬的方式生成隨機排列表,使得輸入一個 k 比特的明文得到 k 比特密文,這個函數必須要有一個性質:明文的每一個比特位都能影響輸出結果
目前 DES(Data Encryption Standard)、3DES 和 AES(Advanced Encryption Standard)都是塊密碼
實際上塊密碼與凱撒密碼有些相似的地方,他們都是把明文替換成密文的方式,因此也會具有與凱撒密碼相同的弱點,即相同的明文得到相同的密文。消除這個弱點的方式是在加密的過程中引入隨機性。
一個可行的方法是:將明文分爲 k 比特的明文快,對於每個明文快 mi,產生一個隨機的 k 比特塊 ri,那麼密文 ci = Ks(mi xor ri)
,其中 xor 是異或操作,Ks 是以 s 爲密鑰的加密函數。由於每一個明文快對應的隨機塊 ri 是不一樣的,因此相同的明文塊會產生不同的密文塊
這個方法也有一個問題:傳輸的數據量變成了原來的兩倍。因爲現在不僅僅需要傳輸密文,還需要傳輸隨機塊 ri。爲了解決這個問題,產生了一種稱作 密碼塊鏈接(Cipher Block Chaining,CBC) 的技術。它的原理是:僅僅產生第一個明文塊的隨機塊,加密得到第一個密文塊後,這個密文塊就作爲下一個明文塊的隨機塊。
公開密鑰加密
上面的凱撒密碼和塊密碼都是被稱爲對稱加密的技術,這意味着加密方和解密方需要使用同一個密鑰來加密和解密。對稱加密引入了一個新的問題:雙方該如何安全的共享密鑰。在現代的計算機網絡中,發送方和接收方是無法在線下見面並確定密鑰的
爲了解決這個問題,一種被稱爲 公開密鑰加密 的技術被髮明出來。公開密鑰加密技術使用兩個密鑰,一個被稱爲 公鑰(public key),一個被稱爲 私鑰(private key)。公鑰是公開的,並且每個人都能知道,而私鑰需要保密。公開密鑰加密算法有這樣一個性質:使用公鑰加密明文得到密文,可以使用私鑰解密;使用私鑰加密明文得到密文,可以使用公鑰解密。因此當兩個人,比如 Bob 和 Alice 想要通信時,Bob 先獲取到 Alice 的公鑰,使用公鑰加密後把密文發送給 Alice,Alice 得到密文後就能用私鑰解密得到明文了;同理,Alice 也能獲取到 Bob 的公鑰並加密明文,Bob 用自己的私鑰解密。當攻擊者截取到密文後,因爲沒有私鑰,也就不能解密密文了。
公開密鑰加密算法需要面臨兩個問題
- 攻擊者可以使用選擇明文攻擊。因爲公鑰和加密算法是衆所周知的,攻擊者可以用任意明文生成密文,並以此展開攻擊,公開密鑰加密必須能防止攻擊者以猜出私鑰
- 接收方無法得知密文是誰發送的。在共享密鑰中,接收方收到密文後就能知道發送方是誰了,因爲只有發送方能有密鑰去加密。現在因爲公鑰和加密算法是公開的,任何一個人都能向接收方發送一段密文,因此接收方必須使用其他方法去確定發送方的身份
RSA 是現在比較流行的公開密鑰加密算法,它基於的原理是目前沒有高效的算法可以對大整數做因數分解。它的工作方式我就不說了,因爲我也看不懂
報文完整性和數字簽名
Bob 在收到一個來自於聲稱自己是 Alice 的人的報文時,他需要做下面兩件事
- 確定報文確實來自於 Alice
- 確定報文在傳輸過程中沒有收到篡改
在討論這兩點之前,我們還需要學習有關 密碼散列函數 的知識
密碼散列函數
密碼散列函數以 m 作爲輸入,可以得到一個固定長度的輸出字符串,而且必須要求找到任意兩個不同的報文 x 和 y,計算 H(x) = H(y) 在計算上是不可能的,這也表明,得到散列函數的輸出後,反推輸入是不可能的。目前常用的散列函數有 MD5、SHA-1
有了散列函數,就能在接收端鑑定報文在傳輸過程中有沒有被篡改了。比如 Alice 向 Bob 發送報文
- Alice 和 Bob 之間先生成一個 鑑別密鑰(authentication key) s
- Alice 生成報文 m,使用散列函數計算得到 H(m + s),H(m+s) 也叫做 報文鑑別碼(Message Authentication Code,MAC)
- Alice 把 m 和 H(m + s) 合併成擴展報文 (m, H(m + s)) 發送給 Bob
- Bob 收到擴展報文後,同樣去計算 H(m + s),如果與收到的 MAC 一致,說明報文沒有被篡改
鑑別密鑰的作用是防止中間人在捕獲到報文 m 後,篡改報文並重名生成 H(m),這樣接收方就還是無法確定報文是否被篡改
目前最流行的 MAC 標準是 HMAC
數字簽名
數字簽名是一種同時使用了散列函數和非對稱加密的技術。當 Bob 需要對一個報文 m 做簽名,他首先用散列函數對報文計算指紋 H(m),然後用自己的私鑰和指紋作爲輸入,得到的輸出就是數字簽名。任何人如果想證明 Bob 的確對報文 m 做過簽名,只需要先計算報文的指紋,然後使用 Bob 的公鑰對簽名進行解密,如果得到的指紋和結果是一致的,就說明了 Bob 的確簽署了報文
上面的數字簽名技術還有一個問題沒解決:如果爲每個人分配私鑰和公鑰。這個問題需要由 認證中心(Certification Authority,CA) 來負責。CA 爲每個需要被認證的實體生成一個證書,證書內有公鑰、私鑰和擁有者的全局唯一標識符,大家只要信任 CA 就能信賴數字簽名技術了
PGP
PGP 是一個電子郵件加密方案,全稱是 Pretty Good Privacy。它融合了 RSA 加密、對稱加密、數字簽名技術,提供了對電子郵件的機密性、發送方鑑別和保溫完整性驗證功能,它的基本原理是這樣的(假設 Alice 要向 Bob 發送郵件)
- Alice 使用散列函數得到報文摘要
- Alice 使用自己的私鑰加密摘要得到報文簽名,將數字簽名和報文級聯成爲新報文
- Alice 隨機生成一個會話密鑰,利用會話密鑰加密新報文得到密文,用 Bob 的公鑰加密會話密鑰
- Alice 將報文簽名、密文、加密後的會話密鑰發送給 Bob
到此 Alice 的工作就結束了。Bob 在接收到 Alice 發來的數據後,做如下操作
- Bob 用自己的私鑰解密會話密鑰
- Bob 用會話密鑰解密密文,得到報文和數字簽名
- Bob 使用散列函數得到報文摘要,然後使用自己的公鑰解密數字簽名,如果兩個計算得到的結果相同,說明數據在傳輸過程中沒有被篡改
SSL
SSL(Secure Socket Layer) 相當於是一個提供了安全服務的加強版 TCP,它的第三版本也被稱爲 TLS(Transport Layer Security) 。SSL 差不多是取代 TCP 原有位置的,但是實際上它是一個應用層協議。SSL 的具體原理也很複雜,我這裏只列出一些要點
- 在 SSL 通信的雙方(比如 Bob 和 Alice)共使用了 4 個密鑰:一個密鑰是 Bob 向 Alice 發送數據的會話密鑰;一個密鑰是 Bob 向 Alice 發送報文完整性檢測 MAC 密鑰;一個密鑰是 Alice 向 Bob 發送數據的會話密鑰;一個密鑰是 Alice 向 Bob 發送報文完整性檢測 MAC 密鑰
- SSL 將報文數據分成被稱爲 記錄 的基本單元,對記錄做加密和報文完整性驗證。SSL 對記錄數據+MAC密鑰+記錄序號做散列,這樣能防止中間人惡意替換記錄的順序
防火牆
防火牆是一種軟件加上硬件一起實施網絡連接管理的工具,可以認爲這是一個位於網絡邊緣的路由器,具有下面的性質
- 所有從內部網絡流向外部和從外部流向內部的流量都必須經過防火牆
- 防火牆僅會讓允許授權的流量通過
- 防火牆必須足夠安全,不能被攻破
防火牆的過濾方式可以分爲 3 類:傳統分組過濾器(traditional packet filter)、狀態過濾器(stateful filter)、應用程序網關(application gateway)
分組過濾器
分組過濾器檢查所有流經防火牆的數據包,基於事先定下的規則決定是否放行流量。它做出的決定基於下面因素
- 數據報的源地址或目的地址
- 數據報的協議類型:TCP、UDP、ICMP、OSPF 等
- TCP 或 UDP 的源或目的端口
- TCP 標誌比特:SYN、ACK 等
- ICMP 報文類型
- 數據報離開和進入網絡的不同規則
- 對不同路由器的接口的不同規則
狀態分組過濾器
前面的分組過濾器只是根據一個分組的數據報決定是否放行,而狀態分組過濾器會記錄這個分組屬於的連接,根據連接的狀態決定是否放行分組
簡單來說,當內部或者外部用戶發起 TCP 連接時,都必須經歷 3 次握手( SYN、SYNACK、ACK),防火牆可以探測到這些報文,然後在自己的數據庫包保存這個 TCP 連接信息,當一個數據報來到防火牆時,防火牆在自己的數據庫中檢索到連接信息,然後根據既定的規則決定是否放行
應用程序網關
上面的兩個過濾器都是應用於非應用層的數據報,有時候報文的認證信息存在於應用層中,這時候需要使用到 應用程序網關(applicatin gateway)。它不僅僅會檢查 TCP 或者 UDP 數據報,還會檢查應用層數據,以決定流量是否放行
入侵檢測系統
入侵檢測系統(Intrusion Detection System,IDS) 相當於是一個探針,安裝在網絡路徑上,他會檢測所有的流經自身的流量,在其中檢測是否存在可疑流量,在必要的時候向網絡管理員發送警告
在一個網絡中可能會部署多個 IDS,因爲 IDS 對所有流量執行檢測,需要大量的計算量,部署多個 IDS 能減輕每個 IDS 的負擔
IDS 使用了 基於特徵的系統(signature-based system) 或 基於異常的系統(anomaly-based system)。基於特徵的 IDS 有一個攻擊的特徵數據庫,當流經的流量與某種攻擊相似時(源端口相同、或者協議的某些字段值相同),它就會發出警告。基於特徵的 IDS 的缺點是不能檢測出新的攻擊
基於異常的 IDS 觀察流經自身的流量,統計不同協議的分組的數量,當某種分組的數量異常升高時,他就判定網絡中可能存在攻擊行爲。它的優點就是能夠檢測出新的攻擊形式
Snort 是一個開源的 IDS 實現,在全球大量部署,當一種新的攻擊方式出現時,Snort 社區可能會在幾小時內編寫出應對規則,並供全球範圍內的網絡管理員下載和部署