本文為原創(chuàng)文章,如需轉(zhuǎn)載請(qǐng)注明出處,謝謝!
概述:
1.簡(jiǎn)述 Https 每個(gè)環(huán)節(jié)都做了什么
2.解釋 Https 為什么安全文中將使用 Client 和 Server 代表客戶(hù)端和服務(wù)端
前提
Https 涉及加密的知識(shí):
- 對(duì)稱(chēng)加密炬丸、非對(duì)稱(chēng)加密(公鑰加密)
- 消息摘要 Message Digest、消息認(rèn)證碼 Message Authentication Code
- 數(shù)字簽名 Digital Signature
- 證書(shū)認(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ì)稱(chēng)加密的私鑰代承,現(xiàn)在來(lái)簡(jiǎn)單解釋一下對(duì)稱(chēng)加密和 Client 的私鑰汁蝶。舉個(gè)平時(shí)的栗子,你肯定要和你女朋友共享銀行卡的密碼(不要問(wèn)為什么)论悴,假設(shè)你是 Client掖棉,女朋友是 Server,銀行卡是之后傳輸?shù)拿芪陌蚬溃阍O(shè)置的密碼就是密鑰幔亥。你在家里悄悄地把密碼告訴了你女朋友,密碼天知地知你知你女朋友知察纯,這時(shí)候就算銀行卡丟了也不怕帕棉,因?yàn)闆](méi)有第三個(gè)知道密碼(密鑰),所以錢(qián)(機(jī)密信息)就不會(huì)被竊取饼记,這就是對(duì)稱(chēng)加密香伴。
二、Server 響應(yīng) Client握恳,傳送證書(shū)以及確認(rèn)信息
Server 收到 Client 的消息后瞒窒,會(huì)做出一次響應(yīng)∠缤荩回復(fù)信息中主要包含圖中的三部分崇裁,其中證書(shū)是最重要的一部分,現(xiàn)在就來(lái)說(shuō)一下證書(shū)都包含哪些東西束昵,其作用到底是什么拔稳。這一部分要說(shuō)的內(nèi)容比較多,做好心理準(zhǔn)備~
首先锹雏,說(shuō)一下證書(shū)中都包含哪些信息:一些個(gè)人信息巴比,如用戶(hù)的姓名、組織、郵箱地址等轻绞,除此之外包含了服務(wù)器生成的公鑰采记。公鑰就是公鑰加密(非對(duì)稱(chēng)加密)的組成部分之一,還有一部分就是私鑰政勃,現(xiàn)在繼續(xù)上一節(jié)的栗子講什么是公鑰加密唧龄。
有一天,你在家中告訴你女朋友銀行卡密碼奸远,恰巧隔墻有耳(攻擊者竊取了密鑰)既棺,于是你的錢(qián)財(cái)就受到了威脅,因?yàn)槟莻€(gè)人隨時(shí)可能盜刷你的銀行卡懒叛。那怎么解決呢丸冕?你想了個(gè)好辦法,你買(mǎi)了一把鎖(公鑰)薛窥,只配兩把鑰匙(私鑰)胖烛,你和你女朋友各執(zhí)一把。然后你和你女朋友說(shuō)诅迷,我每周會(huì)往床頭的柜子里寫(xiě)一個(gè)密碼條(對(duì)稱(chēng)加密的密鑰)洪己,那就是咱們銀行卡的密碼。這樣一來(lái)竟贯,除你二人沒(méi)人能打開(kāi)柜子拿到密碼,就保證了安全逝钥。
所以公鑰加密就是 Server 生成一對(duì)密鑰(公鑰和私鑰)屑那,然后私鑰自己保留,相當(dāng)于一把鑰匙艘款,公鑰相當(dāng)于是一把鎖持际,任何人都可以拿到,但鑰匙卻只有一把哗咆,這樣用此鎖鎖住的東西就絕對(duì)安全了蜘欲。
明白了什么是公鑰加密后,現(xiàn)在又面臨了一個(gè)問(wèn)題晌柬,Server 在給 Client 傳送公鑰的過(guò)程中姥份,公鑰被攻擊者掉包了。也就是 Client 誤使用了攻擊者的鎖年碘,這樣密鑰就被攻擊者套走了澈歉,之后的通信就完全暴露了,所以 Client 需要清楚鎖到底是不是從 Server 傳來(lái)的屿衅,這就需要將鎖(公鑰)放到證書(shū)中埃难,并將證書(shū)交給權(quán)威機(jī)構(gòu)(CA)做認(rèn)證,只有 CA 認(rèn)證過(guò)的鎖 Client 才會(huì)使用。
那么下一個(gè)問(wèn)題來(lái)了涡尘,CA 是如何讓 Client 相信公鑰是安全的呢忍弛?就是使用數(shù)字簽名技術(shù),現(xiàn)在來(lái)簡(jiǎn)單解釋一下什么是數(shù)字簽名考抄。
簡(jiǎn)單來(lái)說(shuō)细疚,數(shù)字簽名就是反著使用公鑰加密,剛才說(shuō)過(guò)公鑰加密中鑰匙只有一把(私鑰只有一個(gè))座泳,所以數(shù)字簽名就是用鎖來(lái)試鑰匙惠昔,如果鎖被打開(kāi)了,
證明鎖一定是你的挑势,因?yàn)橹挥心阌需€匙镇防,賴(lài)賬也沒(méi)用。
具體來(lái)說(shuō)潮饱,CA 使用自己的私鑰通過(guò)某種 Hash 算法對(duì) Server 證書(shū)中的公鑰進(jìn)行 Hash 運(yùn)算得到了一個(gè) Hash 串来氧,然后將 Hash 串寫(xiě)在證書(shū)里一并交給 Client,便于 Client 進(jìn)行認(rèn)證香拉。Client 使用 CA 提供的公鑰(鎖啦扬,任何人都能拿到)通過(guò) Hash 運(yùn)算也得到一個(gè) Hash 串,和證書(shū)中的做對(duì)比凫碌,如果相同則證明證書(shū)一定是 CA 認(rèn)證過(guò)的扑毡,是安全的,這就是用鎖去試驗(yàn)鑰匙的過(guò)程盛险。
三瞄摊、Client 檢驗(yàn)證書(shū)合法性
上一節(jié)中其實(shí)已經(jīng)說(shuō)了 Client 如何認(rèn)證證書(shū)合法性了,假若證書(shū)驗(yàn)證沒(méi)通過(guò),一般情況下程序會(huì)拋出異常,處理異常時(shí)可以選擇與 Server 斷開(kāi)連接数初。這一節(jié)主要說(shuō)證書(shū)認(rèn)證通過(guò)之后,Client 又做了那些事惯驼。
證書(shū)成功認(rèn)證之后,Client 首先會(huì)對(duì)第一步中生成的那段隨機(jī)數(shù)進(jìn)行 Hash 運(yùn)算递瑰,然后使用證書(shū)中的公鑰對(duì)隨機(jī)數(shù)進(jìn)行加密祟牲。之后會(huì)生成一條消息,并將 Hash 串和密文放到消息中發(fā)送給 Server抖部。
在消息傳遞的過(guò)程中疲眷,解密的私鑰只有 Server 才有,所以密文在傳輸過(guò)程中絕對(duì)安全您朽。還有一個(gè)風(fēng)險(xiǎn)就是攻擊者可能會(huì)把消息篡改狂丝,這時(shí)换淆,Hash 串的作用就體現(xiàn)出來(lái)了。通過(guò) Hash 串防篡改的技術(shù)就是消息摘要几颜,現(xiàn)在來(lái)簡(jiǎn)單地說(shuō)一下消息摘要倍试。
簡(jiǎn)單來(lái)說(shuō),消息摘要就是通過(guò)不可逆的算法生成一段 Hash 串蛋哭,也就是一旦 Hash 串生成了县习,就無(wú)法在通過(guò)其他手段將其還原回原來(lái)的樣子。所以如果原始內(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)算,將算出來(lái)的 Hash 串與消息中的 Hash 串對(duì)比云挟,如果內(nèi)容完全一致梆砸,則繼續(xù)后面的流程,如果不一致就會(huì)斷開(kāi)連接园欣。
如果隨機(jī)數(shù)無(wú)誤帖世,Server 就會(huì)準(zhǔn)備一條握手消息,并且會(huì)使用之前和 Client 確認(rèn)過(guò)的對(duì)稱(chēng)加密算法對(duì)消息加密沸枯,密鑰就是隨機(jī)數(shù)狮暑。同樣的,為防止消息被篡改辉饱,需要用消息摘要對(duì)消息進(jìn)行處理。
密鑰通過(guò)公鑰加密的方式傳遞過(guò)來(lái)拣展,之后每條消息都用此密鑰加密彭沼,從而保證了內(nèi)容的安全。
五备埃、總結(jié)完整過(guò)程
這里盜用一張圖
相信看完前面的內(nèi)容已經(jīng)大致明白了 https 的流程姓惑,看著上面??的圖,可把流程大致總結(jié)為:
- 用公鑰加密的方式安全地運(yùn)送 random key
- 之后用 random key 作為密鑰進(jìn)行對(duì)稱(chēng)加密按脚,保障通信內(nèi)容的安全
到這里有同學(xué)肯定會(huì)有這樣的疑問(wèn):
既然公鑰加密就已經(jīng)能保證安全了于毙,為何不所有通信都用公鑰加密呢?這其實(shí)就說(shuō)到了公鑰加密的一個(gè)致命缺點(diǎn)辅搬,就是公鑰加密的效率很低唯沮,所以公鑰加密只使用一次脖旱。而對(duì)稱(chēng)加密的效率高于公鑰加密,所以在之后的通信中會(huì)頻繁的使用介蛉。
可以說(shuō) https 安全的精髓就在于非對(duì)稱(chēng)加密和對(duì)稱(chēng)加密的完美結(jié)合使用萌庆!
我也是個(gè)初學(xué)者,可能有些細(xì)節(jié)描述的不準(zhǔn)確
如寫(xiě)的有問(wèn)題币旧,可在簡(jiǎn)書(shū)中給我留言践险!感謝!