新聞中心
前面幾篇博客聊了HTTP的相關(guān)東西,今天就來(lái)聊一聊HTTPS的東西。因?yàn)镠TTP協(xié)議本身存在著明文傳輸、不能很好的驗(yàn)證通信方的身份和無(wú)法驗(yàn)證報(bào)文的完整性等一些安全方面的確點(diǎn),所以才有了HTTPS的缺陷。HTTPS確切的的說(shuō)不是一種協(xié)議,而是HTTP + SSL (TSL)的結(jié)合體。HTTP報(bào)文經(jīng)過(guò)SSL層加密后交付給TCP層進(jìn)行傳輸。SSL(安全套節(jié)層)主要采取的是RSA(非對(duì)稱加密)與AES(對(duì)稱加密)結(jié)合的加密方式。先通過(guò)RSA交互AES的密鑰,然后通過(guò)AES進(jìn)行報(bào)文加密和解密。本篇博客主要聊的就是HTTPS具體的工作過(guò)程。

創(chuàng)新互聯(lián)是專業(yè)的仙居網(wǎng)站建設(shè)公司,仙居接單;提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行仙居網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
一、RSA與AES簡(jiǎn)述
在本篇博客的開(kāi)頭部分呢,先聊一下RAS與AES這兩個(gè)加密策略,如果你在公司做過(guò)支付相關(guān)的東西,對(duì)數(shù)據(jù)傳輸?shù)陌踩砸蟊容^高,這時(shí)候就得采取一些加密措施將傳輸?shù)膱?bào)文進(jìn)行加密,必要時(shí)再進(jìn)行MD5驗(yàn)簽。當(dāng)然本部分聊的RAS與AES是比較簡(jiǎn)潔的,關(guān)于這兩者具體的內(nèi)容,請(qǐng)自行Google吧。因?yàn)镠TTPS在傳輸?shù)倪^(guò)程中使用到了RSA與AES加密算法,所以在聊HTTP+SSL之前呢,我們先簡(jiǎn)單的聊一下AES與RSA。
1、Advanced Encryption Standard (AES: 高級(jí)加密標(biāo)準(zhǔn))
AES,全稱:Advanced Encryption Standard----高級(jí)加密標(biāo)準(zhǔn)。該加密算法有一個(gè)密鑰,該密鑰可以用來(lái)加密,也可以用來(lái)解密,所以AES是對(duì)稱加密算法。下方這個(gè)就是AES加密和解密的過(guò)程。Client端與Server端有一個(gè)共同的Key, 這個(gè)Key是用來(lái)加密和解密的。如果報(bào)文在傳輸?shù)倪^(guò)程中被竊取了,沒(méi)有這個(gè)key, 對(duì)加密的內(nèi)容進(jìn)行破解是非常困難的,當(dāng)然竊取者如果有key的話,也是可以輕而易舉的解密的。所以在AES中,key是關(guān)鍵。這也就相當(dāng)于你們家的門鑰匙,誰(shuí)拿到鑰匙后都可以打開(kāi)你們家的門。即使門鎖再結(jié)實(shí),再安全,在鑰匙面前也是不行呢。
所以對(duì)于AES加密策略來(lái)說(shuō)這個(gè)Key的保密措施要做足一些,如果之后有時(shí)間的話可以分享一些具體的AES加密策略。比如每次加密的Key都是從一個(gè)密碼本中動(dòng)態(tài)生成的,而這個(gè)密碼本服務(wù)端和客戶端都有同一本,每次傳輸?shù)氖且恍﹨?shù)。這些參數(shù)在經(jīng)過(guò)一些算法的映射,從密碼本中取出相應(yīng)的key用來(lái)解密。這樣一來(lái),就相當(dāng)于給AES加了一層防盜門,加大了破解的難度。這樣做的好處是每次加密的key都是不同的,而且需要密碼本以及映射算法的支持。
2、RSA 公鑰加密算法
RAS這個(gè)名字,就是該算法三位發(fā)明者的名字的首字母的組合。RAS是非對(duì)稱加密,其在加密和解密的過(guò)程中,需要兩個(gè)Key,一個(gè)公鑰(public key),一個(gè)是私鑰(private key)。公鑰負(fù)責(zé)加密,而私鑰負(fù)責(zé)解密。從名字就可以看出,公鑰是可以開(kāi)放出去的,任何人都可以持有公鑰進(jìn)行加密。而私鑰必須得進(jìn)行保護(hù),因?yàn)槭怯脕?lái)解密的。
這樣一來(lái),加密和解密就可以用不同的鑰匙來(lái)處理。對(duì)于加密放來(lái)說(shuō),即使你可以對(duì)報(bào)文進(jìn)行加密,如果沒(méi)有私有的話也是不可以對(duì)你加密的內(nèi)容進(jìn)行解密的。這就相當(dāng)于一個(gè)盒子,盒子上有把鎖。你可以把東西放進(jìn)去,然后再鎖上盒子。但是如果你沒(méi)有鑰匙的話,也是打不開(kāi)這把鎖的。
下方這個(gè)簡(jiǎn)圖就是服務(wù)端單向驗(yàn)證的RAS非對(duì)稱加密算法,Client內(nèi)置了一個(gè)公鑰,該公鑰與Server端的私鑰是配對(duì)的,所以Client端可以使用這個(gè)內(nèi)置的Public key加密,而服務(wù)端就可以使用這個(gè)private key進(jìn)行解密。目前最常用的是服務(wù)端單向認(rèn)證機(jī)制。
二、CA證書(shū)
如果你自己通過(guò)RAS算法生成了一個(gè)私鑰和公鑰,在公鑰發(fā)送給客戶端的過(guò)程中有可能被篡改成其他的公鑰,而客戶端在沒(méi)有其他措施的保護(hù)下是不知道該公鑰是否就是服務(wù)器那邊的私鑰對(duì)應(yīng)的公鑰的。這種自己做的RAS的公鑰和私鑰有可能在公鑰分發(fā)的過(guò)程中被篡改。下方就是Client從Server端獲取公鑰時(shí)被中間者篡改了,將public換成了自己的偽public key, 同樣這個(gè)中間者持有這個(gè)偽public key所對(duì)應(yīng)的偽private key。如果客戶端使用的偽public key進(jìn)行加密傳輸?shù)脑?,那么中間者是可以使用自己的private key進(jìn)行解密的。
舉個(gè)例子來(lái)類比一下這個(gè)問(wèn)題。
假設(shè)你在古代,你出門在外,妻子在家養(yǎng)子。你們家有個(gè)箱子,箱子上有把鎖,這就是你和你妻子互通的工具。你媳婦兒負(fù)責(zé)往箱子里放東西,然后上鎖。你有把獨(dú)特的鑰匙,你負(fù)責(zé)開(kāi)鎖,取東西??墒悄阍賹⑾渥咏o鏢局托運(yùn)的的過(guò)程中,被鏢局的“小黑”掉包了,箱子的外表一致,鎖看起來(lái)也一樣,可是已經(jīng)不是你的箱子了。因?yàn)槁吠具b遠(yuǎn),古代又沒(méi)有什么iPhone啥的,你媳婦沒(méi)辦法來(lái)辨別該箱子是否是原裝的。然后就將一些東西放在了箱子里邊,然后上鎖交給了鏢局的“小黑”。
因?yàn)椤靶『凇钡舭南渥?,所以小黑有箱子的鑰匙呢,然后就可以打開(kāi)這個(gè)箱子,取東西了。原來(lái)的箱子又在小黑那,小黑就可以往原來(lái)的箱子里邊隨便往箱子放點(diǎn)沒(méi)有價(jià)值的東西給你就行了。當(dāng)你發(fā)現(xiàn)箱子里的東西不是你想要的時(shí)候,完了,小黑從鏢局辭職了,找不到人了。找鏢局的人討說(shuō)法,可是鏢局的人說(shuō)“小黑”是鏢局的臨時(shí)工,這個(gè)責(zé)任鏢局說(shuō)了,我們不能擔(dān)。鑒于你無(wú)權(quán)無(wú)勢(shì),這事兒也就此罷了。(故事純屬虛構(gòu),如有雷同純屬巧合)
關(guān)于更多騙子的故事請(qǐng)移步網(wǎng)絡(luò)劇《毛騙》一二三季。
為了防止“小黑”再次作案,所以頒布一個(gè)公正機(jī)構(gòu)來(lái)證明你媳婦收到的箱子就是你發(fā)出的箱子。在RAS加密中也有一個(gè)第三方機(jī)構(gòu)來(lái)充當(dāng)這個(gè)角色,負(fù)責(zé)證明客戶端收到的證書(shū)就是你發(fā)送的證書(shū),中間沒(méi)有被篡改。這個(gè)中間認(rèn)證機(jī)構(gòu),就是數(shù)組證書(shū)認(rèn)證機(jī)構(gòu), 其頒發(fā)的證書(shū)也就是我們常說(shuō)的CA證書(shū)(CA , Certificate Authority)。
下面我們就來(lái)詳細(xì)的敘述一下證書(shū)簽名,證書(shū)分發(fā)以及證書(shū)驗(yàn)證的整個(gè)過(guò)程。
1、服務(wù)端人員使用RSA算法生成兩個(gè)密鑰,一個(gè)用來(lái)加密一個(gè)用來(lái)解密。將負(fù)責(zé)加密的那個(gè)密鑰公布出去,所以我們稱之為公鑰(Public Key),而用來(lái)解密的那個(gè)密鑰,不能對(duì)外公布,只有服務(wù)端持有,所以我們稱之為私鑰(Private Key)。服務(wù)端在將Public Key進(jìn)行分發(fā)證書(shū)之前需要向CA機(jī)構(gòu)申請(qǐng)給將要分發(fā)的公鑰進(jìn)行數(shù)字簽名。(服務(wù)器公鑰負(fù)責(zé)加密,服務(wù)器私鑰負(fù)責(zé)解密)
2、生成數(shù)字簽名公鑰證書(shū):對(duì)于CA機(jī)構(gòu)來(lái)說(shuō),其也有兩個(gè)密鑰,我們暫且稱之為CA私鑰和CA公鑰。CA機(jī)構(gòu)將服務(wù)端的Public Key作為輸入?yún)?shù)將其轉(zhuǎn)換為一個(gè)特有的Hash值。然后使用CA私鑰將這個(gè)Hash值進(jìn)行加密處理,并與服務(wù)端的Public Key綁定在一起,生成數(shù)字簽名證書(shū)。其實(shí)數(shù)字簽名證書(shū)的本質(zhì)就是服務(wù)端的公鑰+CA私鑰加密的Hash值。(CA私鑰負(fù)責(zé)簽名,CA公鑰負(fù)責(zé)驗(yàn)證)
3、服務(wù)器獲取到這個(gè)已經(jīng)含有數(shù)字簽名并帶有公鑰的證書(shū),將該證書(shū)發(fā)送給客戶端。當(dāng)客戶端收到該公鑰數(shù)字證書(shū)后,會(huì)驗(yàn)證其有效性。大部分客戶端都會(huì)預(yù)裝CA機(jī)構(gòu)的公鑰,也就是CA公鑰??蛻舳耸褂肅A公鑰對(duì)數(shù)字證書(shū)上的簽名進(jìn)行驗(yàn)證,這個(gè)驗(yàn)證的過(guò)程就是使用CA公鑰對(duì)CA私鑰加密的內(nèi)容進(jìn)行解密,將解密后的內(nèi)容與服務(wù)端的Public Key所生成的Hash值進(jìn)行匹配,如果匹配成功,則說(shuō)明該證書(shū)就是相應(yīng)的服務(wù)端發(fā)過(guò)來(lái)的。否則就是非法證書(shū)。
4、驗(yàn)證完服務(wù)端公鑰的合法性后,就可以使用該公鑰進(jìn)行加密通信了。
下方這個(gè)截圖就是蘋(píng)果的根證書(shū)的一些信息,從下方可以看出,CA證書(shū)內(nèi)容中包括加密算法,公共密鑰以及數(shù)字簽名。
下方就是公鑰以及數(shù)字簽名的具體內(nèi)容,當(dāng)對(duì)下方公共密鑰進(jìn)行驗(yàn)證時(shí),需要使用內(nèi)置的CA公鑰將數(shù)字簽名進(jìn)行解密。然后將解密后的內(nèi)容,與公鑰生成的Hash值進(jìn)行比較,如果匹配成功,那么該證書(shū)就是CA機(jī)構(gòu)頒布的合法證書(shū)。
三、HTTPS安全通信機(jī)制的建立
上面我們聊完AES與RSA加密策略,然后又聊了帶有數(shù)字簽名的公共密鑰。上面這兩部分內(nèi)容都是為HTTPS做鋪墊的,接下來(lái)就看一看HTTP+SSL是如何進(jìn)行數(shù)據(jù)傳輸?shù)摹?/p>
1、HTTPS簡(jiǎn)介
在開(kāi)頭的部分也說(shuō)了,HTTPS不是一個(gè)新的通信協(xié)議,而是HTTP與SSL(或TSL)的組合。SSL--安全套節(jié)層(Secure Socket Layer), TSL(Transport Layer Security 安全傳輸層)是以SSL為原型開(kāi)發(fā)的協(xié)議,IETF以SSL3.0為基準(zhǔn)后又制定了TLS1.0、TLS1.1和TLS1.2,當(dāng)前主流版本為SSL3.0與TLS1.0。
HTTPS就是在HTTP與TCP層中間添加了一個(gè)SSL層。因?yàn)镠TTPS被HTTP多了這層加密的流程,所以HTTPS的速度要比HTTP慢的多。
2、HTTPS的通信過(guò)程
SSL的加密過(guò)程是RSA與AES混合進(jìn)行的。簡(jiǎn)單概括一下,就是通過(guò)RSA加密方式來(lái)交換AES加解密的密鑰,然后使用AES加密的方式來(lái)傳輸報(bào)文。下方是SSL建立連接以及傳輸數(shù)據(jù)的圖解。在下圖中大體可以分為四步:
第一步:有客戶端發(fā)起的第一次握手,此次握手過(guò)程的主要目的是從服務(wù)端獲取數(shù)字簽名證書(shū),服務(wù)端在發(fā)送數(shù)字簽名證書(shū)之前要先確認(rèn)客戶端的SSL版本、加密算法等信息。
第二步:完成第一次握手后,接著進(jìn)行第二次握手。第二次握手是在客戶端收到證書(shū)后發(fā)起的,主要目的是將AES加解密使用的Key (Pre-master secret)發(fā)送給服務(wù)端。當(dāng)然這個(gè)AES_KEY是使用第一次握手獲取的公鑰進(jìn)行加密的??蛻舳耸盏竭@個(gè)使用公鑰加密后的AES_KEY,使用服務(wù)端的私鑰進(jìn)行解密。這樣客戶端和服務(wù)端經(jīng)過(guò)二次握手后都持有了AES加解密的KEY。
第三步:當(dāng)Client與Server端都持有AES_KEY后,就可以對(duì)HTTP報(bào)文進(jìn)行加解密了。
END: 就是斷開(kāi)連接了。具體如下圖所示:
當(dāng)前標(biāo)題:數(shù)字簽名與HTTPS詳解
轉(zhuǎn)載來(lái)于:http://www.dlmjj.cn/article/cdipsch.html


咨詢
建站咨詢
