在說htttps 之前鸳谜,我們先了解一下加密膝藕,會對后面說https 好理解一點(diǎn)
一 加密方式
加密按照加密方式,可以分為以下三種方式
1.1 單向加密
叫做不可逆加密咐扭,對明文的加密產(chǎn)生一個密文芭挽,不能再通過密文,解出來對應(yīng)的明文
一般用于產(chǎn)生消息摘要蝗肪,密鑰加密等袜爪,常見的單向加密有:
- MD5 : 相信這個大家都都熟悉了,一個明文薛闪,md5 以后辛馆,對應(yīng)一個唯一的密文
- SHA : 其中又分為 sha192 , sha256
特點(diǎn):
- 不可逆
- 輸入一樣,輸出必然相同
1.2 對稱加密
對稱加密豁延,用一個密鑰昙篙,對明文進(jìn)行加密,同理诱咏,同這把密鑰瓢对,也可以對密文進(jìn)行解密
加密和解密,用同一個密鑰胰苏,這種加密方法就是 對稱加密
常用的對稱加密方法有:
- DES
- 3DES
- AES
特點(diǎn):
- 加密方和解密使用同一密鑰
- 加密解密的速度比較快
1.3 非對稱加密
對稱加密使用同一把密鑰,相反醇疼,非對稱加密腰池,使用公鑰和私鑰進(jìn)行加密解密
可以使用私鑰加密挂捻,公鑰進(jìn)行解密,同理,也可以使用公鑰加密滋将,私鑰進(jìn)行解密
常見非對稱加密方式的有:
- RSA
- DSA
我們平時最常用的就是RSA
特點(diǎn):
- 使用兩把密鑰進(jìn)行加密和解密,即公鑰和私鑰
- 公鑰加密私鑰解密损合,私鑰加密公鑰可以解密
- 加密或者解密非区,速度非常慢
- 私鑰和公鑰是成對出現(xiàn)的
二 加密知識總結(jié)
單向加密: 不可逆卵蛉,只要輸入的內(nèi)容一樣,輸出的密文一定是一樣的么库,有任何修改傻丝, 產(chǎn)生的密文都是不同的
對稱加密: 加密和解密使用同一把密鑰,加密解密速度特別快
非對稱加密: 使用公鑰和私鑰進(jìn)行加密和解密诉儒,公鑰加密私鑰解葡缰,私鑰加密公鑰解。加密解密的過程非常慢
公鑰:就是可以公開給別人的
私鑰:就是不可以公開給別人忱反,是自己私有保留的泛释。
注:以上內(nèi)容,純粹是加密的知識温算,和 https 沒有任何關(guān)系怜校。下面我們開始講解 https 的過程。我們先看一個需求
解決了這個需求注竿,就明白了 https 的過程了茄茁。
從一個需求開始
假設(shè)有這樣一個需求:小波和小浪需要通信,少男少女寫情書嘛蔓搞,肯定不想讓別人看到胰丁,所以需要安全的通信。
問題一:小波如何安全的把內(nèi)容傳給小浪喂分?
通過上面的加密知識锦庸,很容易就想到,把通信的內(nèi)容蒲祈,給加密了就行了
問題二:使用哪種加密方式加密呢甘萧?
單向加密肯定不行,小浪收到信梆掸,解不出來扬卷,這戀愛沒法談
對稱加密可以 ,小浪只要有密鑰酸钦,就可以把內(nèi)容解出來
非對稱加密也可以 怪得,小波用自己的私鑰加密,小浪拿到小波的公鑰卑硫,也可以把內(nèi)容解出來
問題三:對稱加密徒恋,非對稱加密都可以,到底使用哪種呢欢伏?
對稱加密速度快入挣,非對稱加密速度慢
對于小波,小浪這倆人來說硝拧,經(jīng)常一聊就是幾個小時径筏,數(shù)據(jù)是非常多的
如果使用非對稱加密葛假,因?yàn)榧用芤猜饷芤猜烫瘢臅r間了聊训,肯定不選擇
那么答案就是,使用對稱加密方式 夷恍,因?yàn)榧用芸彀∧д#〔ㄐ±耍汲钟型话衙荑€酿雪,雙方互相都能解密出來對方發(fā)的信遏暴。
總結(jié):小波和小浪通信,使用對稱加密指黎,假如密鑰是 S
, 雙方都使用同一把密鑰 S
進(jìn)行加密朋凉,解密
這樣小波和小浪就能愉快的通信了,而且內(nèi)容是加密的醋安,加密解密的速度也很快杂彭,這就聊咋了
但是這樣有一個隱患,就是密鑰 S
吓揪, 在傳輸?shù)倪^程中亲怠,不小心被 老王 截獲了
造成的后果就是:小波,小浪以及老王柠辞,都有相同的密鑰 S
了
那么团秽,小波和小浪之間沒有秘密可言了,他們發(fā)的信叭首,老王都能解開看习勤,看完再加密,再發(fā)給小浪焙格,這不得壞事了
那么如何解決
密鑰S
在傳輸?shù)倪^程中图毕,被別人截獲的情況呢?用
對稱加密
方式對密鑰S
進(jìn)行加密眷唉, 再傳輸予颤,那么此時的密鑰S1
也是有被截獲的風(fēng)險那就再對 S1 進(jìn)行加密,再傳輸...... 冬阳, 這樣就無限套娃了蛤虐。肯定是不得行的摩泪。
現(xiàn)在的問題,變成了:小波如何把 密鑰S
安全的傳給小浪劫谅?
問題四:小波如何安全的把密鑰S
傳輸給小浪见坑?
如果密鑰S
的傳輸過程不安全嚷掠,后面的通信就是不安全的,反之荞驴,如何密鑰S
能安全的傳輸給小浪不皆,后面的通信就是安全的。
通過上面的加密知識熊楼,有下面這樣一個安全的加密傳輸方式
- 小波使用非對稱加密進(jìn)行通信霹娄,首先小波生成了自己的一對私鑰和公鑰,為了方便鲫骗,分別叫做
privateKey
,publicKey
- 小波把
publicKey
給了小浪
-
方法一 小波用自己的
privateKey
犬耻,對密鑰S
進(jìn)行加密,加密后的密文S0
傳輸給小浪执泰,小浪用publicKey
對S0
解密出來密鑰S
-
方法二 小浪用
publicKey
對密鑰S
進(jìn)行加密枕磁,加密后的密文S0
傳輸給小波,小波用privatekey
對S0
解密出來密鑰S
上面术吝,方法一 是不可行的计济,因?yàn)樾〔ǖ?publicKey
是公開的,誰都可以下載排苍,也就是說沦寂,老王也有小波的publicKey
,也可以對S0
進(jìn)行解密出來密鑰S
方法二是可行的淘衙,因?yàn)?privateKey
只有小波有传藏,小浪用小波的公鑰進(jìn)行加密,只有小波能解開幔翰,其它任何人都解不開
所以上面的解決方案就是:
使用非對稱加密
方式漩氨,對密鑰S
進(jìn)行加密,進(jìn)行傳輸
有人說遗增,不對啊叫惊,非對稱加密
性能不好,加密解密特別慢做修,要不剛一開始霍狰,小波,小浪直接使用非對稱加密
進(jìn)行通信饰及,不就行了嘛
說的是對的蔗坯,不過我們這里只是使用非對稱加密
對密鑰S
進(jìn)行加密,這個數(shù)據(jù)量很小的燎含,而且密鑰S
安全的傳輸給對方之后
后面的通信就直接使用對稱加密了宾濒,這樣效率就高了,而非對稱加密只是在開始協(xié)商怎么安全傳輸密鑰S
的階段使用了屏箍,此階段完成后绘梦,就不再需要使用了橘忱。
通過上面可知:非對稱加密有這樣的特性
我只要拿到誰的公鑰,我和誰通信卸奉,就是安全的
比如钝诚,你有一對私鑰和公鑰,我只要拿到你的公鑰榄棵,然后用你的公鑰進(jìn)行加密傳輸內(nèi)容凝颇,只有你自己能解開,因?yàn)樗借€只有你自己有
如下:
2.png
反過來疹鳄,小波用自己的私鑰加密拧略,其它人使用小波的公鑰解密,這個過程的作用是什么的呢尚辑?
答案是:驗(yàn)證身份的辑鲤。
只要小波用自己的私鑰加密,其它人用小波的公鑰如果能解開杠茬,那么證明這封信一定以及肯定是小波寫的
比如你需要發(fā)一個通知月褥,但是又要確保這個通知一定是你發(fā)的,為了怕別人在中間涂改(比如古代假傳圣旨瓢喉,就是沒有做好身份驗(yàn)證)
你可以用你的私鑰對通知進(jìn)行加密宁赤,其它人想看的話,通過下載你的公鑰栓票,進(jìn)行解密决左,能解密出來,說明通知一定是你發(fā)的走贪。
因?yàn)槠渌巳绻谥虚g涂改佛猛,但是又沒有你的私鑰重新加密,所以是行不通的坠狡。
總結(jié) :通過以上的描述继找,我們解決了好幾個問題,經(jīng)過了以下幾個過程逃沿。
- 小波和小浪為了安全的通信婴渡,采用加密方式,對內(nèi)容進(jìn)行加密傳輸
- 對比來對比去凯亮,只能選
對稱加密
這種加密方式边臼,對內(nèi)容進(jìn)行加密傳輸 - 但是對稱加密的
密鑰S
,傳輸過程不安全假消,容易被老王竊取柠并,怎么辦呢 - 小波想到了
非對稱加密
方式,于是就生成了一對私鑰公鑰,并且把公鑰給了小浪 - 小浪就用公鑰對
密鑰S
進(jìn)行加密臼予,傳給小波 - 因?yàn)槭怯昧诵〔ǖ墓€加密的亿傅,又因?yàn)樗借€只有小波自己有,所以瘟栖,只有小波能解密。這個過程哪怕老王截獲了密文谅阿,也解密不了
- 這樣半哟,小波用自己的私鑰解密出來了
密鑰S
- 此時 小波和小浪就用對稱加密,
密鑰S
签餐, 進(jìn)行愉快的通信了寓涨,比如商量彩禮給多少,酒席在哪辦氯檐,蜜月在哪度 - 這樣戒良,這個通信過程就是安全的了。
上面的過程很完美冠摄,但是道高一尺糯崎,魔高一丈啊,老王腦子靈光特別好使啊河泳,又想出來一招
既然你倆用非對稱加密
沃呢,我截取到密文也解密不了,那就換個法子拆挥。
如果小浪在獲取小波的公鑰的過程薄霜,出了問題,比如小浪獲取的不是小波的公鑰纸兔,而且老王的公鑰呢(此時小浪還以為手里的公鑰是小波的呢)
會發(fā)生什么惰瓜?先看一下圖(也就是所謂的中間人攻擊)
5.png
根據(jù)上圖,老王汉矿,也叫做中間人崎坊,上圖就是中間人攻擊,流程如下: - 小浪在獲取小波公鑰的過程中负甸,被老王給掉包成了自己的公鑰流强,發(fā)給了小浪
- 小浪誤以為手里的公鑰是小波的 (其實(shí)是老王的公鑰了),所以就用老王的公鑰對
密鑰S
進(jìn)行加密呻待,得到密文S0
-
密文S0
發(fā)給小波的過程中打月,被老王攔截,老王就用自己的私鑰解密蚕捉,得到了密鑰S
- 老王得到
密鑰S
后奏篙,自己備份一份,再把此密鑰S
,用小波的公鑰加密秘通,得到密文S1
, 發(fā)給小波 - 小波得到
密文S1
后为严,用自己的私鑰解密,得到密鑰S
- 以后肺稀,小波和小浪第股,就用對稱加密方式,
密鑰S
進(jìn)行通信了 - 他倆還以為很安全话原,其實(shí)通信的內(nèi)容早就被老王先看了一遍了夕吻。還是不安全
啊啊啊,要瘋了繁仁,為了通信安全涉馅,我們就加密,但是加密的密鑰傳輸又不安全了
為了密鑰傳輸安全黄虱,我們生產(chǎn)了私鑰公鑰對稚矿,把公鑰給小浪,小浪用公鑰對密鑰加密再傳輸
這樣就只有小波能解密了捻浦,沒曾想晤揣,公鑰的傳輸又不安全了。
談個戀愛好難啊朱灿,老王啊碉渡,干的都叫啥事啊。母剥。滞诺。
出了問題,總得解決啊环疼,現(xiàn)在是傳輸公鑰的過程习霹,又不安全了
這和上面的問題怎么把信件內(nèi)容安全的傳輸給對方?
以及怎``么把密鑰安全的傳輸給對方炫隶?``
是類似的
現(xiàn)在這個問題是:怎么把公鑰安全的傳輸給對方淋叶?
感覺進(jìn)入到了死循環(huán)了,不管是把信件內(nèi)容
安全傳輸伪阶,還是把密鑰
安全傳輸煞檩,還是把公鑰安全
安全傳輸
本質(zhì)都是類似的,只不過傳輸?shù)臇|西不一樣栅贴,采用的方法不一樣
問題五:小波如何安全的把自己的公鑰傳輸給小浪
經(jīng)過上面我們解決的問題可以知道
- 如何安全的把通信內(nèi)容傳輸給對方斟湃?
解決方法:我們用對稱加密的方式進(jìn)行通信 - 如何安全的把
密鑰S
安全的傳輸給對方 ?
解決方法:采用非對稱加密方式檐薯,小波把自己的公鑰給小浪
小浪用小波的公鑰對密鑰S
加密傳給小波凝赛,小波用自己的私鑰解密
這個過程只有小波能解密注暗,所以是安全的
現(xiàn)在新的問題是:公鑰如何安全傳輸給對方 ?
難道再用對稱或者非對稱加密墓猎?都不對捆昏。這樣已經(jīng)行不通了。
想象一下毙沾,生活中骗卜,我們有個矛盾,有個問題左胞,我們最相信的是誰膨俐,肯定是政府啊
現(xiàn)在我從小波那下載公鑰已經(jīng)不靠譜了,已經(jīng)不安全了
到底我應(yīng)該相信誰呢罩句?到底從誰那獲取的公鑰是小波真正的公鑰呢?
所以敛摘,我們也搞一個機(jī)構(gòu)门烂,我們大家都相信這個機(jī)構(gòu),反正我就是無條件百分百相信這個機(jī)構(gòu)兄淫,這是規(guī)定屯远。
我們把這個機(jī)構(gòu)起一個名字,叫做CA
機(jī)構(gòu)
好了捕虽,現(xiàn)在我們把問題拋給了 CA 機(jī)構(gòu)慨丐,小浪也好,小麗也好泄私,小美也好房揭,只要獲取小波的公鑰,都從 CA 那里獲取
CA 機(jī)構(gòu)哪來的小波的公鑰呢晌端?肯定是小波給的啊捅暴,對于小波來說,反正我已經(jīng)把我的公鑰給你 CA 了咧纠,你 CA 機(jī)構(gòu)就得保證安全的傳輸給別人
這 CA 也是夠倒霉的蓬痒,你們搞不定的活,全拋給了我漆羔,又不是我和小浪談戀愛梧奢。。演痒。
抱怨歸抱怨亲轨,CA 是怎么解決的呢?
答案是數(shù)字證書
鸟顺, 怎么又出來一個名字瓶埋,數(shù)字證書
是個什么鬼,是不是已經(jīng)繞暈了,不要急养筒,這個時候暈了曾撤,再回過過頭再看看前面的寫的
多看看幾遍,別忘了晕粪,筆者也是看了 N 多遍挤悉,自己問自己問題,自己來嘗試解決巫湘,才搞明白這個過程的装悲。
先來說一個結(jié)論:數(shù)字證書就是解決公鑰傳輸問題的
重要的事件重復(fù)三遍 :數(shù)字證書就是解決公鑰傳輸問題的 ,數(shù)字證書就是解決公鑰傳輸問題的 尚氛,數(shù)字證書就是解決公鑰傳輸問題的
在說數(shù)字證書之前诀诊,我們先解決這樣一個問題
問題六:信件的傳輸過程中,如何保證內(nèi)容不被篡改阅嘶,即信息的完整性属瓣?
結(jié)合前面學(xué)到的加密知識,我們可以用單向加密算法讯柔,我們以 md5 加密算法舉例
- 小波給小浪寫完信后抡蛙,用 md5 對信件的內(nèi)容作一次加密運(yùn)算,得到一個唯一的字符串魂迄,我們把這個字符串起個名粗截,叫做摘要
- 小波在信件的底部,寫上單向加密算法 md5, 以及 md5 對信件內(nèi)容運(yùn)算出來的摘要捣炬,一塊發(fā)給小浪
- 小浪收到信后熊昌,看到信件底部是 md5 算法,于是就用 md5 對信件內(nèi)容進(jìn)行加密算法湿酸,得到 新的摘要
- 小浪將 新的摘要 和信件底部附加的 摘要 進(jìn)行對比浴捆,如果相等,說明信件沒有被人改過
-
如果不相等稿械,說明信件內(nèi)容被別人改過了选泻。
如下圖表示此過程。
4.png
但就是上面這個過程美莫,也是有問題的页眯,如果老王又出現(xiàn)了呢
- 首先老王拿到信了,把信給改了
- 老王用 md5 算法 厢呵,重新把信件內(nèi)容給 md5 一下窝撵,得到新的加密串
- 老五把新的加密串,放在信件底部襟铭,發(fā)給了小浪
- 此時小浪收到信后碌奉,是沒辦法判斷出來短曾,信件是不是被篡改過的。
如下圖表示:
所以赐劣,單純的使用單向加密算法 嫉拐,生成摘要,是不能保證內(nèi)容的完整性的
那么如何才能保證信件的完整性魁兼,不被人篡改呢婉徘?
答案是,簽名
又出來一個名詞咐汞,簽名盖呼,本文的名詞太多了。
通過前面學(xué)習(xí)化撕,我們知道几晤,非對稱加密,有 2 個作用植阴,其中一個就是身份認(rèn)證
還是上面的例子我蟹瘾, 我們改一下: - 小波用 md5 對信件內(nèi)容進(jìn)行運(yùn)算,得到一個字符串墙贱,我們起名叫摘要
- 小波用自己的私鑰對摘要進(jìn)行加密運(yùn)算,得到另一個字符串贱傀,我們起名叫簽名
- 將 md5, 摘要惨撇, 簽名一塊發(fā)給小浪
- 小浪用小波的公鑰對簽名進(jìn)行解密,到得信件摘要府寒,假如為 d1
- 小浪用 md5 對信件內(nèi)容進(jìn)行運(yùn)算魁衙,得到信件摘要,假如為 d2
- 對比 d1 和 d2 是否相等株搔,相等說明信件內(nèi)容沒有被篡改過
- d1 和 d2 不相等剖淀,說明信件內(nèi)容被篡改過。
此時纤房,這個過程就是安全的了
如果老王再次截取了信件纵隔,老王可以修改信件內(nèi)容,再次用 md5 算出一個新的摘要出來
但是簽名炮姨,老王是修改不了的捌刮。因?yàn)楹灻怯玫男〔ǖ乃借€加密的,就算老王能解密出來
老王是沒有辦法生成新的簽名的舒岸,因?yàn)樾〔ǖ乃借€只有小波自己有绅作。
而且小浪收到信后,是用小波的公鑰進(jìn)行對簽名解密的蛾派,老王假如用自己的私鑰對摘要進(jìn)行加密生成新的簽名
小浪用小波的公鑰是解密不了的俄认。
此時再來進(jìn)行一時概念的定義
摘要 :md5(或者其它單向加密算法)个少,對內(nèi)容進(jìn)行加密出來的字符串,就叫做摘要
簽名 :小波用私鑰對摘要進(jìn)行加密眯杏,加密出來簽字串夜焦,就叫做簽名
驗(yàn)簽 :小浪用小波的公鑰,對簽名進(jìn)行解密操作役拴,解密出來的摘要和原來的對比糊探,就叫做驗(yàn)簽
問題七:數(shù)字證書是怎么由來的?
數(shù)字證書是由 CA 機(jī)構(gòu)頒發(fā)的河闰,首先小波如果想要有一個數(shù)字證書科平,就需要向 CA 機(jī)構(gòu)申請
CA 機(jī)構(gòu)就會給小波頒發(fā)一張數(shù)字證書,里面包含了
- 公鑰:小波的公鑰
- 頒發(fā)者:CA(證書認(rèn)證機(jī)構(gòu))
- 有效期:證書的使用期限
- 摘要算法:指定的摘要算法姜性,用來計算證書的摘要
- 指紋:也就是證書的摘要瞪慧,保證證書的完整性
- 簽名算法:用于生成簽名,確保證書是由 CA 簽發(fā)
- 序列號:證書的唯一標(biāo)識
知道了證書里面包含的內(nèi)容部念,我們了解一下證書是如何產(chǎn)生的弃酌? - 將小波的公鑰,頒發(fā)者儡炼,有效期妓湘,摘要算法 ,哈希算法寫入證書
- CA 根據(jù)證書中的指定的哈希算法乌询,計算出整個證書的摘要榜贴,即 digest
- CA 根據(jù)簽名算法以及上一步計算出來的摘要,
CA用自己的私鑰
對摘要進(jìn)行加密妹田,生成 CA 的簽名唬党,即 signature - 最后把摘要,簽名以及證書的基本信息鬼佣,一起發(fā)布驶拱,就得到了小波的證書
問題八:數(shù)字證書的作用
從上面我們知道,數(shù)字證書就是解決公鑰傳輸問題的晶衷,同時我們也知道蓝纲,數(shù)字證書就是一個文件
既然數(shù)字證書是用來解決公鑰的安全傳輸?shù)模敲吹降兹绾谓鉀Q傳輸問題的呢
現(xiàn)在小波有了自己的證書了晌纫,我們就不會公開傳輸公鑰了驻龟,只需要傳輸證書就行了
那么,小波和小浪現(xiàn)在需要安全的通信缸匪,那么流程是怎么樣的呢翁狐?如下
- 小波把自己的數(shù)字證書發(fā)送給小浪
- 擔(dān)心證書被老王掉包,小浪需要對證書進(jìn)行驗(yàn)證凌蔬,驗(yàn)證什么呢露懒?
- 其實(shí)就是驗(yàn)證此數(shù)字到底是不是 CA 機(jī)構(gòu)頒發(fā)的闯冷,不是 CA 機(jī)構(gòu)頒發(fā)的證書,我們就認(rèn)為傳輸是不安全的懈词。
- 驗(yàn)證數(shù)字證書是不是 CA 頒發(fā)的蛇耀,需要有
CA的公鑰
。坎弯。纺涤。(為啥需要 CA 的公鑰啊,因?yàn)樽C書上的簽名抠忘,是 CA 的私鑰加密的啊撩炊,只有 CA 的公鑰才能解密啊)
啊啊啊崎脉,受不了啦拧咳,搞了半天怎么又需要公鑰,我們講了半天的數(shù)字證書囚灼,就是為了傳輸公鑰的
所以骆膝,換成下面的描述會好點(diǎn)
驗(yàn)證數(shù)字證書是不是 CA 頻發(fā)的,需要 CA 的數(shù)字證書(因?yàn)槔锩嬗?CA 的公鑰) - 那我們?nèi)ツ睦镎?CA 的數(shù)字證書呢灶体?從上面的描述阅签,我們知道了,需要一個數(shù)字證書蝎抽,就向 CA 申請政钟,CA 給我們頒發(fā)。
- 那么 CA 機(jī)構(gòu)自己的數(shù)字證書哪來的呢织中?答案是也是自己給自己頒發(fā)的锥涕,那么我們從哪里獲取呢衷戈?
- 如果從網(wǎng)上狭吼,或者從其它服務(wù)器下載,又有可能會被掉包殖妇,又不安全了刁笙。
- 這真的是個傷心的故事,但是今天兔哥非要把這個故事講完谦趣。
- 從網(wǎng)上下載或者從其它服務(wù)器下載數(shù)字證書疲吸,都不安全的,那么怎么樣才是安全的呢前鹅?
- 答案就是:你的電腦安裝操作系統(tǒng)的時候摘悴,操作系統(tǒng)里面,就已經(jīng)內(nèi)置了非常多的 CA 機(jī)構(gòu)的數(shù)字證書了
- 也就說舰绘,只要你安裝了操作系統(tǒng)蹂喻,不管是 windows, linux, 或者 mac , 或者你剛買的電腦葱椭,里面都已經(jīng)有了 CA 機(jī)構(gòu)的數(shù)字證書了
- 這個是可以相信的,是真的 CA 機(jī)構(gòu)的數(shù)字證書口四,不會有假孵运。(除非你安裝的是盜版的操作系統(tǒng),所以我們盡量用正版操作系統(tǒng))
上面的過程真的是復(fù)雜啊蔓彩,兔哥也是花了很久才搞明白的治笨,知道這塊面試會坑很多人,其實(shí)https
過程不知道赤嚼,也沒啥關(guān)系
也不影響你寫代碼旷赖,但是那些面試官就死愛問這塊,好像他們能搞懂這個過程很了不起似的探膊,你問點(diǎn)設(shè)計模式它不香嘛杠愧。 - 我們的電腦,天生就有 CA 的數(shù)字證書逞壁,而且是真的流济。天生的。上天定的腌闯,上天最大
那么我們就可以對數(shù)字證書進(jìn)行辨別真?zhèn)瘟恕?/li>
問題九:對數(shù)字證書的驗(yàn)證
從上面可以知道:
小浪收到了小波的數(shù)字證書绳瘟,首先要對數(shù)字證書進(jìn)行驗(yàn)證,就是驗(yàn)證此數(shù)字證書是不是 CA 頒發(fā)的
因?yàn)槲覀儾僮飨到y(tǒng)里面內(nèi)置了所有 CA 機(jī)構(gòu)的數(shù)字證書姿骏,所以糖声,我們就可以對數(shù)字證書進(jìn)行驗(yàn)證
在說流程之前,先來簡單的復(fù)習(xí)一下前面的分瘦,摘要和簽名怎么來的
摘要 = md5 (證書內(nèi)容) :單向加密算法蘸泻,比如 md5,對證書整個內(nèi)容進(jìn)行加密嘲玫,得到摘要悦施,也叫做證書的指紋
簽名 = privateKey (摘要) : 私鑰對上一步摘要加密,產(chǎn)生簽名
數(shù)字證書的驗(yàn)證流程如下:
- 小浪用內(nèi)置的 CA 的數(shù)字證書去团,得到 CA 的公鑰
- 小波發(fā)過來的數(shù)字證書抡诞,我們假如叫做 C , 小浪用 CA 的公鑰對 C 證書里面的簽名進(jìn)行解密土陪,得到摘要 D
- 小浪根據(jù) C 證書里面的摘要算法昼汗,假如是 md5,小浪用 md5 對證書整個內(nèi)容進(jìn)行計算鬼雀,得到摘要 D1
- 小浪對比摘要 D 和摘要 D1 是否相等
- 如果 D == D1 顷窒,那么說明此證書就是 CA 頒發(fā)的
- 如果 D != D1 , 那么說明此證書不是 CA 頒發(fā)的源哩,是有風(fēng)險的鞋吉,不安全的
假如證書驗(yàn)證通過出刷,就說明此證書的確是 CA 頒發(fā)的,此時小浪就可以從數(shù)字證書中拿到小波的公鑰了
因?yàn)樾〔ㄔ谏暾垟?shù)字證書時坯辩,數(shù)字證書中所有者是小波馁龟,CA 是會驗(yàn)證小波的身份的,所以數(shù)字證書中小波的公鑰是真實(shí)的
由至此漆魔,我們總算完成了一件事:小波正確的把自己的公鑰安全的傳輸給了小浪
這件事的成立 坷檩,接下來我們的工作就好做多了。接下來改抡,我們看一下具體的傳輸過程
問題十 :完整的傳輸過程
下面我們看一下小波再次給小浪通信矢炼,就和前面的不一樣了,我們來看下:
- 小波把寫完的信阿纤,在信的底部句灌,附加上摘要算法,假如是 MD5欠拾, 以及通過 MD5 算出來的摘要
- 小波用自己的私鑰胰锌,對上一步的摘要進(jìn)行加密,得到簽名
- 小波把摘要算法藐窄,摘要资昧,簽名都附加到信件底部以后,再把自己的數(shù)字證書荆忍,一起發(fā)送給小浪
- 小浪收到信后格带,首先用自己的 CA 數(shù)字證書,拿到 CA 公鑰刹枉,再用 CA 公鑰對數(shù)字證書進(jìn)行驗(yàn)證(也就是上面我們講的流程)
- 數(shù)字證書驗(yàn)證通過后叽唱,說明證書就是 CA 頒發(fā)的,沒有被篡改
- 小浪就從證書中拿到了小波的公鑰
- 有了小波的公鑰微宝,接下來的過程棺亭,就是對信件內(nèi)容進(jìn)行驗(yàn)證了
對信件內(nèi)容的驗(yàn)證流程如下(前面其實(shí)我們講過) - 小浪用小波的公鑰,對信件的簽名進(jìn)行解密芥吟,得到信件的摘要 D1
- 小浪用摘要算法侦铜,對信件進(jìn)行運(yùn)算专甩,得到信件的摘要 D2
- 小浪對比 D1 是否等于 D2
- 如果不相等钟鸵,說明信件被人篡改過,不安全
- 如果相等涤躲,說明棺耍,信件內(nèi)容沒有被篡改過
- 相等的情況,小浪就拿到了信件的內(nèi)容
總結(jié):
以上所有的內(nèi)容种樱,是數(shù)字證書蒙袍,加密解密俊卤,簽名,驗(yàn)簽的過程害幅,還沒有正式講https
的過程呢消恍。
有了以上的知識,我們講起來 https 就容易的多了以现。下面我們看一張圖
6.png
我們以訪問www.helloworld.net
網(wǎng)站為例狠怨,講解 https 的過程
此過程分為 3 個階段,我們在下面描述此 3 個階段
訪問www.helloworld.net
的過程 階段如下
- 網(wǎng)站申請證書階段
- 網(wǎng)站向 CA 機(jī)構(gòu)申請數(shù)字證書(需要提交一些材料邑遏,比如域名)
- CA 向證書中寫入摘要算法佣赖,域名,網(wǎng)站的公鑰等重要信息
- CA 根據(jù)證書中寫入的摘要算法记盒,計算出證書的摘要
- CA 用自己的私鑰對摘要進(jìn)行加密憎蛤,計算出簽名
- CA 生成一張數(shù)字證書,頒發(fā)給了
www.helloworld.net
- 網(wǎng)站的管理員纪吮,把證書放在自己的服務(wù)器上
- 瀏覽器驗(yàn)證證書階段
- 瀏覽器在地址欄中輸入
https://www.helloworld.net
俩檬,并回車 - 服務(wù)器將數(shù)字證書發(fā)送給瀏覽器
- 瀏覽器用操作系統(tǒng)內(nèi)置的 CA 的數(shù)字證書,拿到 CA 的公鑰
- 瀏覽器用 CA 公鑰對 www.helloworld.net 的數(shù)字證書進(jìn)行驗(yàn)簽
- 具體就是碾盟,瀏覽器用 CA 公鑰犁河,對 helloworld 的數(shù)字證書中的簽名進(jìn)行解密,得到摘要 D1
- 瀏覽器根據(jù) helloworld 數(shù)字證書中的摘要算法摇予,計算出證書的摘要 D2
- 對比 D1 和 D2 是否相等珊膜。
- 如果不相等,說明證書被掉包了
- 如果相等嚼沿,說明證書驗(yàn)證通過了估盘。
- 協(xié)商對稱加密密鑰階段
- 瀏覽器驗(yàn)證數(shù)字證書通過以后
- 瀏覽器拿到數(shù)字證書中的公鑰,也就是
www.helloworld.net
網(wǎng)站的公鑰 - 瀏覽器有了網(wǎng)站的公鑰后骡尽,就用公鑰進(jìn)行對
密鑰S
進(jìn)行加密攀细,加密以后的密文發(fā)送給服務(wù)器 - 服務(wù)器收到密文后,用自己的私鑰進(jìn)行解密境钟,得到
密鑰S
- 此后瀏覽器俭识,服務(wù)器雙方就用
密鑰S
進(jìn)行對稱加密的通信了。
終止所述磁椒,終于講完了玫芦,花了整整一天的時間
過程那么多桥帆,其實(shí)抓住幾個關(guān)鍵的問題是很簡單的,本質(zhì)上還是兩個人调窍,如何安全高效的進(jìn)行通信
我們再次簡單的總結(jié)一下张遭,采用一問一答的方式菊卷,我覺得比較好
問題一:小波和小浪安全的通信,怎么做歉甚?
答:通過加密
問題二:通過哪種加密方式通信扑眉,更高效腰素?
答:對稱加密
因?yàn)椋瑔蜗蚣用芎獗悖瑳]辦法解密洋访,不行
非對稱加密姻政,太慢,也不行
只有對稱加密理肺,速度快
問題三:采用對稱加密妹萨,密鑰 S 怎么安全傳輸炫欺?
答:小浪使用小波的公鑰品洛,對密鑰S
進(jìn)行加密,傳給小波
小波用自己的私鑰解密
問題四:小波如何安全的把自己的公鑰傳輸給小浪帽揪?
答:使用數(shù)字證書
具體就是 小波向 CA 申請一個自己的數(shù)字證書转晰,把自己的公鑰放在證書中
小波將數(shù)字證書發(fā)送給小浪
問題五:小浪如何驗(yàn)證數(shù)字證書的真實(shí)性士飒?
答:小浪用操作系統(tǒng)內(nèi)置的 CA 的數(shù)字證書酵幕,拿到 CA 的公鑰,用 CA 的公鑰邓深,對數(shù)字證書進(jìn)行驗(yàn)簽
驗(yàn)簽通過庐完,說明數(shù)字證書是真的徘熔。
以上幾個問題酷师,希望讀者多問問自己,如果是自己懂讯,應(yīng)該怎么解決這個問題褐望。