目前常用的加密演算法主要分成三類:

  • 對稱加密演算法
  • 非對稱加密演算法
  • 消息摘要演算法

在互聯網中,信息防護主要涉及兩個方面:信息竊取和信息篡改。對稱/非對稱加密演算法能夠避免信息竊取,而消息摘要演算法能夠避免信息篡改。

對稱加密演算法

發送方和接收方需要持有同一把密鑰,發送消息和接收消息均使用該密鑰。

相對於非對稱加密,對稱加密具有更高的加解密速度,但雙方都需要事先知道密鑰,密鑰在傳輸過程中可能會被竊取,因此安全性沒有非對稱加密高。

非對稱加密演算法

接收方在發送消息前需要事先生成公鑰和私鑰,然後將公鑰發送給發送方。發送放收到公鑰後,將待發送數據用公鑰加密,發送給接收方。接收到收到數據後,用私鑰解密。

在這個過程中,公鑰負責加密,私鑰負責解密,數據在傳輸過程中即使被截獲,攻擊者由於沒有私鑰,因此也無法破解。

非對稱加密演算法的加解密速度低於對稱加密演算法,但是安全性更高。

消息摘要演算法

消息摘要演算法可以驗證信息是否被篡改。

在數據發送前,首先使用消息摘要演算法生成該數據的簽名,然後簽名和數據一同發送給接收者。接收者收到數據後,對收到的數據採用消息摘要演算法獲得簽名,最後比較簽名是否一致,以此來判斷數據在傳輸過程中是否發生修改。

無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。例如應用MD5演算法摘要的消息有128個比特位,用SHA-1演算法摘要的消息最終有160比特位的輸出,SHA-1的變體可以產生192比特位和256比特位的消息摘要。一般認為,摘要的最終輸出越長,該摘要演算法就越安全。變長輸入,定長輸出。

只要輸入的消息不同,對其進行摘要以後產生的摘要消息也必不相同;但相同的輸入必會產生相同的輸出。這正是好的消息摘要演算法所具有的性質:輸入改變了,輸出也就改變了;兩條相似的消息的摘要確不相近,甚至會大相徑庭。從理論上來說,不管使用什麼樣的摘要演算法,必然存在2個不同的消息,對應同樣的摘要。因為輸入是一個無窮集合,而輸出是一個有限集合,所以從數學上來說,必然存在多對一的關係。但是實際上,很難或者說根本不可能人為的造出具有同樣摘要的2個不同消息。所以我們選擇摘要演算法的時候,要注意其安全性。比如現在MD5就是不安全的,已經被國內王小雲破解。

消息摘要是單向、不可逆的。只能進行正向的信息摘要,而無法從摘要中恢復出任何的原始消息,甚至根本就找不到任何與原信息相關的信息。當然,可以採用強力攻擊的方法,即嘗試每一個可能的信息,計算其摘要,看看是否與已有的摘要相同,如果這樣做,最終肯定會恢復出摘要的消息。但實際上,要得到的信息可能是無窮個消息之一,所以這種強力攻擊幾乎是無效的。

消息摘要演算法來源於CRC演算法,最初CRC演算法是用來驗證數據完整性的,即我們常見的奇偶校驗碼、循環冗餘校驗,在CRC基礎上發展處了MD和SHA量大演算法家族,CRC比這些演算法都要早,MD演算法比SHA演算法早,SHA演算法是對MD演算法的改進。再後來則發展出了可以帶有密碼的消息摘要演算法-MAC演算法。

消息摘要演算法包括三大類,MD、SHA和MAC演算法,MD的分類是按照版本規定的,SHA則是按照適用的消息長度分類的:

  • MD演算法: Message Digest Algorithm ,目前主流的是MD5演算法,為第五版演算法,之前有MD2、MD3、MD4演算法。
  • SHA演算法:安全哈希演算法(Secure Hash Algorithm)主要適用於數字簽名標準(Digital Signature Standard DSS)裡面定義的數字簽名演算法(Digital Signature Algorithm DSA)。
  • MAC演算法:帶有密碼信息的信息摘要演算法,是對MD和SHA演算法的演變和改進,包括HmacMD2、HmacMD4、HmacMD5、HmacSHA-256等。

對稱/非對稱加密演算法在HTTPS協議中的應用

HTTPS其實是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。服務端和客戶端的信息傳輸都會通過TLS進行加密,所以傳輸的數據都是加密後的數據。具體是如何進行加密,解密,驗證的,且看下圖。

  1. 客戶端發起HTTPS請求這個沒什麼好說的,就是用戶在瀏覽器裏輸入一個https網址,然後連接到server的443埠。
  2. 服務端的配置採用HTTPS協議的伺服器必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,纔可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。這套證書其實就是一對公鑰和私鑰。如果對公鑰和私鑰不太理解,可以想像成一把鑰匙和一個鎖頭,只是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然後發給你,因為只有你一個人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來的東西。
  3. 傳送證書這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間等等。
  4. 客戶端解析證書

    這部分工作是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨即值。然後用證書對該隨機值進行加密。就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內容。

  5. 傳送加密信息這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,以後客戶端和服務端的通信就可以通過這個隨機值來進行加密解密了。
  6. 服務段解密信息服務端用私鑰解密後,得到了客戶端傳過來的隨機值(私鑰),然後把內容通過該值進行對稱加密。所謂對稱加密就是,將信息和私鑰通過某種演算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以只要加密演算法夠彪悍,私鑰夠複雜,數據就夠安全。
  7. 傳輸加密後的信息這部分信息是服務段用私鑰加密後的信息,可以在客戶端被還原
  8. 客戶端解密信息客戶端用之前生成的私鑰解密服務段傳過來的信息,於是獲取了解密後的內容。整個過程第三方即使監聽到了數據,也束手無策。

非對稱加密演算法的性能是非常低的,原因在於尋找大素數、大數計算、數據分割需要耗費很多的CPU週期,所以一般的HTTPS連接只在第一次握手時使用非對稱加密,通過握手交換對稱加密密鑰,在之後的通信走對稱加密。


推薦閱讀:
相關文章