相信很多人,對(duì) https 的過(guò)程弄不清楚,只是知道 https 是安全加密的,背后的原理,過(guò)程并不清楚
筆者曾經(jīng)也是對(duì) https 的過(guò)程并不清楚,一知半解,而且最可氣的是每次面試,面試官很可能就問(wèn)你這個(gè)問(wèn)題
每次都答不對(duì)或者答的面試官不滿(mǎn)意,說(shuō)來(lái)說(shuō)去,還是自己沒(méi)有真正理解
其實(shí) https 的原理過(guò)程,并沒(méi)有那么復(fù)雜,只是有些文章沒(méi)有說(shuō)清楚,這樣的文章看多了,就迷糊了。
在了解 https 原理的過(guò)程之前,我們先來(lái)了解一下加密的知識(shí)
一 加密知識(shí)
加密按照加密方式,可以分為以下三種方式
1.1 單向加密
也叫做不可逆加密,對(duì)明文的加密產(chǎn)生一個(gè)密文,并不能再通過(guò)密文,解出來(lái)對(duì)應(yīng)的明文
一般用于產(chǎn)生消息摘要,密鑰加密等,常見(jiàn)的單向加密有:
MD5 : 相信這個(gè)大家都都熟悉了,一個(gè)明文,md5 以后,對(duì)應(yīng)一個(gè)唯一的密文
SHA : 其中又分為 sha192 , sha256
特點(diǎn):
不可逆
輸入一樣,輸出必然相同
1.2 對(duì)稱(chēng)加密
對(duì)稱(chēng)加密,用一個(gè)密鑰,對(duì)明文進(jìn)行加密,同理,同這把密鑰,也可以對(duì)密文進(jìn)行解密
也就是說(shuō)加密和解密,可以用同一個(gè)密鑰
這種加密方法就是 對(duì)稱(chēng)加密
常用的對(duì)稱(chēng)加密方法有:
DES
3DES
AES
特點(diǎn):
加密方和解密使用同一密鑰
加密解密的速度比較快
1.3 非對(duì)稱(chēng)加密
我們知道,對(duì)稱(chēng)加密使用同一把密鑰,相反,非對(duì)稱(chēng)加密,使用公鑰和私鑰進(jìn)行加密解密
可以使用私鑰加密,公鑰進(jìn)行解密,同理,也可以使用公鑰加密,私鑰進(jìn)行解密
常見(jiàn)非對(duì)稱(chēng)加密方式的有:
RSA
DSA
我們平時(shí)最常用的就是 RSA
特點(diǎn):
使用兩把密鑰進(jìn)行加密和解密,即公鑰和私鑰
公鑰加密私鑰解密,私鑰加密公鑰可以解密
加密或者解密,速度非常慢
私鑰和公鑰是成對(duì)出現(xiàn)的
基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
視頻教程:https://doc.iocoder.cn/video/
二 加密知識(shí)總結(jié)
** 單向加密:** 不可逆,只要輸入的內(nèi)容一樣,輸出的密文一定是一樣的,有任何修改, 產(chǎn)生的密文都是不同的
** 對(duì)稱(chēng)加密:** 加密和解密使用同一把密鑰,加密解密速度特別快
非對(duì)稱(chēng)加密: 使用公鑰和私鑰進(jìn)行加密和解密,公鑰加密私鑰解,私鑰加密公鑰解。加密解密的過(guò)程非常慢
所謂公鑰,就是可以公開(kāi)給別人的
所謂私鑰,就是不可以公開(kāi)給別人,是自己私有保留的。
注:以上內(nèi)容,純粹是加密的知識(shí),和 https 沒(méi)有任何關(guān)系。下面我們開(kāi)始講解 https 的過(guò)程。我們先看一個(gè)需求
解決了這個(gè)需求,就明白了 https 的過(guò)程了。
從一個(gè)需求開(kāi)始
假設(shè)有這樣一個(gè)需求:小明和小花需要通信,少男少女寫(xiě)情書(shū)嘛,肯定不想讓別人看到,所以需要安全的通信。
問(wèn)題一:小明如何安全的把內(nèi)容傳給小花?
通過(guò)上面的加密知識(shí)的學(xué)習(xí),我們很容易就想到,把通信的內(nèi)容,給加密了就行了啊
答案是對(duì)的,把通信的內(nèi)容給加密就行了。
問(wèn)題二:使用哪種加密方式加密呢?
單向加密肯定不行,小花收到信,解不出來(lái),這戀愛(ài)沒(méi)法談
對(duì)稱(chēng)加密可以 ,小花只要有密鑰,就可以把內(nèi)容解出來(lái)
非對(duì)稱(chēng)加密也可以 ,小明用自己的私鑰加密,小花拿到小明的公鑰,也可以把內(nèi)容解出來(lái)
問(wèn)題三:對(duì)稱(chēng)加密,非對(duì)稱(chēng)加密都可以,到底使用哪種呢?
通過(guò)上面的加密知識(shí)的學(xué)習(xí),我們知道
對(duì)稱(chēng)加密速度快,非對(duì)稱(chēng)加密速度慢
那么對(duì)于小明,小花這倆人來(lái)說(shuō),經(jīng)常一聊就是幾個(gè)小時(shí),數(shù)據(jù)是非常多的
如果使用非對(duì)稱(chēng)加密,那估計(jì)得郁悶死,因?yàn)榧用芤猜?,解密也慢,這倆人肯定不會(huì)用非對(duì)稱(chēng)加密,要是我,我也不用,急死個(gè)人。
那么答案就是,使用對(duì)稱(chēng)加密方式 ,因?yàn)榧用芸彀?,小明小花,都持有同一把密鑰,雙方互相都能解密出來(lái)對(duì)方發(fā)的信。
總結(jié):小明和小花通信,使用對(duì)稱(chēng)加密,假如密鑰是 S , 雙方都使用同一把密鑰 S 進(jìn)行加密,解密
這樣小明和小花就能愉快的通信了,而且內(nèi)容是加密的,加密解密的速度也很快,這很美好。
但是這樣有一個(gè)隱患,就是密鑰 S , 在傳輸?shù)倪^(guò)程中,不小心被 老王 截獲了
造成的后果就是:小明,小花以及老王,都有相同的密鑰 S 了
那么,小明和小花之間沒(méi)有秘密可言了,他們發(fā)的信,老王都能解開(kāi)看,看完再加密,再發(fā)給小花,這還得了。
那么如何解決 密鑰S 在傳輸?shù)倪^(guò)程中,被別人截獲的情況呢?
有人說(shuō),可以對(duì)稱(chēng)加密方式對(duì)密鑰S 進(jìn)行加密, 再傳輸,那么此時(shí)的密鑰S1 也是有被截獲的風(fēng)險(xiǎn)啊
那就再對(duì) S1 進(jìn)行加密,再傳輸...... , 這樣就無(wú)窮盡了。肯定是行不能的。
上面的方法肯定是不行了,現(xiàn)在的問(wèn)題,變成了:小明如何把 密鑰S 安全的傳給小花, 這是不是和之前的問(wèn)題一小明如何安全的把內(nèi)容傳給小花?類(lèi)似
所以,小明和小花如何要安全的通信,就需要使用對(duì)稱(chēng)加密 把信件內(nèi)容加密傳輸
那么就得先解決一個(gè)問(wèn)題:小明如何安全的把密鑰S 傳輸給小花?
問(wèn)題四:小明如何安全的把密鑰S 傳輸給小花?
如果密鑰S 的傳輸過(guò)程不安全,那么后面的通信就是不安全的,反之,如何密鑰S 能安全的傳輸給小花,那么后面的通信就是安全的。
如果這是領(lǐng)導(dǎo)交待給我們這樣一個(gè)活,我們使用自己學(xué)到的上面的加密知識(shí),應(yīng)該怎么解決呢?
通過(guò)上面的加密知識(shí)的學(xué)習(xí),是不是有下面這樣一個(gè)安全的加密傳輸方式
小明使用非對(duì)稱(chēng)加密進(jìn)行通信,首先小明生成了自己的一對(duì)私鑰和公鑰,為了方便,分別叫做 privateKey, publicKey
小明把 publicKey 給了小花
方法一 小明用自己的 privateKey,對(duì) 密鑰S 進(jìn)行加密,加密后的密文 S0 傳輸給小花,小花用 publicKey 對(duì) S0 解密出來(lái) 密鑰S
方法二 小花用 publicKey 對(duì) 密鑰S 進(jìn)行加密,加密后的密文 S0 傳輸給小明,小明用 privatekey 對(duì) S0 解密出來(lái) 密鑰S
上面,方法一 是不可行的,因?yàn)樾∶鞯?publicKey 是公開(kāi)的,誰(shuí)都可以下載,也就是說(shuō),老王也有小明的 publicKey,也可以對(duì) S0 進(jìn)行解密出來(lái) 密鑰S
方法二是可行的,因?yàn)?privateKey 只有小明有,小花用小明的公鑰進(jìn)行加密,只有小明能解開(kāi),其它任何人都解不開(kāi)
所以上面的解決方案就是:
使用非對(duì)稱(chēng)加密 方式,對(duì) 密鑰S 進(jìn)行加密,進(jìn)行傳輸
有人說(shuō),不對(duì)啊,非對(duì)稱(chēng)加密 性能不好,加密解密特別慢,要不剛一開(kāi)始,小明,小花直接使用非對(duì)稱(chēng)加密 進(jìn)行通信,不就行了嘛
說(shuō)的是對(duì)的,不過(guò)我們這里只是使用非對(duì)稱(chēng)加密 對(duì) 密鑰S 進(jìn)行加密,這個(gè)數(shù)據(jù)量很小的,而且密鑰S 安全的傳輸給對(duì)方之后
后面的通信就直接使用對(duì)稱(chēng)加密了,這樣效率就高了,而非對(duì)稱(chēng)加密只是在開(kāi)始協(xié)商怎么安全傳輸密鑰S 的階段使用了,此階段完成后,就不再需要使用了。
通過(guò)上面可知:非對(duì)稱(chēng)加密有這樣的特性
我只要拿到誰(shuí)的公鑰,我和誰(shuí)通信,就是安全的
比如,你有一對(duì)私鑰和公鑰,我只要拿到你的公鑰,然后用你的公鑰進(jìn)行加密傳輸內(nèi)容,只有你自己能解開(kāi),因?yàn)樗借€只有你自己有
如下:
反過(guò)來(lái),小明用自己的私鑰加密,其它人使用小明的公鑰解密,這個(gè)過(guò)程的作用是什么的呢?
答案是:驗(yàn)證身份的。
只要小明用自己的私鑰加密,其它人用小明的公鑰如果能解開(kāi),那么證明這封信一定以及肯定是小明寫(xiě)的
比如你需要發(fā)一個(gè)通知,但是又要確保這個(gè)通知一定是你發(fā)的,為了怕別人在中間涂改(比如古代假傳圣旨,就是沒(méi)有做好身份驗(yàn)證)
你可以用你的私鑰對(duì)通知進(jìn)行加密,其它人想看的話,通過(guò)下載你的公鑰,進(jìn)行解密,能解密出來(lái),說(shuō)明通知一定是你發(fā)的。
因?yàn)槠渌巳绻谥虚g涂改,但是又沒(méi)有你的私鑰重新加密,所以是行不通的。
總結(jié) :通過(guò)以上的描述,我們解決了好幾個(gè)問(wèn)題,經(jīng)過(guò)了以下幾個(gè)過(guò)程。
小明和小花為了安全的通信,采用加密方式,對(duì)內(nèi)容進(jìn)行加密傳輸
對(duì)比來(lái)對(duì)比去,只能選對(duì)稱(chēng)加密這種加密方式,對(duì)內(nèi)容進(jìn)行加密傳輸
但是對(duì)稱(chēng)加密的密鑰S ,傳輸過(guò)程不安全,容易被老王竊取,怎么辦呢
小明想到了非對(duì)稱(chēng)加密方式,于是就生成了一對(duì)私鑰公鑰,并且把公鑰給了小花
小花就用公鑰對(duì)密鑰S 進(jìn)行加密,傳給小明
因?yàn)槭怯昧诵∶鞯墓€加密的,又因?yàn)樗借€只有小明自己有,所以,只有小明能解密。這個(gè)過(guò)程哪怕老王截獲了密文,也解密不了
這樣,小明用自己的私鑰解密出來(lái)了 密鑰S
此時(shí) 小明和小花就用對(duì)稱(chēng)加密, 密鑰S , 進(jìn)行愉快的通信了,比如商量彩禮給多少,酒席在哪辦,蜜月在哪度
這樣,這個(gè)通信過(guò)程就是安全的了。
上面的過(guò)程很完美,但是道高一尺,魔高一丈啊,老王腦子靈光特別好使啊,又想出來(lái)一招
既然你倆用非對(duì)稱(chēng)加密,我截取到密文也解密不了,那就換個(gè)法子。
如果小花在獲取小明的公鑰的過(guò)程,出了問(wèn)題,比如小花獲取的不是小明的公鑰,而且老王的公鑰呢(此時(shí)小花還以為手里的公鑰是小明的呢)
會(huì)發(fā)生什么?先看一下圖(也就是所謂的中間人攻擊)
根據(jù)上圖,老王,也叫做中間人,上圖就是中間人攻擊,流程如下:
小花在獲取小明公鑰的過(guò)程中,被老王給掉包成了自己的公鑰,發(fā)給了小花
小花誤以為手里的公鑰是小明的 (其實(shí)是老王的公鑰了),所以就用老王的公鑰對(duì)密鑰S 進(jìn)行加密,得到密文S0
密文S0 發(fā)給小明的過(guò)程中,被老王攔截,老王就用自己的私鑰解密,得到了密鑰S
老王得到密鑰S 后,自己備份一份,再把此 密鑰S,用小明的公鑰加密,得到密文S1, 發(fā)給小明
小明得到 密文S1 后,用自己的私鑰解密,得到 密鑰S
以后,小明和小花,就用對(duì)稱(chēng)加密方式, 密鑰S 進(jìn)行通信了
他倆還以為很安全,其實(shí)通信的內(nèi)容早就被老王先看了一遍了。還是不安全
啊啊啊,要瘋了,為了通信安全,我們就加密,但是加密的密鑰傳輸又不安全了
為了密鑰傳輸安全,我們生產(chǎn)了私鑰公鑰對(duì),把公鑰給小花,小花用公鑰對(duì)密鑰加密再傳輸
這樣就只有小明能解密了,沒(méi)曾想,公鑰的傳輸又不安全了。
談個(gè)戀愛(ài)好難啊,老王啊,干的都叫啥事啊。。。
出了問(wèn)題,總得解決啊,現(xiàn)在是傳輸公鑰的過(guò)程,又不安全了
這和上面的問(wèn)題 怎么把信件內(nèi)容安全的傳輸給對(duì)方?以及怎``么把密鑰安全的傳輸給對(duì)方?`` 是類(lèi)似的
現(xiàn)在這個(gè)問(wèn)題是:怎么把公鑰安全的傳輸給對(duì)方?
感覺(jué)進(jìn)入到了死循環(huán)了,不管是把 信件內(nèi)容安全傳輸,還是把密鑰安全傳輸,還是把 公鑰安全安全傳輸
本質(zhì)都是類(lèi)似的,只不過(guò)傳輸?shù)臇|西不一樣,采用的方法不一樣
問(wèn)題五:小明如何安全的把自己的公鑰傳輸給小花
經(jīng)過(guò)上面我們解決的問(wèn)題可以知道
如何安全的把通信內(nèi)容傳輸給對(duì)方?
解決方法:我們用對(duì)稱(chēng)加密的方式進(jìn)行通信
如何安全的把密鑰S 安全的傳輸給對(duì)方 ?
解決方法:采用非對(duì)稱(chēng)加密方式,小明把自己的公鑰給小花
小花用小明的公鑰對(duì)密鑰S 加密傳給小明,小明用自己的私鑰解密
這個(gè)過(guò)程只有小明能解密,所以是安全的
現(xiàn)在新的問(wèn)題是:公鑰如何安全傳輸給對(duì)方 ?
難道再用對(duì)稱(chēng)或者非對(duì)稱(chēng)加密?都不對(duì)。這樣已經(jīng)行不通了。
想象一下,生活中,我們有個(gè)矛盾,有個(gè)問(wèn)題,我們最相信的是誰(shuí),肯定是政府啊
現(xiàn)在我從小明那下載公鑰已經(jīng)不靠譜了,已經(jīng)不安全了
到底我應(yīng)該相信誰(shuí)呢?到底從誰(shuí)那獲取的公鑰是小明真正的公鑰呢?
所以,我們也搞一個(gè)機(jī)構(gòu),我們大家都相信這個(gè)機(jī)構(gòu),反正我就是無(wú)條件百分百相信這個(gè)機(jī)構(gòu),這是規(guī)定。
我們把這個(gè)機(jī)構(gòu)起一個(gè)名字,叫做 CA 機(jī)構(gòu)
好了,現(xiàn)在我們把問(wèn)題拋給了 CA 機(jī)構(gòu),小花也好,小麗也好,小美也好,只要獲取小明的公鑰,都從 CA 那里獲取
CA 機(jī)構(gòu)哪來(lái)的小明的公鑰呢?肯定是小明給的啊,對(duì)于小明來(lái)說(shuō),反正我已經(jīng)把我的公鑰給你 CA 了,你 CA 機(jī)構(gòu)就得保證安全的傳輸給別人
這 CA 也是夠倒霉的,你們搞不定的活,全拋給了我,又不是我和小花談戀愛(ài)。。。
抱怨歸抱怨,CA 是怎么解決的呢?
答案是 數(shù)字證書(shū) , 怎么又出來(lái)一個(gè)名字,數(shù)字證書(shū)是個(gè)什么鬼,是不是已經(jīng)繞暈了,不要急,這個(gè)時(shí)候暈了,再回過(guò)過(guò)頭再看看前面的寫(xiě)的
多看看幾遍,別忘了,筆者也是看了 N 多遍,自己?jiǎn)栕约簡(jiǎn)栴},自己來(lái)嘗試解決,才搞明白這個(gè)過(guò)程的。
先來(lái)說(shuō)一個(gè)結(jié)論:數(shù)字證書(shū)就是解決公鑰傳輸問(wèn)題的
重要的事件重復(fù)三遍 :數(shù)字證書(shū)就是解決公鑰傳輸問(wèn)題的 ,數(shù)字證書(shū)就是解決公鑰傳輸問(wèn)題的 ,數(shù)字證書(shū)就是解決公鑰傳輸問(wèn)題的
在說(shuō)數(shù)字證書(shū)之前,我們先解決這樣一個(gè)問(wèn)題
問(wèn)題六:信件的傳輸過(guò)程中,如何保證內(nèi)容不被篡改,即信息的完整性?
結(jié)合前面學(xué)到的加密知識(shí),我們可以用單向加密算法,我們以 md5 加密算法舉例
小明給小花寫(xiě)完信后,用 md5 對(duì)信件的內(nèi)容作一次加密運(yùn)算,得到一個(gè)唯一的字符串,我們把這個(gè)字符串起個(gè)名,叫做摘要
小明在信件的底部,寫(xiě)上單向加密算法 md5, 以及 md5 對(duì)信件內(nèi)容運(yùn)算出來(lái)的摘要,一塊發(fā)給小花
小花收到信后,看到信件底部是 md5 算法,于是就用 md5 對(duì)信件內(nèi)容進(jìn)行加密算法,得到 新的摘要
小花將 新的摘要 和信件底部附加的 摘要 進(jìn)行對(duì)比,如果相等,說(shuō)明信件沒(méi)有被人改過(guò)
如果不相等,說(shuō)明信件內(nèi)容被別人改過(guò)了。
如下圖表示此過(guò)程。
但就是上面這個(gè)過(guò)程,也是有問(wèn)題的,如果老王又出現(xiàn)了呢
首先老王拿到信了,把信給改了
老王用 md5 算法 ,重新把信件內(nèi)容給 md5 一下,得到新的加密串
老五把新的加密串,放在信件底部,發(fā)給了小花
此時(shí)小花收到信后,是沒(méi)辦法判斷出來(lái),信件是不是被篡改過(guò)的。
如下圖表示:
所以,單純的使用單向加密算法 ,生成摘要,是不能保證內(nèi)容的完整性的
那么如何才能保證信件的完整性,不被人篡改呢?
答案是,簽名
又出來(lái)一個(gè)名詞,簽名,本文的名詞太多了。
通過(guò)前面學(xué)習(xí),我們知道,非對(duì)稱(chēng)加密,有 2 個(gè)作用,其中一個(gè)就是身份認(rèn)證
還是上面的例子我, 我們改一下:
小明用 md5 對(duì)信件內(nèi)容進(jìn)行運(yùn)算,得到一個(gè)字符串,我們起名叫摘要
小明用自己的私鑰對(duì)摘要進(jìn)行加密運(yùn)算,得到另一個(gè)字符串,我們起名叫簽名
將 md5, 摘要, 簽名一塊發(fā)給小花
小花用小明的公鑰對(duì)簽名進(jìn)行解密,到得信件摘要,假如為 d1
小花用 md5 對(duì)信件內(nèi)容進(jìn)行運(yùn)算,得到信件摘要,假如為 d2
對(duì)比 d1 和 d2 是否相等,相等說(shuō)明信件內(nèi)容沒(méi)有被篡改過(guò)
d1 和 d2 不相等,說(shuō)明信件內(nèi)容被篡改過(guò)。
此時(shí),這個(gè)過(guò)程就是安全的了
如果老王再次截取了信件,老王可以修改信件內(nèi)容,再次用 md5 算出一個(gè)新的摘要出來(lái)
但是簽名,老王是修改不了的。因?yàn)楹灻怯玫男∶鞯乃借€加密的,就算老王能解密出來(lái)
老王是沒(méi)有辦法生成新的簽名的,因?yàn)樾∶鞯乃借€只有小明自己有。
而且小花收到信后,是用小明的公鑰進(jìn)行對(duì)簽名解密的,老王假如用自己的私鑰對(duì)摘要進(jìn)行加密生成新的簽名
小花用小明的公鑰是解密不了的。
此時(shí)再來(lái)進(jìn)行一時(shí)概念的定義
摘要 :md5(或者其它單向加密算法),對(duì)內(nèi)容進(jìn)行加密出來(lái)的字符串,就叫做摘要
簽名 :小明用私鑰對(duì)摘要進(jìn)行加密,加密出來(lái)簽字串,就叫做簽名
驗(yàn)簽 :小花用小明的公鑰,對(duì)簽名進(jìn)行解密操作,解密出來(lái)的摘要和原來(lái)的對(duì)比,就叫做驗(yàn)簽
問(wèn)題七:數(shù)字證書(shū)是怎么由來(lái)的?
數(shù)字證書(shū)是由 CA 機(jī)構(gòu)頒發(fā)的,首先小明如果想要有一個(gè)數(shù)字證書(shū),就需要向 CA 機(jī)構(gòu)申請(qǐng)
CA 機(jī)構(gòu)就會(huì)給小明頒發(fā)一張數(shù)字證書(shū),里面包含了
公鑰:小明的公鑰
頒發(fā)者:CA(證書(shū)認(rèn)證機(jī)構(gòu))
有效期:證書(shū)的使用期限
摘要算法:指定的摘要算法,用來(lái)計(jì)算證書(shū)的摘要
指紋:也就是證書(shū)的摘要,保證證書(shū)的完整性
簽名算法:用于生成簽名,確保證書(shū)是由 CA 簽發(fā)
序列號(hào):證書(shū)的唯一標(biāo)識(shí)
知道了證書(shū)里面包含的內(nèi)容,我們了解一下證書(shū)是如何產(chǎn)生的?
將小明的公鑰,頒發(fā)者,有效期,摘要算法 ,哈希算法寫(xiě)入證書(shū)
CA 根據(jù)證書(shū)中的指定的哈希算法,計(jì)算出整個(gè)證書(shū)的摘要,即 digest
CA 根據(jù)簽名算法以及上一步計(jì)算出來(lái)的摘要,CA用自己的私鑰對(duì)摘要進(jìn)行加密,生成 CA 的簽名,即 signature
最后把摘要,簽名以及證書(shū)的基本信息,一起發(fā)布,就得到了小明的證書(shū)
問(wèn)題八:數(shù)字證書(shū)的作用
從上面我們知道,數(shù)字證書(shū)就是解決公鑰傳輸問(wèn)題的,同時(shí)我們也知道,數(shù)字證書(shū)就是一個(gè)文件
既然數(shù)字證書(shū)是用來(lái)解決公鑰的安全傳輸?shù)?,那么到底如何解決傳輸問(wèn)題的呢
現(xiàn)在小明有了自己的證書(shū)了,我們就不會(huì)公開(kāi)傳輸公鑰了,只需要傳輸證書(shū)就行了
那么,小明和小花現(xiàn)在需要安全的通信,那么流程是怎么樣的呢?如下
小明把自己的數(shù)字證書(shū)發(fā)送給小花
擔(dān)心證書(shū)被老王掉包,小花需要對(duì)證書(shū)進(jìn)行驗(yàn)證,驗(yàn)證什么呢?
其實(shí)就是驗(yàn)證此數(shù)字到底是不是 CA 機(jī)構(gòu)頒發(fā)的,不是 CA 機(jī)構(gòu)頒發(fā)的證書(shū),我們就認(rèn)為傳輸是不安全的。
驗(yàn)證數(shù)字證書(shū)是不是 CA 頒發(fā)的,需要有 CA的公鑰 。。。(為啥需要 CA 的公鑰啊,因?yàn)樽C書(shū)上的簽名,是 CA 的私鑰加密的啊,只有 CA 的公鑰才能解密啊)
啊啊啊,受不了啦,搞了半天怎么又需要公鑰,我們講了半天的數(shù)字證書(shū),就是為了傳輸公鑰的
所以,換成下面的描述會(huì)好點(diǎn)
驗(yàn)證數(shù)字證書(shū)是不是 CA 頻發(fā)的,需要 CA 的數(shù)字證書(shū)(因?yàn)槔锩嬗?CA 的公鑰)
那我們?nèi)ツ睦镎?CA 的數(shù)字證書(shū)呢?從上面的描述,我們知道了,需要一個(gè)數(shù)字證書(shū),就向 CA 申請(qǐng),CA 給我們頒發(fā)。
那么 CA 機(jī)構(gòu)自己的數(shù)字證書(shū)哪來(lái)的呢?答案是也是自己給自己頒發(fā)的,那么我們從哪里獲取呢?
如果從網(wǎng)上,或者從其它服務(wù)器下載,又有可能會(huì)被掉包,又不安全了。
這真的是個(gè)傷心的故事,但是今天兔哥非要把這個(gè)故事講完。
從網(wǎng)上下載或者從其它服務(wù)器下載數(shù)字證書(shū),都不安全的,那么怎么樣才是安全的呢?
答案就是:你的電腦安裝操作系統(tǒng)的時(shí)候,操作系統(tǒng)里面,就已經(jīng)內(nèi)置了非常多的 CA 機(jī)構(gòu)的數(shù)字證書(shū)了
也就說(shuō),只要你安裝了操作系統(tǒng),不管是 windows, linux, 或者 mac , 或者你剛買(mǎi)的電腦,里面都已經(jīng)有了 CA 機(jī)構(gòu)的數(shù)字證書(shū)了
這個(gè)是可以相信的,是真的 CA 機(jī)構(gòu)的數(shù)字證書(shū),不會(huì)有假。(除非你安裝的是盜版的操作系統(tǒng),所以我們盡量用正版操作系統(tǒng))
上面的過(guò)程真的是復(fù)雜啊,兔哥也是花了很久才搞明白的,知道這塊面試會(huì)坑很多人,其實(shí) https 過(guò)程不知道,也沒(méi)啥關(guān)系
也不影響你寫(xiě)代碼,但是那些面試官就死愛(ài)問(wèn)這塊,好像他們能搞懂這個(gè)過(guò)程很了不起似的,你問(wèn)點(diǎn)設(shè)計(jì)模式它不香嘛。
不過(guò)話說(shuō)回來(lái),兔哥在寫(xiě)自己的 HelloWorld 技術(shù)社區(qū) 的時(shí)候,配置 https ,數(shù)字證書(shū),不懂這些,還真的不好搞啊
寫(xiě)文章不容易,尤其是寫(xiě)這篇文章,為了寫(xiě)的更容易懂點(diǎn),花了不少精力,能看到這塊的,幫忙給個(gè)關(guān)注吧
尤其是幫忙宣傳一下兔哥的 HelloWorld 技術(shù)社區(qū) , 同一個(gè)世界,同一行代碼,我們的域名是:www.helloworld.net
我們的電腦,天生就有 CA 的數(shù)字證書(shū),而且是真的。天生的。上天定的,上天最大
那么我們就可以對(duì)數(shù)字證書(shū)進(jìn)行辨別真?zhèn)瘟恕?/p>
問(wèn)題九:對(duì)數(shù)字證書(shū)的驗(yàn)證
從上面可以知道:
小花收到了小明的數(shù)字證書(shū),首先要對(duì)數(shù)字證書(shū)進(jìn)行驗(yàn)證,就是驗(yàn)證此數(shù)字證書(shū)是不是 CA 頒發(fā)的
因?yàn)槲覀儾僮飨到y(tǒng)里面內(nèi)置了所有 CA 機(jī)構(gòu)的數(shù)字證書(shū),所以,我們就可以對(duì)數(shù)字證書(shū)進(jìn)行驗(yàn)證
在說(shuō)流程之前,先來(lái)簡(jiǎn)單的復(fù)習(xí)一下前面的,摘要和簽名怎么來(lái)的
摘要 = md5 (證書(shū)內(nèi)容) :?jiǎn)蜗蚣用芩惴ǎ热?md5,對(duì)證書(shū)整個(gè)內(nèi)容進(jìn)行加密,得到摘要,也叫做證書(shū)的指紋
簽名 = privateKey (摘要) : 私鑰對(duì)上一步摘要加密,產(chǎn)生簽名
數(shù)字證書(shū)的驗(yàn)證流程如下:
小花用內(nèi)置的 CA 的數(shù)字證書(shū),得到 CA 的公鑰
小明發(fā)過(guò)來(lái)的數(shù)字證書(shū),我們假如叫做 C , 小花用 CA 的公鑰對(duì) C 證書(shū)里面的簽名進(jìn)行解密,得到摘要 D
小花根據(jù) C 證書(shū)里面的摘要算法,假如是 md5,小花用 md5 對(duì)證書(shū)整個(gè)內(nèi)容進(jìn)行計(jì)算,得到摘要 D1
小花對(duì)比摘要 D 和摘要 D1 是否相等
如果 D == D1 ,那么說(shuō)明此證書(shū)就是 CA 頒發(fā)的
如果 D != D1 , 那么說(shuō)明此證書(shū)不是 CA 頒發(fā)的,是有風(fēng)險(xiǎn)的,不安全的
假如證書(shū)驗(yàn)證通過(guò),就說(shuō)明此證書(shū)的確是 CA 頒發(fā)的,此時(shí)小花就可以從數(shù)字證書(shū)中拿到小明的公鑰了
因?yàn)樾∶髟谏暾?qǐng)數(shù)字證書(shū)時(shí),數(shù)字證書(shū)中所有者是小明,CA 是會(huì)驗(yàn)證小明的身份的,所以數(shù)字證書(shū)中小明的公鑰是真實(shí)的
由至此,我們總算完成了一件事:小明正確的把自己的公鑰安全的傳輸給了小花
這件事的成立 ,接下來(lái)我們的工作就好做多了。接下來(lái),我們看一下具體的傳輸過(guò)程
問(wèn)題十 :完整的傳輸過(guò)程
下面我們看一下小明再次給小花通信,就和前面的不一樣了,我們來(lái)看下:
小明把寫(xiě)完的信,在信的底部,附加上摘要算法,假如是 MD5, 以及通過(guò) MD5 算出來(lái)的摘要
小明用自己的私鑰,對(duì)上一步的摘要進(jìn)行加密,得到簽名
小明把摘要算法,摘要,簽名都附加到信件底部以后,再把自己的數(shù)字證書(shū),一起發(fā)送給小花
小花收到信后,首先用自己的 CA 數(shù)字證書(shū),拿到 CA 公鑰,再用 CA 公鑰對(duì)數(shù)字證書(shū)進(jìn)行驗(yàn)證(也就是上面我們講的流程)
數(shù)字證書(shū)驗(yàn)證通過(guò)后,說(shuō)明證書(shū)就是 CA 頒發(fā)的,沒(méi)有被篡改
小花就從證書(shū)中拿到了小明的公鑰
有了小明的公鑰,接下來(lái)的過(guò)程,就是對(duì)信件內(nèi)容進(jìn)行驗(yàn)證了
對(duì)信件內(nèi)容的驗(yàn)證流程如下(前面其實(shí)我們講過(guò))
小花用小明的公鑰,對(duì)信件的簽名進(jìn)行解密,得到信件的摘要 D1
小花用摘要算法,對(duì)信件進(jìn)行運(yùn)算,得到信件的摘要 D2
小花對(duì)比 D1 是否等于 D2
如果不相等,說(shuō)明信件被人篡改過(guò),不安全
如果相等,說(shuō)明,信件內(nèi)容沒(méi)有被篡改過(guò)
相等的情況,小花就拿到了信件的內(nèi)容
總結(jié):
以上所有的內(nèi)容,是數(shù)字證書(shū),加密解密,簽名,驗(yàn)簽的過(guò)程,還沒(méi)有正式講 https 的過(guò)程呢。
有了以上的知識(shí),我們講起來(lái) https 就容易的多了。下面我們看一張圖
我們以訪問(wèn) www.helloworld.net 網(wǎng)站為例,講解 https 的過(guò)程
此過(guò)程分為 3 個(gè)階段,我們?cè)谙旅婷枋龃?3 個(gè)階段
訪問(wèn) www.helloworld.net 的過(guò)程 階段如下
網(wǎng)站申請(qǐng)證書(shū)階段
網(wǎng)站向 CA 機(jī)構(gòu)申請(qǐng)數(shù)字證書(shū)(需要提交一些材料,比如域名)
CA 向證書(shū)中寫(xiě)入摘要算法,域名,網(wǎng)站的公鑰等重要信息
CA 根據(jù)證書(shū)中寫(xiě)入的摘要算法,計(jì)算出證書(shū)的摘要
CA 用自己的私鑰對(duì)摘要進(jìn)行加密,計(jì)算出簽名
CA 生成一張數(shù)字證書(shū),頒發(fā)給了 www.helloworld.net
網(wǎng)站的管理員,把證書(shū)放在自己的服務(wù)器上
瀏覽器驗(yàn)證證書(shū)階段
瀏覽器在地址欄中輸入 https://www.helloworld.net,并回車(chē)
服務(wù)器將數(shù)字證書(shū)發(fā)送給瀏覽器
瀏覽器用操作系統(tǒng)內(nèi)置的 CA 的數(shù)字證書(shū),拿到 CA 的公鑰
瀏覽器用 CA 公鑰對(duì) www.helloworld.net 的數(shù)字證書(shū)進(jìn)行驗(yàn)簽
具體就是,瀏覽器用 CA 公鑰,對(duì) helloworld 的數(shù)字證書(shū)中的簽名進(jìn)行解密,得到摘要 D1
瀏覽器根據(jù) helloworld 數(shù)字證書(shū)中的摘要算法,計(jì)算出證書(shū)的摘要 D2
對(duì)比 D1 和 D2 是否相等。
如果不相等,說(shuō)明證書(shū)被掉包了
如果相等,說(shuō)明證書(shū)驗(yàn)證通過(guò)了。
協(xié)商對(duì)稱(chēng)加密密鑰階段
瀏覽器驗(yàn)證數(shù)字證書(shū)通過(guò)以后
瀏覽器拿到數(shù)字證書(shū)中的公鑰,也就是 www.helloworld.net 網(wǎng)站的公鑰
瀏覽器有了網(wǎng)站的公鑰后,就用公鑰進(jìn)行對(duì)密鑰S 進(jìn)行加密,加密以后的密文發(fā)送給服務(wù)器
服務(wù)器收到密文后,用自己的私鑰進(jìn)行解密,得到密鑰S
此后瀏覽器,服務(wù)器雙方就用密鑰S 進(jìn)行對(duì)稱(chēng)加密的通信了。
終止所述,終于講完了,花了整整一天的時(shí)間
過(guò)程那么多,其實(shí)抓住幾個(gè)關(guān)鍵的問(wèn)題是很簡(jiǎn)單的,本質(zhì)上還是兩個(gè)人,如何安全高效的進(jìn)行通信
我們?cè)俅魏?jiǎn)單的總結(jié)一下,采用一問(wèn)一答的方式,我覺(jué)得比較好
問(wèn)題一:小明和小花安全的通信,怎么做?
答:通過(guò)加密
問(wèn)題二:通過(guò)哪種加密方式通信,更高效?
答:對(duì)稱(chēng)加密
因?yàn)?,單向加密,沒(méi)辦法解密,不行
非對(duì)稱(chēng)加密,太慢,也不行
只有對(duì)稱(chēng)加密,速度快
問(wèn)題三:采用對(duì)稱(chēng)加密,密鑰 S 怎么安全傳輸?
答:小花使用小明的公鑰,對(duì)密鑰S 進(jìn)行加密,傳給小明
小明用自己的私鑰解密
問(wèn)題四:小明如何安全的把自己的公鑰傳輸給小花?
答:使用數(shù)字證書(shū)
具體就是 小明向 CA 申請(qǐng)一個(gè)自己的數(shù)字證書(shū),把自己的公鑰放在證書(shū)中
小明將數(shù)字證書(shū)發(fā)送給小花
問(wèn)題五:小花如何驗(yàn)證數(shù)字證書(shū)的真實(shí)性?
答:小花用操作系統(tǒng)內(nèi)置的 CA 的數(shù)字證書(shū),拿到 CA 的公鑰,用 CA 的公鑰,對(duì)數(shù)字證書(shū)進(jìn)行驗(yàn)簽
驗(yàn)簽通過(guò),說(shuō)明數(shù)字證書(shū)是真的。
以上幾個(gè)問(wèn)題,希望讀者多問(wèn)問(wèn)自己,如果是自己,應(yīng)該怎么解決這個(gè)問(wèn)題。
編輯:黃飛
?
評(píng)論