從頭到尾談一下HTTPS

2021-10-07 18:17:08 字數 2721 閱讀 3686

「你能談一下https嗎?」

「一種比http安全的協議。」

如果面試這樣說的話那差不多就gg了,其實https要展開回答的話內容還挺豐富的。本篇文章詳細介紹了https是什麼、為什麼安全以及實現安全的方法,一起來學習吧。

本文略長,請保持耐心。

https是以安全為目標的http通道,簡單講是http的安全版。之所以安全是因為它在將http報文傳送給tcp之前,先將其傳送給了乙個安全層(通過ssl協議實現)對報文進行加密。

先了解幾個術語

比如我們有乙個加密函式,演算法如下

function

e(key, p)

e(3, "ab"); //

de

明文: "ab" ------ 密文: "de" ------ 金鑰:3

如果我們的金鑰不一樣那麼我們的加密函式執行結果就會不同。

下面來看一下常見的幾種加密機制。

我們之前說過,讓報文加密是為了保證我兩的聊天內容是秘密的,只有我兩能看懂,別人看不懂。那麼我們要約定乙個加密方式,比如咱倆遞小紙條交流的時候把小紙條裝在乙個盒子裡,然後只有我們有這個盒子的鑰匙。其他人就算拿到這個盒子他也打不開,那就無從竊取內容了。

對稱加密就是這個意思:傳送方用金鑰將明文加密,接收方用同樣的金鑰解密。

雖然安全性得到了保障,但是還是存在兩個問題:

非對稱加密和對稱加密是反著幹的,對稱加密是使用同乙個金鑰,而非對稱加密使用了兩個不同的金鑰:公鑰、私鑰,乙個金鑰加密的內容只能由另乙個金鑰解開。

公鑰是眾所周知的,而私鑰只有主機才持有。

伺服器生成了公鑰a和私鑰b,當客戶端想給該伺服器傳送報文時,首先找到伺服器的公鑰,然後根據公鑰a將報文加密,伺服器用私鑰b解密。同理,當伺服器想給該客戶端傳送報文時,首先找到客戶端的公鑰c,然後根據公鑰c將報文加密,客戶端用自己的私鑰d解密。

在確保了資訊保安的同時又可以方便金鑰的管理。

由此,對稱加密和非對稱加密的區別是:

.對稱加密

非對稱加密

金鑰加密解密用相同金鑰

公鑰、私鑰,乙個加密另乙個解密

金鑰管理金鑰數量大,不方便

每個主機只需管理一對公鑰、私鑰

安全性不安全(並非該機制不安全,而是雙方在約定金鑰時可能會金鑰洩露)

安全(不需要通過對話約定金鑰)

加/解密速度

慢 那https是採用的什麼機制呢?

劇透,https對報文採用的對稱加密。

(1) 客戶端通過tcp三次握手建立到伺服器端口443(https的預設埠)的tcp連線

(2) 客戶端通過ssl握手建立安全層

(3) 客戶端傳送http報文到ssl安全層,安全層將報文加密後發給tcp --> ip --> ...

(4) 同理伺服器傳送響應,客戶端接收後通過ssl安全層解密發給應用層

(5) ssl安全層關閉通知

(6) tcp關閉連線

從上面的描述可以清晰的看到我們的報文加密/解密都是在ssl安全層執行。

那麼安全層是怎麼加密的?金鑰又是怎麼約定的?這一切的一切都得仔細聊聊第(2)步驟。

(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))等,以及證書的序列號、證書簽名演算法、過期日期等證書資訊。

證書是乙個站點的身份證,但是身份證也可以被偽造,為了保證這個證書是真的我們需要數字簽名。我們會將證書內容用簽名演算法生成乙個值,我們稱之為「摘要」。然後將該摘要用主機的私鑰加密,加密後的內容就是我們的數字簽名。

如果公鑰解密後得到的摘要與生成的摘要不符那麼可能有兩種情況

內容安全

身份安全

《http權威指南》

從頭到尾寫SQL 一

大二的時候學長說,要學東西真的要從頭到尾寫到部落格上,現在作為大五老學渣來看,真的好有道理。那就從這個貼開始吧,寫乙個sql的系列。現在來看,怎樣能把計算機內的各種資料儲存在一起並且將之分類呢?資料庫提供了很好的解決辦法,廣義上資料庫就是存放資料的倉庫,便於我們查詢歸納。當資料越來越多時,你會發現使...

從頭到尾 餐飲管理系統 (一)

從頭到尾 餐飲管理系統 一 1 出這套教程的目的,一方面是希望能夠激起大家對軟體開發的熱情和積極性,另一方面是把我對軟體開發的一些心得和知識分享給大家。這套教程如果對您有所幫助,萬分榮幸,若有不當之處,還望見諒 勿噴 的情況下,您可以自由的 分發 傳播此教程。與我取得聯絡,本人將萬分感激!1 系統預...

從頭到尾做乙個LED跑馬燈

在公司尾牙 年終聚餐 上為了讓那張活動記分表不那麼單調,我想把它的旁邊加一些跑馬燈了美化一下.於是乎就來自己動手來自己做乙個.畢竟自己是搞這行的嘛.先看看效果圖 因為自己是偏軟的所以有很多任務作都是請教公司的前輩來協助的.再來看看電路圖 保留下次上傳 嗯,因為說了要從頭到尾做乙個跑馬燈嘛,所以先一些...