本文為原創(chuàng)文章,如需轉(zhuǎn)載請(qǐng)注明出處,謝謝!
概述:
1.簡(jiǎn)述 Https 每個(gè)環(huán)節(jié)都做了什么
2.解釋 Https 為什么安全文中將使用 Client 和 Server 代表客戶端和服務(wù)端
前提
Https 涉及加密的知識(shí):
- 對(duì)稱加密、非對(duì)稱加密(公鑰加密)
- 消息摘要 Message Digest、消息認(rèn)證碼 Message Authentication Code
- 數(shù)字簽名 Digital Signature
- 證書認(rèn)證 Certification Authority
如果讀者對(duì)上面任何一個(gè)名詞陌生,請(qǐng)參考這篇文章:
https://foofish.net/https-story-1.html
我讀完此文,受益匪淺!之后的文章我會(huì)在每一環(huán)節(jié)的闡述中捎帶、粗略地解釋一下上面的內(nèi)容,還是強(qiáng)烈建議不懂上述內(nèi)容的同學(xué)認(rèn)真地學(xué)一下那篇文章。
一、Client 向 Server 提供支持的加密算法

首先 Client 向 Server 發(fā)送一條消息,包括 Client 各種支持的加密算法、協(xié)議版本以及壓縮算法。目的是通知 Server 在所給的算法中選擇一種,以便于之后通信的加解密。
同時(shí),Client 會(huì)在本端生成一段隨機(jī)數(shù)作為之后對(duì)稱加密的私鑰,現(xiàn)在來簡(jiǎn)單解釋一下對(duì)稱加密和 Client 的私鑰。舉個(gè)平時(shí)的栗子,你肯定要和你女朋友共享銀行卡的密碼(不要問為什么),假設(shè)你是 Client,女朋友是 Server,銀行卡是之后傳輸?shù)拿芪?,你設(shè)置的密碼就是密鑰。你在家里悄悄地把密碼告訴了你女朋友,密碼天知地知你知你女朋友知,這時(shí)候就算銀行卡丟了也不怕,因?yàn)闆]有第三個(gè)知道密碼(密鑰),所以錢(機(jī)密信息)就不會(huì)被竊取,這就是對(duì)稱加密。
二、Server 響應(yīng) Client,傳送證書以及確認(rèn)信息

Server 收到 Client 的消息后,會(huì)做出一次響應(yīng)?;貜?fù)信息中主要包含圖中的三部分,其中證書是最重要的一部分,現(xiàn)在就來說一下證書都包含哪些東西,其作用到底是什么。這一部分要說的內(nèi)容比較多,做好心理準(zhǔn)備~
首先,說一下證書中都包含哪些信息:一些個(gè)人信息,如用戶的姓名、組織、郵箱地址等,除此之外包含了服務(wù)器生成的公鑰。公鑰就是公鑰加密(非對(duì)稱加密)的組成部分之一,還有一部分就是私鑰,現(xiàn)在繼續(xù)上一節(jié)的栗子講什么是公鑰加密。
有一天,你在家中告訴你女朋友銀行卡密碼,恰巧隔墻有耳(攻擊者竊取了密鑰),于是你的錢財(cái)就受到了威脅,因?yàn)槟莻€(gè)人隨時(shí)可能盜刷你的銀行卡。那怎么解決呢?你想了個(gè)好辦法,你買了一把鎖(公鑰),只配兩把鑰匙(私鑰),你和你女朋友各執(zhí)一把。然后你和你女朋友說,我每周會(huì)往床頭的柜子里寫一個(gè)密碼條(對(duì)稱加密的密鑰),那就是咱們銀行卡的密碼。這樣一來,除你二人沒人能打開柜子拿到密碼,就保證了安全。
所以公鑰加密就是 Server 生成一對(duì)密鑰(公鑰和私鑰),然后私鑰自己保留,相當(dāng)于一把鑰匙,公鑰相當(dāng)于是一把鎖,任何人都可以拿到,但鑰匙卻只有一把,這樣用此鎖鎖住的東西就絕對(duì)安全了。
明白了什么是公鑰加密后,現(xiàn)在又面臨了一個(gè)問題,Server 在給 Client 傳送公鑰的過程中,公鑰被攻擊者掉包了。也就是 Client 誤使用了攻擊者的鎖,這樣密鑰就被攻擊者套走了,之后的通信就完全暴露了,所以 Client 需要清楚鎖到底是不是從 Server 傳來的,這就需要將鎖(公鑰)放到證書中,并將證書交給權(quán)威機(jī)構(gòu)(CA)做認(rèn)證,只有 CA 認(rèn)證過的鎖 Client 才會(huì)使用。
那么下一個(gè)問題來了,CA 是如何讓 Client 相信公鑰是安全的呢?就是使用數(shù)字簽名技術(shù),現(xiàn)在來簡(jiǎn)單解釋一下什么是數(shù)字簽名。
簡(jiǎn)單來說,數(shù)字簽名就是反著使用公鑰加密,剛才說過公鑰加密中鑰匙只有一把(私鑰只有一個(gè)),所以數(shù)字簽名就是用鎖來試鑰匙,如果鎖被打開了,
證明鎖一定是你的,因?yàn)橹挥心阌需€匙,賴賬也沒用。
具體來說,CA 使用自己的私鑰通過某種 Hash 算法對(duì) Server 證書中的公鑰進(jìn)行 Hash 運(yùn)算得到了一個(gè) Hash 串,然后將 Hash 串寫在證書里一并交給 Client,便于 Client 進(jìn)行認(rèn)證。Client 使用 CA 提供的公鑰(鎖,任何人都能拿到)通過 Hash 運(yùn)算也得到一個(gè) Hash 串,和證書中的做對(duì)比,如果相同則證明證書一定是 CA 認(rèn)證過的,是安全的,這就是用鎖去試驗(yàn)鑰匙的過程。
三、Client 檢驗(yàn)證書合法性

上一節(jié)中其實(shí)已經(jīng)說了 Client 如何認(rèn)證證書合法性了,假若證書驗(yàn)證沒通過,一般情況下程序會(huì)拋出異常,處理異常時(shí)可以選擇與 Server 斷開連接。這一節(jié)主要說證書認(rèn)證通過之后,Client 又做了那些事。
證書成功認(rèn)證之后,Client 首先會(huì)對(duì)第一步中生成的那段隨機(jī)數(shù)進(jìn)行 Hash 運(yùn)算,然后使用證書中的公鑰對(duì)隨機(jī)數(shù)進(jìn)行加密。之后會(huì)生成一條消息,并將 Hash 串和密文放到消息中發(fā)送給 Server。
在消息傳遞的過程中,解密的私鑰只有 Server 才有,所以密文在傳輸過程中絕對(duì)安全。還有一個(gè)風(fēng)險(xiǎn)就是攻擊者可能會(huì)把消息篡改,這時(shí),Hash 串的作用就體現(xiàn)出來了。通過 Hash 串防篡改的技術(shù)就是消息摘要,現(xiàn)在來簡(jiǎn)單地說一下消息摘要。
簡(jiǎn)單來說,消息摘要就是通過不可逆的算法生成一段 Hash 串,也就是一旦 Hash 串生成了,就無法在通過其他手段將其還原回原來的樣子。所以如果原始內(nèi)容的 Hash 值確定了,就證明了內(nèi)容的完整和可靠性,一旦內(nèi)容被修改,Hash 串必定和之前不同。
四、 Server 解密取出隨機(jī)數(shù),并向 Client 發(fā)送握手消息

Server 收到 Client 發(fā)送的消息后,將密文用私鑰解密得到了隨機(jī)數(shù)。然后需要用同樣的消息摘要算法對(duì)隨機(jī)數(shù)進(jìn)行運(yùn)算,將算出來的 Hash 串與消息中的 Hash 串對(duì)比,如果內(nèi)容完全一致,則繼續(xù)后面的流程,如果不一致就會(huì)斷開連接。
如果隨機(jī)數(shù)無誤,Server 就會(huì)準(zhǔn)備一條握手消息,并且會(huì)使用之前和 Client 確認(rèn)過的對(duì)稱加密算法對(duì)消息加密,密鑰就是隨機(jī)數(shù)。同樣的,為防止消息被篡改,需要用消息摘要對(duì)消息進(jìn)行處理。
密鑰通過公鑰加密的方式傳遞過來,之后每條消息都用此密鑰加密,從而保證了內(nèi)容的安全。
五、總結(jié)完整過程
這里盜用一張圖

相信看完前面的內(nèi)容已經(jīng)大致明白了 https 的流程,看著上面??的圖,可把流程大致總結(jié)為:
- 用公鑰加密的方式安全地運(yùn)送 random key
- 之后用 random key 作為密鑰進(jìn)行對(duì)稱加密,保障通信內(nèi)容的安全
到這里有同學(xué)肯定會(huì)有這樣的疑問:
既然公鑰加密就已經(jīng)能保證安全了,為何不所有通信都用公鑰加密呢?這其實(shí)就說到了公鑰加密的一個(gè)致命缺點(diǎn),就是公鑰加密的效率很低,所以公鑰加密只使用一次。而對(duì)稱加密的效率高于公鑰加密,所以在之后的通信中會(huì)頻繁的使用。
可以說 https 安全的精髓就在于非對(duì)稱加密和對(duì)稱加密的完美結(jié)合使用!
我也是個(gè)初學(xué)者,可能有些細(xì)節(jié)描述的不準(zhǔn)確
如寫的有問題,可在簡(jiǎn)書中給我留言!感謝!