當談論通信安全的時候,一般咱們關心的是下面四個問題:算法
1)防止消息竊聽安全
當傳送的消息是機密內容的時,人們但願給消息加密。這樣即便消息在傳送過程當中被截獲,竊聽者也沒法確切的知道消息內容,從而達到保密的效果。網絡
2)防止消息篡改工具
消息在傳送過程當中,有可能被攻擊者篡改內容,這樣接收者接到的就是錯誤的信息,通信過程當中應該提供某種方案防止篡改。加密
3)防止消息僞造spa
攻擊者假冒發送者的名義,給接收者發送消息,這種行爲稱爲消息僞造。code
4)防止否定blog
發送者過後否定本身發送過消息,須要有一種機制來防止這種狀況發生。圖片
下面,咱們將詳細分析下這四個問題。開發
提到加密,不少人的第一反應是下面這樣:
「本身實現一個加密算法,而後將算法保密,這樣就能保證安全。」
在密碼學的領域,這是個典型的誤區。
首先,開發高強度的加密算法是很是困難的。普通的算法在外行看起來牢不可破,可是專業破譯者卻有很是多的工具和攻擊方式,使其破綻百出。
其次,加密算法的祕密總有一天會公諸於世。到那時,全部基於這個算法的祕密都將被泄露。
實踐中使用的加密算法都是公開的,消息傳遞依靠保密的密鑰來確保消息不被破解。正所以,它們通過攻擊者長期嘗試仍未被破解,因此保密強度較高。
經常使用的加密體系分爲三類,對稱加密、非對稱加密和混合加密。
1.1 對稱加密
對稱加密是指加密和解密用的是同一個密鑰。這個密鑰只有發送者和接收者知曉,其餘沒有密鑰的人沒法解密消息。
常見的對稱加密算法有 DES 、 3DES 和 AES 等。隨着計算機硬件的進步,使用暴力破解法已經能在現實時間中完成對 DES 的破解; 3DES 處理速度不高,此外在安全性方面也逐漸顯現出了些問題;目前應該選用的算法是AES 。
1.2 非對稱加密
與對稱加密不一樣,非對稱加密算法須要兩個密鑰——公鑰和私鑰。
公鑰和私鑰是一對。公鑰加密,對應的私鑰才能解密,反之亦然。前面的場景適用於防竊聽,後面的場景適用於數字簽名,也就是防止否定。
實現機密消息交換的基本過程是:甲方生成一對密鑰並將其中一個做爲公鑰向其它方公開,獲得該公鑰的乙方使用該公鑰對消息進行加密再發送給甲方,甲方再使用本身的私鑰對消息進行解密。
網絡中的其餘竊聽者雖然也能拿到甲方的公鑰,可是加密後的消息只有私鑰才能解開,因此他們沒法破譯消息。
最常使用的非對稱加密算法是 RSA 。
1.3 混合加密
比較一下對稱加密和非對稱加密各自的特色:
對稱加密處理速度快,可是因爲通信雙方使用的是同一個密鑰,存在密鑰配送困難的問題。要求通信雙方線下交換密鑰是不現實的,而線上配送又存在被竊聽的風險。
非對稱加密的公鑰自己就是能夠對外公開的,自然避免了密鑰配送的問題;可是非對稱加密的處理速度遠遠低於對稱加密。
混合加密體系是將上述兩種優點相結合的辦法。
先看一下加密過程。
通信過程當中傳送了兩部份內容:一部分是使用對稱加密算法加密的消息,另外一部分是對稱加密的密鑰。其中對稱加密的密鑰是由接收方的公鑰加密過的,這樣除了接收方以外,任何其餘人都不能解開對稱加密的密鑰,從而也沒法解開加密的消息。
相比於要傳送的消息自己,對稱密鑰的長度要短得多。非對稱加密的處理速度慢,因此只用來加密對稱密鑰,而很長的消息則用處理速度快的對稱算法來加密。
下面是解密過程:
先把對稱加密的密鑰和加密後消息這兩部分分離開。對稱密鑰以前是用接收者的公鑰加密的,因此只能使用接收者的私鑰進行解密。對稱密鑰解出來以後,就能夠對消息密文進行解密了,從而獲得消息明文。
2.防篡改
通信過程當中,接收方有時候會有這樣的疑問:
「我接收到的消息確實就是發送者發過來的那條嗎?在傳輸的過程當中會不會已經被攻擊者給改寫了?」
這是對消息完整性的挑戰。
實踐中通常使用摘要算法來應對這種挑戰。
摘要算法有以下重要特性。
第一,輸入任意長度的字符串,輸出固定長度的字符串。比起要傳輸的消息長度來講,輸出的固定長度一般很短,所以很容易進行處理。
第二,相同的輸入老是對應相同的輸出。發送方對消息進行摘要處理,同時把摘要附在消息裏發送出來。接收方收到以後用一樣的摘要算法對消息進行處理,再把計算出來的摘要和收到的摘要進行對比,若是不一致,就能知道消息已被篡改。
第三,給定一個字符串A ,通過摘要算法處理後的串 B ,很難找到一個字符串 C ,使其摘要後的串和串 B 相同。這個重要的特性稱爲抗碰撞性(弱抗碰撞性)。這條特性使得攻擊者在篡改消息後,很難再計算出一樣的摘要,從而規避摘要算法的檢查。
第四,這種轉換具備單向性,即不能經過輸出串倒推出輸入串。
經常使用的摘要算法包含 MD4 、 MD5 、 SHA-1 和 SHA-2 (包含 SHA-256 、SHA-384 和 SHA-512 )。上述算法中目前惟有 SHA-2 算法的強抗碰撞性還沒有被攻破。
3.防僞造
防僞造指的是「消息來自正確的發送者」。
防篡改關注的是消息內容,防僞造關注的是消息發送者自己。
防篡改關注的是消息的完整性( integrity ),防僞造關注的是消息的認證( authentication )。
消息認證碼( Message
Authentication Code)是一種既能檢查消息完整性,又能作身份驗證的技術,取三個單詞的首字母,簡稱爲 MAC 。
實踐中常用與密鑰相關的摘要算法來實現消息認證碼。
消息認證碼的使用步驟以下:
1.發送者和接收者事先共享密鑰; 2.發送者使用共享密鑰對消息計算 MAC 值; 3.發送者將消息和 MAC 一塊兒發給接收者; 4.接收者使用共享密鑰對接收到的消息計算 MAC 值; 5.接收者將計算的 MAC 值跟接收到的 MAC 值作比較;
因爲攻擊者沒有共享密鑰,因此沒法跟接收者算出同樣的 MAC 值。
跟對稱密鑰同樣,這裏一樣面臨密鑰配送的問題,咱們仍然能夠採用非對稱加密的方式進行密鑰配送。除此以外, Diffie-Hellman 算法也是經常使用的密鑰交換方式。
4.防否定
想象一下這個場景, Bob 收到了一張 Alice 發來的五百萬元的借條。使用事先約定好的共享密鑰,Bob 計算出的 MAC 值跟借條裏收到的 MAC 值一致,這代表消息沒有被篡改,同時消息也不會是第三方僞造的,那麼就沒有任何後顧之憂了嗎?
並非這樣。問題在於共享密鑰是兩我的持有的,所以能算出正確 MAC 值的並不僅是 Alice , Bob 也能。若是 Alice 聲稱本身沒有發過這樣的借條,那做爲第三方仲裁者來講,沒法證實借條是 Alice 生成的仍是 Bob 生成的。
咱們須要尋求一種解決方案, Alice 使用的簽名是由只有她本身才知道的密鑰生成,同時別人還能順利解開。這樣別人沒法僞造 Alice 的簽名,同時還能驗證這個簽名。
看上去是否是有點熟悉?沒錯,就是以前介紹過的非對稱加密。
Alice 使用本身的私鑰對消息進行簽名(加密),同時對外發布對應的公鑰。不管是 Bob 仍是第三方仲裁者,均可以使用公鑰對簽名進行驗證(解密)。
這種方案稱爲數字簽名。
5.後話
到目前爲止,看上去咱們解決了以前提出的四個問題,可是通信安全領域的問題還遠不止這些。好比怎麼驗證公鑰的可靠性?好比怎麼才能生成一個可靠的隨機數?再延伸下去咱們會涉及到證書,認證機構和隨機數的分級等領域,這裏就再也不一一展開了。
最後,請你們記住一句話:只有完美的密碼,沒有完美的人。無論多精密的系統,在確保總體安全方面,人是一個特別巨大的弱點。不少時候,最脆弱的環節並非各類算法,而是人類本身。