聊聊對稱/非對稱加密在HTTPS中的應用
目前常用的加密演算法主要分成三類:
- 對稱加密演算法
- 非對稱加密演算法
- 訊息摘要演算法
在網際網路中,資訊防護主要涉及兩個方面:資訊竊取和資訊篡改。對稱/非對稱加密演算法能夠避免資訊竊取,而訊息摘要演算法能夠避免資訊篡改。
對稱加密演算法
傳送方和接收方需要持有同一把金鑰,傳送訊息和接收訊息均使用該金鑰。
相對於非對稱加密,對稱加密具有更高的加解密速度,但雙方都需要事先知道金鑰,金鑰在傳輸過程中可能會被竊取,因此安全性沒有非對稱加密高。
非對稱加密演算法
接收方在傳送訊息前需要事先生成公鑰和私鑰,然後將公鑰傳送給傳送方。傳送放收到公鑰後,將待發送資料用公鑰加密,傳送給接收方。接收到收到資料後,用私鑰解密。
在這個過程中,公鑰負責加密,私鑰負責解密,資料在傳輸過程中即使被截獲,攻擊者由於沒有私鑰,因此也無法破解。
非對稱加密演算法的加解密速度低於對稱加密演算法,但是安全性更高。
訊息摘要演算法
訊息摘要演算法可以驗證資訊是否被篡改。
在資料傳送前,首先使用訊息摘要演算法生成該資料的簽名,然後簽名和資料一同傳送給接收者。接收者收到資料後,對收到的資料採用訊息摘要演算法獲得簽名,最後比較簽名是否一致,以此來判斷資料在傳輸過程中是否發生修改。
無論輸入的訊息有多長,計算出來的訊息摘要的長度總是固定的。例如應用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進行加密,所以傳輸的資料都是加密後的資料。具體是如何進行加密,解密,驗證的,且看下圖。
客戶端發起HTTPS請求
這個沒什麼好說的,就是使用者在瀏覽器裡輸入一個https網址,然後連線到server的443埠。
服務端的配置
採用HTTPS協議的伺服器必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,才可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面(startssl就是個不錯的選擇,有1年的免費服務)。這套證書其實就是一對公鑰和私鑰。如果對公鑰和私鑰不太理解,可以想象成一把鑰匙和一個鎖頭,只是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人可以用這個鎖把重要的東西鎖起來,然後發給你,因為只有你一個人有這把鑰匙,所以只有你才能看到被這把鎖鎖起來的東西。
傳送證書
這個證書其實就是公鑰,只是包含了很多資訊,如證書的頒發機構,過期時間等等。
客戶端解析證書
這部分工作是有客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨即值。然後用證書對該隨機值進行加密。就好像上面說的,把隨機值用鎖頭鎖起來,這樣除非有鑰匙,不然看不到被鎖住的內容。
傳送加密資訊
這部分傳送的是用證書加密後的隨機值,目的就是讓服務端得到這個隨機值,以後客戶端和服務端的通訊就可以通過這個隨機值來進行加密解密了。
服務段解密資訊
服務端用私鑰解密後,得到了客戶端傳過來的隨機值(私鑰),然後把內容通過該值進行對稱加密。所謂對稱加密就是,將資訊和私鑰通過某種演算法混合在一起,這樣除非知道私鑰,不然無法獲取內容,而正好客戶端和服務端都知道這個私鑰,所以只要加密演算法夠彪悍,私鑰夠複雜,資料就夠安全。
傳輸加密後的資訊
這部分資訊是服務段用私鑰加密後的資訊,可以在客戶端被還原
客戶端解密資訊
客戶端用之前生成的私鑰解密服務段傳過來的資訊,於是獲取瞭解密後的內容。整個過程第三方即使監聽到了資料,也束手無策。
非對稱加密演算法的效能是非常低的,原因在於尋找大素數、大數計算、資料分割需要耗費很多的CPU週期,所以一般的HTTPS連線只在第一次握手時使用非對稱加密,通過握手交換對稱加密金鑰,在之後的通訊走對稱加密。