從頭到尾談一下HTTPS
引言
“你能談一下HTTPS嗎?”
“一種比HTTP安全的協議。”
“…”
如果面試這樣說的話那差不多就gg了,其實HTTPS要展開回答的話內容還挺豐富的。本篇文章詳細介紹了HTTPS是什麼、為什麼安全以及實現安全的方法,一起來學習吧。
本文略長,請保持耐心。
https是什麼?
HTTPS是以安全為目標的HTTP通道,簡單講是HTTP的安全版。之所以安全是因為它在將HTTP報文傳送給TCP之前,先將其傳送給了一個安全層(通過SSL協議實現)對報文進行加密。
報文加密的優點
- 保證客戶端和伺服器的對話不會被其他人竊聽
- 保證雙方傳送的資料不會中途被修改
- 確保雙方的身份是真實客戶端/伺服器而不是偽造的客戶端/伺服器
不妨將報文想象成A給B寫的一封信,A將信放在一個有鎖的盒子裡,那麼旁人就不能獲取信的內容也不能篡改信了。
加密機制
先了解幾個術語
- 明文:未加密的報文
- 密文:通過加密演算法加密後的報文
- 金鑰:改變加密演算法行為的引數
比如我們有一個加密函式,演算法如下
function E(key, p) {
// 將p的每一個字母向右移動key位,比如key為3則A-->D、B-->E...
}
E(3, "AB"); // DE
明文: “AB” —— 密文: “DE” —— 金鑰:3
如果我們的金鑰不一樣那麼我們的加密函式執行結果就會不同。
下面來看一下常見的幾種加密機制。
對稱加密
我們之前說過,讓報文加密是為了保證我兩的聊天內容是祕密的,只有我兩能看懂,別人看不懂。那麼我們要約定一個加密方式,比如我們倆遞小紙條交流的時候把小紙條裝在一個盒子裡,然後只有我們有這個盒子的鑰匙。其他人就算拿到這個盒子他也打不開,那就無從竊取內容了。
對稱加密就是這個意思:傳送方用金鑰將明文加密,接收方用同樣的金鑰解密。
雖然安全性得到了保障,但是還是存在兩個問題:
- 傳送雙方約定金鑰時需要將金鑰在網路傳輸,可能會造成金鑰洩露,安全得不到保障。
- 就是傳送方與接收方在互相對話之前一定要有有一個共享金鑰。試想,如果N個客戶端都要與伺服器建立安全通訊,那麼伺服器需要儲存N個金鑰,N和客戶端和N個伺服器通訊,那麼將有N^2個金鑰,管理起來非常不便。
非對稱加密
非對稱加密和對稱加密是反著乾的,對稱加密是使用同一個金鑰,而非對稱加密使用了兩個不同的金鑰:公鑰、私鑰,一個金鑰加密的內容只能由另一個金鑰解開。
公鑰是眾所周知的,而私鑰只有主機才持有。
伺服器生成了公鑰A和私鑰B,當客戶端想給該伺服器傳送報文時,首先找到伺服器的公鑰,然後根據公鑰A將報文加密,伺服器用私鑰B解密。同理,當伺服器想給該客戶端傳送報文時,首先找到客戶端的公鑰C,然後根據公鑰C將報文加密,客戶端用自己的私鑰D解密。
在確保了資訊保安的同時又可以方便金鑰的管理。
由此,對稱加密和非對稱加密的區別是:
. | 對稱加密 | 非對稱加密 |
---|---|---|
金鑰 | 加密解密用相同金鑰 | 公鑰、私鑰,一個加密另一個解密 |
金鑰管理 | 金鑰數量大,不方便 | 每個主機只需管理一對公鑰、私鑰 |
安全性 | 不安全(並非該機制不安全,而是雙方在約定金鑰時可能會金鑰洩露) | 安全(不需要通過對話約定金鑰) |
加/解密速度 | 快 | 慢 |
那HTTPS是採用的什麼機制呢?
HTTPS加密機制
劇透,HTTPS對報文採用的對稱加密。
完整的一次HTTPS交流
(1) 客戶端通過TCP三次握手建立到伺服器埠443(HTTPS的預設埠)的TCP連線
(2) 客戶端通過SSL握手建立安全層
(3) 客戶端傳送http報文到SSL安全層,安全層將報文加密後發給TCP –> IP –> …
(4) 同理伺服器傳送響應,客戶端接收後通過SSL安全層解密發給應用層
(5) SSL安全層關閉通知
(6) TCP關閉連線
從上面的描述可以清晰的看到我們的報文加密/解密都是在SSL安全層執行。
那麼安全層是怎麼加密的?金鑰又是怎麼約定的?這一切的一切都得仔細聊聊第(2)步驟。
SSL握手
(1) 客戶端向伺服器傳送可供選擇的加密演算法並請求證書。
客戶端說:“嘿,小子。我這裡有一堆我支援的加密演算法,你選一個你喜歡的發給我。對了,順便把你的身份證影印件發給我看看,我怕我連線的伺服器是偽造的。”
(2) 伺服器傳送選中的加密演算法和證書
伺服器說:“emmm…我看加密演算法A挺好的,我們倆就用這個吧。證書也發給你,證明我不是壞人。”
(3) 客戶端儲存伺服器選擇的加密演算法和祕鑰A以作為日後加密,將A用伺服器的公鑰B加密後發給伺服器,伺服器用自己的祕鑰C解密後得到A,從此客戶端和伺服器都用約定的加密演算法以及祕鑰A進行對稱加密。
(看到了伐?先用非對稱加密在網路中傳輸對稱加密的祕鑰A,之後對報文都是採用對稱加密啦。)
(4) 客戶端和伺服器互相告知,開始加密過程。
在SSL握手之後我們就可以開開心心的傳送和接收加密報文啦。
以上是HTTPS加密的全過程,不過還不足以構成完整的HTTPS,因為完整的HTTPS要保障兩個方面的安全:報文安全、身份安全,加密只能保證報文是安全的,不能保證身份是正確的。
試想,A和B互相寫信並且交換盒子鑰匙,然後將信放盒子裡寄出去,上面的加密行為可以讓A和B之間寫的信內容不會被他人獲取,但是如果一開始和A通訊的就不是B呢?是竊取者C偽裝成B和A通訊,那麼A會和C在SSL的時候就交流鑰匙然後C可以竊取A寫給B的信的內容。
身份的認證我們用數字證書。
數字證書
含有數字證書的報文的結構:
剛剛SSL握手的第(1)步還記得伐?客戶端向伺服器索要證書,這個證書是伺服器可以證明自己身份的東西,該證書裡包含了伺服器的一些基本資訊,比如站點的DNS主機名、該站點組織名、站點的公鑰(發公鑰就是為了讓客戶端SSL方便執行握手(3))等,以及證書的序列號、證書籤名演算法、過期日期等證書資訊。
數字簽名
證書是一個站點的身份證,但是身份證也可以被偽造,為了保證這個證書是真的我們需要數字簽名。我們會將證書內容用簽名演算法生成一個值,我們稱之為“摘要”。然後將該摘要用主機的私鑰加密,加密後的內容就是我們的數字簽名。
如果公鑰解密後得到的摘要與生成的摘要不符那麼可能有兩種情況
- 傳送方身份不是目的主機
- 目的主機傳送的證書被篡改
數字證書和加密就構成了一個完整的HTTPS事務。
總結
- HTTPS之所以安全是因為有兩個保障
- 雙方的會話內容加密,旁人不能竊取
- 雙方的身份是真實的,防止竊取者偽造身份
- 內容安全
- 非對稱加密機制加密“對稱加密所需金鑰”
- 對稱加密機制加密報文
- 身份安全
- 數字證書
- 數字簽名
- 確認傳送方身份
- 確認證書未被篡改
參考書籍:
《HTTP權威指南》
原文釋出時間為:2018年06月21日
原文作者:windlany
本文來源: 掘金 如需轉載請聯絡原作者
相關文章
- 從頭到尾完成首個 JSP 程式JS
- 如何從頭到尾做一個UI元件庫UI元件
- 十一、從頭到尾解析Hash表演算法演算法
- 從頭到尾徹底解析Hash表演算法演算法
- 從頭到尾擼一遍Flutter的一切...Flutter
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- 讓你從頭到尾把promise整的明明白白Promise
- 我們們從頭到尾說一次 Java 垃圾回收Java
- 線段樹 - 多組圖帶你從頭到尾徹底理解線段樹
- 談談 HTTPSHTTP
- 教你從頭到尾利用DQN自動玩flappy bird(全程命令提示,GPU+CPU版)APPGPU
- Java集合詳解6:這次,從頭到尾帶你解讀Java中的紅黑樹Java
- 淺談HTTPSHTTP
- 我也想來談談HTTPSHTTP
- 談一談我所瞭解的HTTPSHTTP
- 從HTTP到HTTPSHTTP
- 淺談一下“敏捷開發”敏捷
- 如何閱讀Cookbook技術書——如果我要把一本幾百上千頁的書從頭讀到尾,應該怎樣有效閱讀。
- 從一串字串中匹配URL地址 正則 (可以沒有http或https開頭)字串HTTP
- Nginx:配置HTTPS網址加上綠鎖頭NginxHTTP
- 從Chrome原始碼看HTTPSChrome原始碼HTTP
- 從 HTTP 到 HTTPS 再到 HSTSHTTP
- 從HTTP到HTTPS再到HSTSHTTP
- HTTP2和HTTPS來不來了解一下?HTTP
- 談談HTTPS安全認證,抓包與反抓包策略HTTP
- 技術分享 | 淺談一下大頁
- 淺談一下我瞭解的PWA
- 談一下使用 rsync for windows 的感受(轉)Windows
- 也談一下檔案上傳 (轉)
- 從 React render 談談效能優化React優化
- 從撤銷 rebase 談談 git 原理Git
- 從 原始碼 談談 redux compose原始碼Redux
- 淺談推進全站HTTPS專案-工程篇HTTP
- 帶你從零到一理解 HTTPSHTTP
- IP地址從頭說(轉)
- 來談談限流-從概念到實現
- 談談元件化-從原始碼到理解元件化原始碼
- 從 React Router 談談路由的那些事React路由