1
序言
今天來(lái)聊一聊https 安全傳輸?shù)脑怼?/p>
在開始之前,我們來(lái)虛構(gòu)兩個(gè)人物, 一個(gè)是位于中國(guó)的張大胖(怎么又是你??。?還有一個(gè)是位于米國(guó)的Bill (怎么還是你?!)。
這倆哥們隔著千山萬(wàn)水,通過(guò)網(wǎng)絡(luò)聯(lián)系上了, 兩個(gè)人臭味相投,聊得火熱。
此時(shí)正值米國(guó)大選, 張大胖親切地“致電”Bill, 對(duì)米國(guó)總統(tǒng)大選的情況表示強(qiáng)烈地關(guān)注。 Bill則回電說(shuō)謝謝關(guān)心米國(guó)人的事情我們米國(guó)人自己做主,不用你們歪果仁瞎操心......
張大胖繼續(xù)“致電”說(shuō)其實(shí)我們支持特朗普, 因?yàn)橄@锾榫w化,太難打交道了, 我們挺希望看到特朗普上臺(tái)這樣米國(guó)就會(huì)變成 The Divided State of America ......
Bill 回電: 拉倒你吧你, 我們米國(guó)的政體有著強(qiáng)大的糾錯(cuò)性, 雖然有時(shí)候發(fā)展得慢, 有時(shí)候會(huì)走上岔路, 但很快就會(huì)回到正途,幾百年來(lái)穩(wěn)定得很,不像你們像坐了過(guò)山車一樣.....
兩個(gè)人越聊越投機(jī),天南地北,海闊天空,還夾雜著不少隱私的話題。
2
總是有一種被偷看的感覺
有一天, Bill 突然意識(shí)到: 壞了, 我們的通信是明文的, 這簡(jiǎn)直就是網(wǎng)絡(luò)上裸奔啊, 任何一個(gè)不懷好意的家伙都可以監(jiān)聽我們通信,打開我們發(fā)送的數(shù)據(jù)包,窺探我們的隱私啊。
張大胖說(shuō): “你不早點(diǎn)說(shuō),我剛才是不是把我的微信號(hào)給你發(fā)過(guò)去了? 我是不是告訴你我上周去哪兒旅游了? 估計(jì)已經(jīng)被人截取了吧!”
Bill 提議: “要不我們做個(gè)數(shù)據(jù)的加密? 每次傳輸之前, 你把消息用一個(gè)加密算法加密, 然后發(fā)到我這里以后我再解密, 這樣別人就無(wú)法偷窺了,像這樣: ”

張大胖冰雪聰明,一看就明白了, 這加密和解密算法是公開的,那個(gè)密鑰是保密的, 只有兩人才知道, 這樣生成的加密消息(密文) 別人就無(wú)法得知了。 他說(shuō): “Bill 老兄,你生成一個(gè)密鑰, 然后把密鑰發(fā)給我, 咱們這就開啟加密消息, 讓那些偷窺狂人們哭去吧!”
(碼農(nóng)翻身注:這叫對(duì)稱加密算法, 因?yàn)榧用芎徒饷苡玫氖峭粋€(gè)密鑰)
一炷香功夫過(guò)去了, Bill 還是沒有回音, 張大胖忍不住地催促: “快發(fā)????。?!”
Bill 終于回復(fù)了: “ 我感覺有一雙眼睛正在虎視眈眈地盯著我們的通話, 如果我把密鑰發(fā)給你, 也被他截取了, 那加密豈不白費(fèi)工夫?”
張大胖沉默了, 是啊, 網(wǎng)絡(luò)是不安全的, 這密鑰怎么安全地發(fā)過(guò)來(lái)啊 ?
“奧,對(duì)了,我下周要去米國(guó)旅游,到時(shí)候我們見一面,把密碼確定下來(lái),寫到紙上,誰(shuí)也偷不走, 這不就結(jié)了?”
“哈哈, 這倒是終極解決之道 ” Bill 笑了, “不過(guò),我不僅僅和你聊天, 我還要和易卜拉欣,阿卜杜拉, 弗拉基米爾,克里斯托夫,瑪格麗特, 橋本龍?zhí)桑?李賢俊, 許木木,郭芙蓉,呂秀才等人通信, 我總不能打著飛的,滿世界的和人交換密碼吧? ”
張大胖心里暗自佩服Bill同學(xué)的好友竟然遍布全球,看來(lái)他對(duì)加密通信的要求更加強(qiáng)烈啊!
可是這個(gè)加密解密算法需要的密鑰雙方必須得知道啊, 但是密鑰又無(wú)法通過(guò)網(wǎng)絡(luò)發(fā)送, 這該死的偷窺者!
3
RSA : 非對(duì)稱加密
Bill 和 張大胖的通信無(wú)法加密,說(shuō)話謹(jǐn)慎了不少, 直到有一天, 他們聽說(shuō)了一個(gè)叫做RSA的非對(duì)稱加密算法,一下子來(lái)了靈感。
這個(gè)RSA算法非常有意思,它不是像之前的算法, 雙方必須協(xié)商一個(gè)保密的密鑰, 而是有一對(duì)兒鑰匙, 一個(gè)是保密的,稱為私鑰,另外一個(gè)是公開的,稱為公鑰。
更有意思的是,用私鑰加密的數(shù)據(jù),只有對(duì)應(yīng)的公鑰才能解密,用公鑰加密的數(shù)據(jù), 只有對(duì)應(yīng)的私鑰才能解密。
有了這兩個(gè)漂亮的特性, 當(dāng)張大胖給Bill發(fā)消息的時(shí)候, 就可以先用Bill的公鑰去加密(反正Bill的公鑰是公開的,地球人都知道), 等到消息被Bill 收到后, 他就可以用自己的私鑰去解密(只有Bill才能解開,私鑰是保密的 )
反過(guò)來(lái)也是如此, 當(dāng)Bill 想給張大胖發(fā)消息的時(shí)候,就用張大胖的公鑰加密, 張大胖收到后,就用自己的私鑰解密。
這樣以來(lái),通信安全固若金湯, 沒有任何人能窺探他們的小秘密了。
4
非對(duì)稱加密+對(duì)稱加密
兩人實(shí)驗(yàn)了幾次, 張大胖說(shuō): “Bill , 你有沒有感覺這個(gè)RSA的加密和解密有點(diǎn)慢???”
Bill嘆了口氣 :“是啊, 我也注意到了, 剛才搜了一下,這個(gè)RSA算法比之前的對(duì)稱密鑰算法要慢上百倍。我們就是加個(gè)密而已,現(xiàn)在搞得都沒法用了”
“回到咱們最初的問(wèn)題,我們想用一個(gè)密鑰來(lái)加密通信,那個(gè)對(duì)稱加密算法是非??斓?,但是苦于密鑰無(wú)法安全傳輸, 現(xiàn)在有了RSA ,我想可以結(jié)合一下, 分兩步走 (1) 我生成一個(gè)對(duì)稱加密算法的密鑰, 用RSA的方式安全發(fā)給你, (2) 我們隨后就不用RSA了, 只用這個(gè)密鑰,利用對(duì)稱加密算法來(lái)通信, 如何? ”
Bill 說(shuō): “你小子可以啊, 這樣以來(lái)既解決了密鑰的傳遞問(wèn)題, 又解決了RSA速度慢的問(wèn)題,不錯(cuò)?!?/p>
于是兩人就安全地傳遞了對(duì)稱加密的密鑰, 用它來(lái)加密解密,果然快多了!
5
中間人攻擊
張大胖把和Bill 聊天的情況給老婆匯報(bào)了一次。
老婆告誡他說(shuō): “你要小心啊, 你確定網(wǎng)絡(luò)那邊坐著的確實(shí)是Bill ?”
張大胖著急地辯解說(shuō):“肯定是他啊,我都有他的公鑰,我們倆的通信都是加密的。”
老婆提醒道:"假如啊,Bill給你發(fā)公鑰的時(shí)候, 有個(gè)中間人,截取了Bill的公鑰, 然后把自己的公鑰發(fā)給了你,冒充Bill ,你發(fā)的消息就用中間人的公鑰加了密, 那中間人不就可以解密看到消息了?"
張大胖背后出汗了,是啊,這個(gè)中間人解密以后,還可以用Bill的公鑰加密,發(fā)給Bill , Bill和我根本都意識(shí)不到, 還以為我們?cè)诎踩珎鬏斈兀?/p>
看來(lái)問(wèn)題出現(xiàn)在公鑰的分發(fā)上! 雖然這個(gè)東西是公開的, 但是在別有用心的人看來(lái),截取以后還可以干壞事 !
6
你到底是誰(shuí)?
但是怎么安全地分發(fā)公鑰呢? 似乎又回到了最初的問(wèn)題: 怎么安全的保護(hù)密鑰?
可是似乎和最初的問(wèn)題還不一樣,這一次的公鑰不用保密,但是一定得有個(gè)辦法聲明這個(gè)公鑰確實(shí)是Bill的, 而不是別人的。
怎么聲明呢?
張大胖突然想到: 現(xiàn)實(shí)中有公證處,它提供的公證材料大家都信任,那在網(wǎng)絡(luò)世界也可以建立一個(gè)這樣的具備公信力的認(rèn)證中心, 這個(gè)中心給大家頒發(fā)一個(gè)證書, 用于證明一個(gè)人的身份。
這個(gè)證書里除了包含一個(gè)人的基本信息之外,還有包括最關(guān)鍵的一環(huán):這個(gè)人的公鑰!
這樣以來(lái)我拿到證書就可以安全地取到公鑰了 ! 完美!
可是Bill 馬上潑了一盆冷水:證書怎么安全傳輸? 要是證書傳遞的過(guò)程中被篡改了怎么辦?
張大胖心里不由地咒罵起來(lái): 我操, 這簡(jiǎn)直就是雞生蛋,蛋生雞的問(wèn)題啊。
天無(wú)絕人之路, 張大胖很快就找到了突破口: 數(shù)字簽名。
簡(jiǎn)單來(lái)講是這樣的, Bill可以把他的公鑰和個(gè)人信息用一個(gè)Hash算法生成一個(gè)消息摘要, 這個(gè)Hash算法有個(gè)極好的特性,只要輸入數(shù)據(jù)有一點(diǎn)點(diǎn)變化,那生成的消息摘要就會(huì)有巨變,這樣就可以防止別人修改原始內(nèi)容。
可是作為攻擊者的中間人笑了: “雖然我沒辦法改公鑰,但是我可以把整個(gè)原始信息都替換了, 生成一個(gè)新的消息摘要, 你不還是辨別不出來(lái)?”
張大胖說(shuō)你別得意的太早 , 我們會(huì)讓有公信力的認(rèn)證中心(簡(jiǎn)稱CA)用它的私鑰對(duì)消息摘要加密,形成簽名:
這還不算, 還把原始信息和數(shù)據(jù)簽名合并, 形成一個(gè)全新的東西,叫做“數(shù)字證書”
張大胖接著說(shuō):當(dāng)Bill把他的證書發(fā)給我的時(shí)候, 我就用同樣的Hash 算法, 再次生成消息摘要,然后用CA的公鑰對(duì)數(shù)字簽名解密, 得到CA創(chuàng)建的消息摘要, 兩者一比,就知道有沒有人篡改了!
如果沒人篡改, 我就可以安全的拿到Bill的公鑰嘍,有了公鑰, 后序的加密工作就可以開始了。
雖然很費(fèi)勁, 但是為了防范你們這些偷窺者,實(shí)在是沒辦法啊。

中間人惡狠狠地說(shuō): “算你小子狠! 等著吧,我還有別的招。 對(duì)了,我且問(wèn)你, 你這個(gè)CA的公鑰怎么拿到? 難道不怕我在你傳輸CA公鑰的時(shí)候發(fā)起中間人攻擊嗎? 如果我成功的偽裝成了CA,你這一套體系徹底玩完。”
張大胖語(yǔ)塞了,折騰了半天,又回到了公鑰安全傳輸?shù)膯?wèn)題!
不過(guò)轉(zhuǎn)念一想,想解決雞生蛋,蛋生雞的問(wèn)題必須得打破這個(gè)怪圈才行,我必須得信任CA,并且通過(guò)安全的的方式獲取他們的公鑰,這樣才能把游戲玩下去。
(公眾號(hào)碼農(nóng)翻身注:這些CA本身也有證書來(lái)證明自己的身份,并且CA的信用是像樹一樣分級(jí)的,高層的CA給底層的CA做信用背書,而操作系統(tǒng)/瀏覽器中會(huì)內(nèi)置一些頂層的CA的證書,相當(dāng)于你自動(dòng)信任了他們?!∵@些頂層的CA證書一定得安全地放入操作系統(tǒng)/瀏覽器當(dāng)中,否則世界大亂。)
7
https
終于可以介紹https了,前面已經(jīng)介紹了https的原理, 你把張大胖替換成瀏覽器, 把Bill 替換成某個(gè)網(wǎng)站就行了。
一個(gè)簡(jiǎn)化的(例如下圖沒有包含Pre-Master Secret)https流程圖是這樣的, 如果你理解了前面的原理,這張圖就變得非常簡(jiǎn)單:
(完)