作者: Damonare 原文鏈接SSL協(xié)議之?dāng)?shù)據(jù)加密過(guò)程詳解
同時(shí)推薦另一篇文章,兩篇結(jié)合著理解卸例,效果更好哦好乐!
https加密原理
SSL
只要你聽(tīng)過(guò)HTTPS,不可能沒(méi)聽(tīng)過(guò)SSL協(xié)議吧绰沥,SSL協(xié)議是一種安全協(xié)議篱蝇。對(duì)于互聯(lián)網(wǎng)協(xié)議沒(méi)有了解的童鞋可以參考博主另一篇博客:internet協(xié)議入門
HTTP+SSL = HTTPS
HTTPS之所以安全就是因?yàn)榧映至薙SL這個(gè)外掛來(lái)對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行加密,那么具體的加密方法又是什么呢徽曲?
請(qǐng)聽(tīng)我娓娓道來(lái)零截。先看下面兩個(gè)概念:
對(duì)稱加密
非對(duì)稱加密
你知道上面兩個(gè)概念是什么意思么???
??OK秃臣,不管你懂不懂涧衙,我先用我的方式來(lái)給你解釋下:
親哪工,你作過(guò)弊么???不要告訴我在你漫長(zhǎng)的學(xué)生生涯里你沒(méi)作過(guò)弊(那你的學(xué)生生涯得多枯燥)弧哎,作弊我們常用的方法是啥雁比?(說(shuō)把答案寫在胳膊大腿紙條上的同學(xué)請(qǐng)你出去,謝謝??)當(dāng)然是加密了撤嫩!比如我出于人道主義偎捎,想要幫助小明同學(xué)作弊,首先考試前我們會(huì)約定好一個(gè)暗號(hào)來(lái)傳遞選擇題的答案序攘,摸頭發(fā)——A茴她,摸耳朵——B,咳嗽——C程奠,跺腳——D丈牢,于是一個(gè)加密方法就誕生了,這個(gè)加密方法只有我和小明知道瞄沙,老師雖然看我抓耳撓腮但他頂多把我當(dāng)成神經(jīng)病赡麦,并沒(méi)有直接證據(jù)說(shuō)我作弊。好帕识,這種我和小明知道泛粹,別人不知道的加密方法就是一種對(duì)稱加密算法,對(duì)稱加密算法也是我們?nèi)粘W畛R?jiàn)的加密算法。這種算法??只有一把肮疗,加密解密都用同一把鑰匙晶姊,一旦??泄露就全玩完了。
隨時(shí)時(shí)代的進(jìn)步伪货,人們發(fā)現(xiàn)實(shí)際上加密和解密不用同一把??也是可以的们衙,只要加密和解密的兩把??存在某種關(guān)系就行了。
于是碱呼,層出不窮的非對(duì)稱加密算法就被研究了出來(lái)蒙挑,那么它基于什么樣的道理呢?請(qǐng)嚴(yán)格記住下面這句話:
將a和b相乘得出乘積c很容易愚臀,但要是想要通過(guò)乘積c推導(dǎo)出a和b極難忆蚀。即對(duì)一個(gè)大數(shù)進(jìn)行因式分解極難
聽(tīng)不懂因式分解的童鞋先去面壁5分鐘,這么多年數(shù)學(xué)白學(xué)了姑裂?甩給你維基百科鏈接馋袜,自行補(bǔ)課??:因式分解
好的,我們繼續(xù)舶斧,非對(duì)稱加密算法就多了兩個(gè)概念——公鑰c和私鑰b欣鳖。
用法如下:公鑰加密的密文只能用私鑰解密,私鑰加密的密文只能用公鑰解密茴厉。
公鑰我們可以隨便公開(kāi)泽台,因?yàn)閯e人知道了公鑰毫無(wú)用處什荣,經(jīng)過(guò)公鑰加密后的密文只能通過(guò)私鑰來(lái)解密。而想要通過(guò)公鑰推導(dǎo)出a和b極難怀酷。但很明顯的是稻爬,使用非對(duì)稱加密效率不如對(duì)稱加密,因?yàn)榉菍?duì)稱加密需要有計(jì)算兩個(gè)密鑰的過(guò)程胰坟。
我們通過(guò)密碼學(xué)中的兩個(gè)典型的愛(ài)麗絲和鮑勃人物來(lái)解釋這個(gè)非對(duì)稱加密算法的過(guò)程:
客戶端叫做愛(ài)麗絲因篇,服務(wù)器叫做鮑勃泞辐。
愛(ài)麗絲: 鮑勃我要給你發(fā)送一段消息笔横,把你的公鑰給我吧;
鮑勃: OK咐吼,這是我的公鑰:234nkjdfdhjbg324**吹缔;
愛(ài)麗絲:收到公鑰,我給你發(fā)送的消息經(jīng)過(guò)公鑰加密之后是這樣的:#@#@!$%*(@;
鮑勃:好的锯茄,收到了厢塘,親,我來(lái)用我的私鑰解密看下你真正要給我發(fā)送的內(nèi)容肌幽;
上述過(guò)程就是一個(gè)非對(duì)稱加密的過(guò)程晚碾,這個(gè)過(guò)程安全么?好像是很安全喂急,即使查理(通信中的第三位參加者)截取了密文和公鑰沒(méi)有私鑰還是沒(méi)法得到明文格嘁。??非對(duì)稱加密的典型代表算法:RSA算法,筆者在另一篇博客:RSA算法詳解中也有詳細(xì)的介紹廊移。
可如果第三者查理發(fā)送給愛(ài)麗絲他自己的公鑰糕簿,然后愛(ài)麗絲用查理給的公鑰加密密文發(fā)送了出去,查理再通過(guò)自己的私鑰解密狡孔,這不就泄露信息了么懂诗?我們需要想個(gè)辦法讓愛(ài)麗絲判斷這個(gè)公鑰到底是不是鮑勃發(fā)來(lái)的。
于是就有了數(shù)字證書(shū)的概念:
數(shù)字證書(shū)就是互聯(lián)網(wǎng)通訊中標(biāo)志通訊各方身份信息的一串?dāng)?shù)字苗膝,提供了一種在Internet上驗(yàn)證通信實(shí)體身份的方式殃恒,數(shù)字證書(shū)不是數(shù)字身份證,而是身份認(rèn)證機(jī)構(gòu)蓋在數(shù)字身份證上的一個(gè)章或尤杞摇(或者說(shuō)加在數(shù)字身份證上的一個(gè)簽名)芋类。
??上面官方的解釋看起來(lái)就頭大。其實(shí)它就是一段信息界阁。
數(shù)字證書(shū)內(nèi)容大體如下:
- 簽發(fā)證書(shū)的機(jī)構(gòu)
- 鮑勃的加密算法
- 鮑勃所使用的Hash算法
- 鮑勃的公鑰
- 證書(shū)到期時(shí)間
- 等等
數(shù)字證書(shū)是由權(quán)威機(jī)構(gòu)——CA機(jī)構(gòu)統(tǒng)一來(lái)進(jìn)行發(fā)行侯繁,我們絕對(duì)信任這個(gè)機(jī)構(gòu),至于CA機(jī)構(gòu)的安全性…反正99.99%之下都是安全的泡躯。??
為了防止中間有人對(duì)證書(shū)內(nèi)容進(jìn)行更改贮竟,有了一個(gè)數(shù)字簽名的概念丽焊,所謂的數(shù)字簽名就是把以上所有的內(nèi)容做一個(gè)Hash操作,得到一個(gè)固定長(zhǎng)度然后再傳給鮑勃咕别。然而如果別人截取了這個(gè)證書(shū)然后更改內(nèi)容技健,同時(shí)生成了新的Hash值那怎么辦?處于這個(gè)考慮惰拱,CA機(jī)構(gòu)在頒發(fā)這個(gè)證書(shū)的時(shí)候會(huì)用自己的私鑰將Hash值加密雌贱,從而防止了數(shù)字證書(shū)被篡改。
好偿短,我們來(lái)梳理下整個(gè)過(guò)程:
- 第一步:首先欣孤,當(dāng)愛(ài)麗絲開(kāi)啟一個(gè)新的瀏覽器第一次去訪問(wèn)鮑勃的時(shí)候,會(huì)先讓愛(ài)麗絲安裝一個(gè)數(shù)字證書(shū)昔逗,這個(gè)數(shù)字證書(shū)里包含的主要信息就是CA機(jī)構(gòu)的公鑰降传。
- 第二步:鮑勃發(fā)送來(lái)了CA機(jī)構(gòu)頒發(fā)給自己的數(shù)字證書(shū),愛(ài)麗絲通過(guò)第一步中已經(jīng)得到的公鑰解密CA用私鑰加密的Hash-a(這個(gè)過(guò)程就是非對(duì)稱加密)勾怒,然后再用傳遞過(guò)來(lái)的HASH算法生成一個(gè)Hash-b婆排,如果Hash-a === Hash-b就說(shuō)明認(rèn)證通過(guò),確實(shí)是鮑勃發(fā)過(guò)來(lái)的笔链。
如上段只,是整個(gè)數(shù)字證書(shū)的使用過(guò)程就是這樣的。
多說(shuō)一句鉴扫,非對(duì)稱加密實(shí)際應(yīng)用的例子除了SSL還有很多赞枕,比如SSH、電子簽名等幔妨;
如上提到的鹦赎,非對(duì)稱加密計(jì)算量很大,效率不如對(duì)稱加密误堡,我們打開(kāi)網(wǎng)頁(yè)最注重的是啥古话?是速度!是速度锁施!是速度陪踩!??????
這點(diǎn)SSL就玩的很巧妙了??,通信雙方通過(guò)對(duì)稱加密來(lái)加密密文悉抵,然后使用非對(duì)稱加密的方式來(lái)傳遞對(duì)稱加密所使用的密鑰肩狂。這樣效率和安全就都能保證了。
SSL協(xié)議的握手過(guò)程
先用語(yǔ)言來(lái)闡述下:
- 第一步:愛(ài)麗絲給出支持SSL協(xié)議版本號(hào)姥饰,一個(gè)客戶端隨機(jī)數(shù)(Client random傻谁,請(qǐng)注意這是第一個(gè)隨機(jī)數(shù)),客戶端支持的加密方法等信息列粪;
- 第二步:鮑勃收到信息后审磁,確認(rèn)雙方使用的加密方法谈飒,并返回?cái)?shù)字證書(shū),一個(gè)服務(wù)器生成的隨機(jī)數(shù)(Server random态蒂,注意這是第二個(gè)隨機(jī)數(shù))等信息杭措;
- 第三步:愛(ài)麗絲確認(rèn)數(shù)字證書(shū)的有效性,然后生成一個(gè)新的隨機(jī)數(shù)(Premaster secret)钾恢,然后使用數(shù)字證書(shū)中的公鑰手素,加密這個(gè)隨機(jī)數(shù),發(fā)給鮑勃瘩蚪。
- 第四步:鮑勃使用自己的私鑰泉懦,獲取愛(ài)麗絲發(fā)來(lái)的隨機(jī)數(shù)(即Premaster secret);(第三募舟、四步就是非對(duì)稱加密的過(guò)程了)
- 第五步:愛(ài)麗絲和鮑勃通過(guò)約定的加密方法(通常是AES算法)祠斧,使用前面三個(gè)隨機(jī)數(shù)闻察,生成對(duì)話密鑰拱礁,用來(lái)加密接下來(lái)的通信內(nèi)容;
俗話說(shuō)一圖勝前言辕漂,我畫(huà)了一個(gè)圖來(lái)說(shuō)明這個(gè)過(guò)程:
OK呢灶,整個(gè)進(jìn)行數(shù)據(jù)加密的過(guò)程結(jié)束。我們?cè)賮?lái)回憶下內(nèi)容:
- CA機(jī)構(gòu)頒發(fā)數(shù)字證書(shū)給鮑勃钉嘹;
- 愛(ài)麗絲和鮑勃進(jìn)行SSL握手鸯乃,愛(ài)麗絲通過(guò)數(shù)字證書(shū)確定鮑勃的身份;
- 愛(ài)麗絲和鮑勃傳遞三個(gè)隨機(jī)數(shù)跋涣,第三個(gè)隨機(jī)數(shù)通過(guò)非對(duì)稱加密算法進(jìn)行傳遞缨睡;
- 愛(ài)麗絲和鮑勃通過(guò)一個(gè)對(duì)稱加密算法生成一個(gè)對(duì)話密鑰,加密接下來(lái)的通信內(nèi)容陈辱。