Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 499, comments - 13, trackbacks - 0, articles - 1

          1、引言

          HTTPS(全稱: Hypertext Transfer Protocol Secure,超文本傳輸安全協(xié)議),是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版。本文,就來深入介紹下其原理。

          補(bǔ)充:限于篇幅,本文對于https的相關(guān)技術(shù)要點(diǎn)的介紹盡量簡明扼要,如想要詳細(xì)了解HTTPS的方方面面,請閱讀《即時通訊安全篇(七):如果這樣來理解HTTPS,一篇就夠了》。

          (本文同步發(fā)布于:http://www.52im.net/thread-2446-1-1.html

          2、相關(guān)文章

          即時通訊安全篇(七):如果這樣來理解HTTPS,一篇就夠了

          一文讀懂Https的安全性原理、數(shù)字證書、單項(xiàng)認(rèn)證、雙項(xiàng)認(rèn)證等

          HTTPS時代已來,打算更新你的HTTP服務(wù)了嗎?

          蘋果即將強(qiáng)制實(shí)施 ATS,你的APP準(zhǔn)備好切換到HTTPS了嗎?

          一分鐘理解 HTTPS 到底解決了什么問題

          3、為什么需要https

          原因其實(shí)很簡單:就是因?yàn)閔ttp不安全。

          當(dāng)我們往服務(wù)器發(fā)送比較隱私的數(shù)據(jù)(比如說你的銀行卡,身份證)時,如果使用http進(jìn)行通信。那么安全性將得不到保障。

          首先數(shù)據(jù)在傳輸?shù)倪^程中,數(shù)據(jù)可能被中間人抓包拿到,那么數(shù)據(jù)就會被中間人竊取。

          其次數(shù)據(jù)被中間人拿到后,中間人可能對數(shù)據(jù)進(jìn)行修改或者替換,然后發(fā)往服務(wù)器。

          最后服務(wù)器收到數(shù)據(jù)后,也無法確定數(shù)據(jù)有沒有被修改或替換,當(dāng)然,如果服務(wù)器也無法判斷數(shù)據(jù)就真的是來源于客戶端。

          總結(jié)下來,http存在三個弊端:

          1)無法保證消息的保密性;

          2)無法保證消息的完整性和準(zhǔn)確性;

          3)無法保證消息來源的可靠性。

          https就是為了解決上述問題應(yīng)運(yùn)而生的。

          4、基本概念:加密技術(shù)、數(shù)字證書和數(shù)字簽名

          為了解決http中存在的問題,https采用了一些加解密,數(shù)字證書,數(shù)字簽名的技術(shù)來實(shí)現(xiàn)。下面先介紹一下這些技術(shù)的基本概念。

          4.1 對稱加密與非對稱加密

          為了保證消息的保密性,就需要用到加密和解密。加解密算法目前主流的分為對稱加密和非對稱加密。

          (4.1.1)對稱加密(共享密匙加密):

          客戶端和服務(wù)器公用一個密匙用來對消息加解密,這種方式稱為對稱加密。客戶端和服務(wù)器約定好一個加密的密匙。客戶端在發(fā)消息前用該密匙對消息加密,發(fā)送給服務(wù)器后,服務(wù)器再用該密匙進(jìn)行解密拿到消息。

          對稱加密的優(yōu)點(diǎn):對稱加密解決了http中消息保密性的問題

          對稱加密的缺點(diǎn):對稱加密雖然保證了消息保密性,但是因?yàn)榭蛻舳撕头?wù)器共享一個密匙,這樣就使得密匙特別容易泄露。

          因?yàn)槊艹仔孤讹L(fēng)險較高,所以很難保證消息來源的可靠性、消息的完整性和準(zhǔn)確性。

          (4.1.2)非對稱加密(公有密匙加密):

          既然對稱加密中,密匙那么容易泄露,那么我們可以采用一種非對稱加密的方式來解決。

          采用非對稱加密時,客戶端和服務(wù)端均擁有一個公有密匙和一個私有密匙。公有密匙可以對外暴露,而私有密匙只有自己可見。

          使用公有密匙加密的消息,只有對應(yīng)的私有密匙才能解開。反過來,使用私有密匙加密的消息,只有公有密匙才能解開。這樣客戶端在發(fā)送消息前,先用服務(wù)器的公匙對消息進(jìn)行加密,服務(wù)器收到后再用自己的私匙進(jìn)行解密。

          非對稱加密的優(yōu)點(diǎn):

          1)非對稱加密采用公有密匙和私有密匙的方式,解決了http中消息保密性問題,而且使得私有密匙泄露的風(fēng)險降低;

          2)因?yàn)楣准用艿南⒅挥袑?yīng)的私匙才能解開,所以較大程度上保證了消息的來源性以及消息的準(zhǔn)確性和完整性。

          非對稱加密的缺點(diǎn):

          1)非對稱加密時需要使用到接收方的公匙對消息進(jìn)行加密,但是公匙不是保密的,任何人都可以拿到,中間人也可以。那么中間人可以做兩件事,第一件是中間人可以在客戶端與服務(wù)器交換公匙的時候,將客戶端的公匙替換成自己的。這樣服務(wù)器拿到的公匙將不是客戶端的,而是服務(wù)器的。服務(wù)器也無法判斷公匙來源的正確性。第二件是中間人可以不替換公匙,但是他可以截獲客戶端發(fā)來的消息,然后篡改,然后用服務(wù)器的公匙加密再發(fā)往服務(wù)器,服務(wù)器將收到錯誤的消息;

          2)非對稱加密的性能相對對稱加密來說會慢上幾倍甚至幾百倍,比較消耗系統(tǒng)資源。正是因?yàn)槿绱耍琱ttps將兩種加密結(jié)合了起來。


          4.2 數(shù)字證書與數(shù)字簽名

          為了解決非對稱加密中公匙來源的不安全性。我們可以使用數(shù)字證書和數(shù)字簽名來解決。

          (4.2.1)數(shù)字證書的申請:

          在現(xiàn)實(shí)中,有一些專門的權(quán)威機(jī)構(gòu)用來頒發(fā)數(shù)字證書,我們稱這些機(jī)構(gòu)為認(rèn)證中心(CA Certificate Authority)。

          我們(服務(wù)器)可以向這些CA來申請數(shù)字證書。

          申請的過程大致是:

          1)自己本地先生成一對密匙,然后拿著自己的公匙以及其他信息(比如說企業(yè)名稱啊什么的)去CA申請數(shù)字證書。

          2)CA在拿到這些信息后,會選擇一種單向Hash算法(比如說常見的MD5)對這些信息進(jìn)行加密,加密之后的東西我們稱之為摘要:

          單向Hash算法有一種特點(diǎn)就是單向不可逆的,只要原始內(nèi)容有一點(diǎn)變化,加密后的數(shù)據(jù)都將會是千差萬別(當(dāng)然也有很小的可能性會重復(fù),有興趣的小伙伴鴿巢原理了解一下),這樣就防止了信息被篡改。

          3)生成摘要后還不算完,CA還會用自己的私匙對摘要進(jìn)行加密,摘要加密后的數(shù)據(jù)我們稱之為數(shù)字簽名。

          4)最后,CA將會把我們的申請信息(包含服務(wù)器的公匙)和數(shù)字簽名整合在一起,由此而生成數(shù)字證書。

          5)然后CA將數(shù)字證書傳遞給我們。

          (4.2.2)數(shù)字證書怎么起作用:

          服務(wù)器在獲取到數(shù)字證書后,服務(wù)器會將數(shù)字證書發(fā)送給客戶端,客戶端就需要用CA的公匙解密數(shù)字證書并驗(yàn)證數(shù)字證書的合法性。那我們?nèi)绾文苣玫紺A的公匙呢?我們的電腦和瀏覽器中已經(jīng)內(nèi)置了一部分權(quán)威機(jī)構(gòu)的根證書,這些根證書中包含了CA的公匙。

          之所以是根證書,是因?yàn)楝F(xiàn)實(shí)生活中,認(rèn)證中心是分層級的,也就是說有頂級認(rèn)證中心,也有下面的各個子級的認(rèn)證中心,是一個樹狀結(jié)構(gòu),計算機(jī)中內(nèi)置的是最頂級機(jī)構(gòu)的根證書,不過不用擔(dān)心,根證書的公匙在子級也是適用的。

          客戶端用CA的公匙解密數(shù)字證書,如果解密成功則說明證書來源于合法的認(rèn)證機(jī)構(gòu)。解密成功后,客戶端就拿到了摘要。

          此時,客戶端會按照和CA一樣的Hash算法將申請信息生成一份摘要,并和解密出來的那份做對比,如果相同則說明內(nèi)容完整,沒有被篡改。最后,客戶端安全的從證書中拿到服務(wù)器的公匙就可以和服務(wù)器進(jìn)行安全的非對稱加密通信了。服務(wù)器想獲得客戶端的公匙也可以通過相同方式。

          下圖用圖解的方式說明一般的證書申請及其使用過程:

          5、https的工作原理

          通過上面的學(xué)習(xí),我們了解對稱加密與非對稱加密的特點(diǎn)和優(yōu)缺點(diǎn),以及數(shù)字證書的作用。https沒有采用單一的技術(shù)去實(shí)現(xiàn),而是根據(jù)他們的特點(diǎn),充分的將這些技術(shù)整合進(jìn)去,以達(dá)到性能與安全最大化。這套整合的技術(shù)我們稱之為SSL(Secure Scoket Layer 安全套接層)。

          所以https并非是一項(xiàng)新的協(xié)議,它只是在http上披了一層加密的外殼。 

          先看一下https連接的建立流程圖:

          如上圖所,這里把https連接建立到斷開分為6個階段,12過程。

          下面將對12個過程一 一做解釋:

          1)客戶端通過發(fā)送Client Hello報文開始SSL通信。報文中包含客戶端支持的SSL的指定版本、加密組件(Cipher Suite)列表(所使用的加密算法及密匙長度等);

          2)服務(wù)器可進(jìn)行SSL通信時,會以Server Hello報文作為應(yīng)答。和客戶端一樣,在報文中包含SSL版本以及加密組件。服務(wù)器的加密組件內(nèi)容時從接收到的客戶端加密組件內(nèi)篩選出來的;

          3)服務(wù)器發(fā)送證書報文。報文中包含公開密匙證書;

          4)最后服務(wù)器發(fā)送Server Hello Done報文通知客戶端,最初階段的SSL握手協(xié)商部分結(jié)束;

          5)SSL第一次握手結(jié)束之后,客戶端以Client Key Exchange報文作為回應(yīng)。報文包含通信加密中使用的一種被稱為Pre-master secret的隨機(jī)密碼串。該報文已用步驟3中的公開密匙進(jìn)行加密;

          6)接著客戶端繼續(xù)發(fā)送Change Cipher Spec報文。該報文會提示服務(wù)器,在此報文之后的通信會采用Pre-master secret密匙加密;

          7)客戶端發(fā)送Finished報文。該報文包含連接至今全部報文的整體校驗(yàn)值。這次握手協(xié)商是否能夠成功,要以服務(wù)器是否能夠正確解密該報文作為判定標(biāo)準(zhǔn);

          8)服務(wù)器同樣發(fā)送Change Cipher Spec報文;

          9)服務(wù)器同樣發(fā)送Finished報文;

          10)服務(wù)器和客戶端的Finished報文交換完畢之后,SSL連接就算建立完成。當(dāng)然,通信會收到SSL的保護(hù)。從此處開始進(jìn)行應(yīng)用層協(xié)議的通信,即發(fā)送HTTP請求;

          11)應(yīng)用層協(xié)議通信,即發(fā)送HTTP相應(yīng);

          12)最后由客戶端斷開連接。斷開連接時,發(fā)送close_notify報文。上圖做了一些省略,這步之后再發(fā)送TCP FIN報文來關(guān)閉與TCP的通信。

          另外,在以上流程圖中,應(yīng)用層發(fā)送數(shù)據(jù)時會附加一種叫做MAC(Message Authentication Code)的報文摘要。MAC能夠查知報文是否遭到篡改,從而保證報文的完整性。

          下面再用圖解來形象的說明一下,此圖比上面數(shù)字證書的圖更加的詳細(xì)一些(圖片來源于《圖解HTTP):

          經(jīng)過上面的介紹,我們可以看出https先是利用數(shù)字證書保證服務(wù)器端的公匙可以安全無誤的到達(dá)客戶端。然后再用非對稱加密安全的傳遞共享密匙,最后用共享密匙安全的交換數(shù)據(jù)。

          6、一定要用https嗎?

          https那么的安全,是不是我們在什么場景下都要去使用https進(jìn)行通信呢?答案是否定的。

          1)https雖然提供了消息安全傳輸?shù)耐ǖ溃敲看蜗⒌募咏饷苁趾臅r,消息系統(tǒng)資源。所以,除非在一些對安全性比較高的場景下,比如銀行系統(tǒng),購物系統(tǒng)中我們必須要使用https進(jìn)行通信,其他一些對安全性要求不高的場景,我們其實(shí)沒必要使用https。

          2)使用https需要使用到數(shù)字證書,但是一般權(quán)威機(jī)構(gòu)頒發(fā)的數(shù)字證書都是收費(fèi)的,而且價格也是不菲的,所以對于一些個人網(wǎng)站特別是學(xué)生來講,如果對安全性要求不高,也沒必要使用https。

          7、參考資料

          [1] 通俗理解數(shù)字簽名,數(shù)字證書和https

          [2]一個故事講完https

          [3] 圖解HTTP

          附錄:更多安全方面的文章

          即時通訊安全篇(一):正確地理解和使用Android端加密算法

          即時通訊安全篇(二):探討組合加密算法在IM中的應(yīng)用

          即時通訊安全篇(三):常用加解密算法與通訊安全講解

          即時通訊安全篇(四):實(shí)例分析Android中密鑰硬編碼的風(fēng)險

          即時通訊安全篇(五):對稱加密技術(shù)在Android平臺上的應(yīng)用實(shí)踐

          即時通訊安全篇(六):非對稱加密技術(shù)的原理與應(yīng)用實(shí)踐

          即時通訊安全篇(七):用JWT技術(shù)解決IM系統(tǒng)Socket長連接的身份認(rèn)證痛點(diǎn)

          傳輸層安全協(xié)議SSL/TLS的Java平臺實(shí)現(xiàn)簡介和Demo演示

          理論聯(lián)系實(shí)際:一套典型的IM通信協(xié)議設(shè)計詳解(含安全層設(shè)計)

          微信新一代通信安全解決方案:基于TLS1.3的MMTLS詳解

          來自阿里OpenIM:打造安全可靠即時通訊服務(wù)的技術(shù)實(shí)踐分享

          簡述實(shí)時音視頻聊天中端到端加密(E2EE)的工作原理

          移動端安全通信的利器——端到端加密(E2EE)技術(shù)詳解

          Web端即時通訊安全:跨站點(diǎn)WebSocket劫持漏洞詳解(含示例代碼)

          通俗易懂:一篇掌握即時通訊的消息傳輸安全原理

          IM開發(fā)基礎(chǔ)知識補(bǔ)課(四):正確理解HTTP短連接中的Cookie、Session和Token

          快速讀懂量子通信、量子加密技術(shù)

          即時通訊安全篇(七):如果這樣來理解HTTPS原理,一篇就夠了

          一分鐘理解 HTTPS 到底解決了什么問題

          一篇讀懂HTTPS:加密原理、安全邏輯、數(shù)字證書等

          >> 更多同類文章 ……

          (本文同步發(fā)布于:http://www.52im.net/thread-2446-1-1.html



          作者:Jack Jiang (點(diǎn)擊作者姓名進(jìn)入Github)
          出處:http://www.52im.net/space-uid-1.html
          交流:歡迎加入即時通訊開發(fā)交流群 215891622
          討論:http://www.52im.net/
          Jack Jiang同時是【原創(chuàng)Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
          本博文 歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處(也可前往 我的52im.net 找到我)。


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 三明市| 乳山市| 云霄县| 安顺市| 海晏县| 南雄市| 商都县| 垫江县| 万载县| 长武县| 抚顺市| 榕江县| 榆树市| 古田县| 北碚区| 霍城县| 元江| 周至县| 伊金霍洛旗| 亳州市| 泸州市| 巴东县| 丁青县| 安宁市| 巩义市| 株洲市| 浮梁县| 白城市| 仲巴县| 水富县| 芦溪县| 台湾省| 青州市| 岑巩县| 河间市| 紫金县| 枣强县| 清流县| 襄樊市| 商南县| 双江|