1)為什么用了 HTTPS 就是安全的?
2)HTTPS 的底層原理如何實現?
3)用了 HTTPS 就一定安全嗎?
HTTPS 的實現原理
大家可能都聽說過 HTTPS 協議之所以是安全的是因為 HTTPS 協議會對傳輸的數據進行加密,而加密過程是使用了非對稱加密實現。但其實:HTTPS 在內容傳輸的加密上使用的是對稱加密,非對稱加密只作用在證書驗證階段。
HTTPS的整體過程分為證書驗證和數據傳輸階段,具體的交互過程如下:
① 證書驗證階段:
- 1)瀏覽器發起 HTTPS 請求;
- 2)服務端返回 HTTPS 證書;
- 3)客戶端驗證證書是否合法,如果不合法則提示告警。
② 數據傳輸階段:
- 1)當證書驗證合法后,在本地生成隨機數;
- 2)通過公鑰加密隨機數,並把加密后的隨機數傳輸到服務端;
- 3)服務端通過私鑰對隨機數進行解密;
- 4)服務端通過客戶端傳入的隨機數構造對稱加密算法,對返回結果內容進行加密后傳輸。
1. 為什么數據傳輸是用對稱加密的?
首先:非對稱加密的加解密效率是非常低的,而 http 的應用場景中通常端與端之間存在大量的交互,非對稱加密的效率是無法接受的。
另外:在 HTTPS 的場景中只有服務端保存了私鑰,一對公私鑰只能實現單向的加解密,所以HTTPS 中內容傳輸加密采取的是對稱加密,而不是非對稱加密
2. 為什么需要CA機構頒發證書?
防止”中間人“攻擊,同時可以為網站提供身份證明。
3. 使用https會被抓包嗎?
會被抓包,HTTPS 只防止用戶在不知情的情況下通信被監聽,如果用戶主動授信,是可以構建“中間人”網絡,代理軟件可以對傳輸內容進行解密。
4. 中間人攻擊
中間人的確無法得到瀏覽器生成的密鑰B,這個密鑰本身被公鑰A加密了,只有服務器才有私鑰A’解開拿到它呀!然而中間人卻完全不需要拿到密鑰A’就能干壞事了。請看:
- 某網站擁有用於非對稱加密的公鑰A、私鑰A’。
- 瀏覽器向網站服務器請求,服務器把公鑰A明文給傳輸瀏覽器。
- 中間人劫持到公鑰A,保存下來,把數據包中的公鑰A替換成自己偽造的公鑰B(它當然也擁有公鑰B對應的私鑰B’)。
- 瀏覽器隨機生成一個用於對稱加密的密鑰X,用公鑰B(瀏覽器不知道公鑰被替換了)加密后傳給服務器。
- 中間人劫持后用私鑰B’解密得到密鑰X,再用公鑰A加密后傳給服務器。
- 服務器拿到后用私鑰A’解密得到密鑰X。
這樣在雙方都不會發現異常的情況下,中間人得到了密鑰B。根本原因是瀏覽器無法確認自己收到的公鑰是不是網站自己的。那么下一步就是解決下面這個問題:
數字簽名的制作過程:
- CA擁有非對稱加密的私鑰和公鑰。
- CA對證書明文信息進行hash。
- 對hash后的值用私鑰加密,得到數字簽名。
明文和數字簽名共同組成了數字證書,這樣一份數字證書就可以頒發給網站了。
那瀏覽器拿到服務器傳來的數字證書后,如何驗證它是不是真的?(有沒有被篡改、掉包)
瀏覽器驗證過程:
- 拿到證書,得到明文T,數字簽名S。
- 用CA機構的公鑰對S解密(由於是瀏覽器信任的機構,所以瀏覽器保有它的公鑰。詳情見下文),得到S’。
- 用證書里說明的hash算法對明文T進行hash得到T’。
- 比較S’是否等於T’,等於則表明證書可信。
為什么這樣可以證明證書可信呢?我們來仔細想一下。
其實這並不會發生,因為證書里包含了網站A的信息,包括域名,瀏覽器把證書里的域名與自己請求的域名比對一下就知道有沒有被掉包了。