一、HTTP和HTTPS的區別
HTTP協議傳輸的數據都是未加密的,也就是明文的,因此使用HTTP協議傳輸隱私信息非常不安全。
HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全。
HTTPS的缺點:
- 因為與純文本通信相比,加密通信會消耗更多的CPU 及內存資源。如果每次通信都加密,會消耗相當多的資源.
- 要進行 HTTPS通信,證書是必不可少的。而使用的證書必須向認證機構(CA)購買。
二、密碼學基礎
- 明文
明文指的是未被加密過的原始數據。
- 密文
明文被某種加密算法加密之后,會變成密文,從而確保原始數據的安全。密文也可以被解密,得到原始的明文。
- 密鑰
密鑰是一種參數,它是在明文轉換為密文或將密文轉換為明文的算法中輸入的參數。
密鑰分為對稱密鑰與非對稱密鑰,分別應用在對稱加密和非對稱加密上。
- 對稱加密
對稱加密又叫做私鑰加密,即信息的發送方和接收方使用同一個密鑰去加密和解密數據。
對稱加密的特點是算法公開、加密和解密速度快,適合於對大數據量進行加密,常見的對稱加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
加密過程如下:明文 + 加密算法 + 私鑰 => 密文
解密過程如下:密文 + 解密算法 + 私鑰 => 明文
其加密過程中的私鑰與解密過程中用到的私鑰是同一個密鑰,這也是稱加密之所以稱之為“對稱”的原因。由於對稱加密的算法是公開的,所以一旦私鑰被泄露,那么密文就很容易被破解,所以對稱加密的缺點是密鑰安全管理困難。
- 非對稱加密
而非對稱加密使用一對密鑰,即公鑰和私鑰,且二者成對出現。
私鑰被自己保存,不能對外泄露。公鑰指的是公共的密鑰,任何人都可以獲得該密鑰。用公鑰或私鑰中的任何一個進行加密,用另一個進行解密。
被公鑰加密過的密文只能被私鑰解密,過程如下:
被私鑰加密過的密文只能被公鑰解密,過程如下:
明文 + 加密算法 + 私鑰 => 密文, 密文 + 解密算法 + 公鑰 => 明文
由於加密和解密使用了兩個不同的密鑰,這就是非對稱加密“非對稱”的原因。
非對稱加密的缺點是加密和解密花費時間長、速度慢,只適合對少量數據進行加密。在非對稱加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC(橢圓曲線加密算法)等。
三、 HTTPS通信過程
TLS的全稱是Transport Layer Security,即安全傳輸層協議,最新版本的TLS(Transport Layer Security,傳輸層安全協議)是IETF(Internet Engineering Task Force,Internet工程任務組)制定的一種新的協議,它建立在SSL 3.0協議規范之上,是SSL 3.0的后續版本。在TLS與SSL3.0之間存在着顯著的差別,主要是它們所支持的加密算法不同,所以TLS與SSL3.0不能互操作。雖然TLS與SSL3.0在加密算法上不同,但是在我們理解HTTPS的過程中,我們可以把SSL和TLS看做是同一個協議。
HTTPS在傳輸的過程中會涉及到三個密鑰:
服務器端的公鑰和私鑰,用來進行非對稱加密;
客戶端生成的隨機密鑰,用來進行對稱加密。
一個HTTPS請求實際上包含了兩次HTTP傳輸,可以細分為以下幾步。
1.客戶端向服務器發起HTTPS請求,連接到服務器的443端口。
服務器端有一個密鑰對,即公鑰和私鑰,是用來進行非對稱加密使用的,服務器端保存着私鑰,不能將其泄露,公鑰可以發送給任何人。
服務器將自己的公鑰發送給客戶端。
2.客戶端收到服務器端的公鑰之后,會對公鑰進行檢查,驗證其合法性,如果發現發現公鑰有問題,那么HTTPS傳輸就無法繼續。嚴格的說,這里應該是驗證服務器發送的數字證書的合法性。
如果公鑰合格,那么客戶端會生成一個隨機值,這個隨機值就是用於進行對稱加密的密鑰,我們將該密鑰稱之為client key,即客戶端密鑰。然后客戶端用服務器的公鑰對客戶端密鑰進行非對稱加密,這樣客戶端密鑰就變成密文了,至此,HTTPS中的第一次HTTP請求結束。
服務器接收到客戶端發來的密文之后,會用自己的私鑰對其進行非對稱解密,解密之后的明文就是客戶端密鑰,然后用客戶端密鑰對數據進行對稱加密,這樣數據就變成了密文。
然后服務器將加密后的密文發送給客戶端。
客戶端收到服務器發送來的密文,用客戶端密鑰對其進行對稱解密,得到服務器發送的數據。這樣HTTPS中的第二個HTTP請求結束,整個HTTPS傳輸完成。
4.在接下來的傳輸過程中,客戶端和服務器都使用對稱加密的密鑰進行對稱加解密。
備注:前3步都屬於握手階段,到第4步才真正進入內容傳輸階段。之所以到傳輸階段選擇使用對稱加密的方式是因為對稱加密的方式執行快。
注意⚠️: 證明公鑰的正確性的方法:使用由數字證書認證機構(CA,Certificate Authority)和其相關機關頒發的公開密鑰證書。四、驗證公鑰
瀏覽器在整個通信的最開始會請求服務器的公鑰(其實是證書),這里的公鑰就是我們常說的 SSL 證書的一部分了。
關於 SSL 證書,一般是由專門機構(CA 機構)頒發,其實也就是頒發幾個文件,其中有包含私鑰信息的文件和包含公鑰信息的文件,私鑰文件一直秘密地保存在服務器,不會公布出去,公鑰文件會在這次請求中下發給瀏覽器。
公鑰文件除了包含有公鑰密鑰信息外,還有其他信息比如域名、頒發機構、有效期等等。
比如百度首頁的證書信息如下圖所示:
每一個證書都包含域名信息,操作系統也維護了一個可信的證書列表。當客戶端獲得服務器返回的證書后,提取證書里的域名、簽發機構等信息,然后根據本地的可信證書列表判斷該證書是否可信,然后才提取證書里的公鑰並接着和服務器通信,否則給出警告。
一般來說,高質量的 SSL 證書需要購買,而且價格不菲。如果對站點的要求沒有那么高,也可以在一些網站上申請免費證書,比如SSL證書選購 - 騰訊雲、SSL For Free。