一、開篇
??簡(jiǎn)單粗暴,本文來聊聊HTTPS。
??啥是HTTPS? 說白了就是HTTP Over SSL。HTTP呢,就是我們平時(shí)上網(wǎng)時(shí),瀏覽器和服務(wù)器之間傳輸數(shù)據(jù)的一項(xiàng)協(xié)議。普通情況下,瀏覽器發(fā)送的請(qǐng)求會(huì)經(jīng)過若干個(gè)網(wǎng)絡(luò)中間節(jié)點(diǎn),最后到達(dá)服務(wù)器;然后服務(wù)器又將請(qǐng)求的數(shù)據(jù)經(jīng)過若干個(gè)網(wǎng)絡(luò)中間節(jié)點(diǎn)發(fā)送回給瀏覽器,這時(shí)候?yàn)g覽器就能夠顯示我們想要看到的頁面。
??這個(gè)過程中,其實(shí)并沒有存在什么太大的問題。問題出在,如果我們需要在網(wǎng)頁上輸入一些敏感信息,如我們的銀行卡賬號(hào)和密碼,發(fā)送給服務(wù)器,就會(huì)在中間節(jié)點(diǎn)中存在泄漏的風(fēng)險(xiǎn)。HTTPS就是為了保障傳輸過程中的安全目的而生的。HTTPS保證了數(shù)據(jù)僅僅只在發(fā)送方和目的方雙方可見,而對(duì)中間任一一個(gè)節(jié)點(diǎn)都不可見。這是怎么實(shí)現(xiàn)的?我們來慢慢看。
二、故事
我們首先來看一個(gè)故事:
1)流程
??有兩個(gè)大師,他們需要經(jīng)常交流研究心得,因此需要頻繁地進(jìn)行相互信件往來。在信件往來的過程中,我們假設(shè)發(fā)送方是大師A,而目的方是大師B。A想告訴B一些研究的最新成果,于是將相關(guān)的研究成果寫成了一封信,從郵局郵寄給B。這封信通過郵局的若干個(gè)快遞員,最終到達(dá)了B的手里。這樣就形成了一個(gè)最典型的數(shù)據(jù)傳輸過程。
2)加密、解密、密鑰、加密算法
??現(xiàn)在,大師A覺得,我寫的這封信,要是哪個(gè)快遞員打開看過了,我的最新研究成果不就泄漏了嗎?要是這個(gè)快遞員拿去賣錢我半輩子努力不就白費(fèi)了?于是乎大師A就想了個(gè)辦法,在書寫的過程中,每個(gè)字符都加4。如字符A就寫成E,字符B就寫成F,以此類推。大師B收到了信件后,再把每個(gè)字符都減去4,這樣就可以正確得到大師A想傳遞的研究成果的內(nèi)容。而最重要的是,即使快遞員在中間拆開信件,如果不知道4這個(gè)數(shù)字,是無法正確的到信件內(nèi)容的。
??我們將大師A每個(gè)字符加4的過程,叫做“加密”;大師B每個(gè)字符減4的過程,叫做“解密”;而數(shù)字4,就是我們常說的密鑰。而這種加密算法,名為凱撒算法。
3)證書
??就這樣,平安地度過了一段時(shí)間,直到突然有一天大師B收到一封來自于大師A的信,但是大師B使用之前的方式怎么也明白不了大師A說的是什么。于是電話詢問大師A關(guān)于這封信的內(nèi)容。結(jié)果大師A說,這不是我寫的啊。這才發(fā)現(xiàn),大師B收到的是一封偽造大師A的來信。為防止以上事情再次發(fā)生,大師A與大師B商量說,以后每封信上,我都會(huì)簽上自己特有的簽名,并帶上相關(guān)內(nèi)容的HASH值。
??HASH值用來校驗(yàn)這封信是否有被篡改過,而簽名類似于指紋,用來標(biāo)示這封信是否真實(shí)來自于指紋上所指向的人。一般來說,簽名的內(nèi)容中會(huì)包含這封信的發(fā)件方地址等信息。大師B收到信件后第一時(shí)間通過內(nèi)容的HASH值來校驗(yàn)信件的內(nèi)容長(zhǎng)度;通過簽名來校驗(yàn)發(fā)件方地址和指紋信息是否匹配。只有全部匹配才繼續(xù)用之前的密鑰進(jìn)行解密操作。
??這些標(biāo)明了大師A身份信息等信息的簽名,就是我們常說的證書。
??經(jīng)過以上的故事,我們大致明白了密鑰、加密解密、算法等必要的知識(shí)了。而HTTPS的過程其實(shí)和這個(gè)類似,只不過多了一些數(shù)學(xué)的描述。
三、HTTPS工作原理
??HTTPS工作在客戶端和服務(wù)器端之間。以上故事中,客戶端可以看作為大師A,服務(wù)器端可以看作為大師B。客戶端和服務(wù)器本身都會(huì)自帶一些加密的算法,用于雙方協(xié)商加密的選擇項(xiàng)。
1、客戶端首先會(huì)將自己支持的加密算法,打個(gè)包告訴服務(wù)器端。
2、服務(wù)器端從客戶端發(fā)來的加密算法中,選出一組加密算法和HASH算法(注,HASH也屬于加密),并將自己的身份信息以證書的形式發(fā)回給客戶端。而證書中包含了網(wǎng)站的地址,加密用的公鑰,以及證書的頒發(fā)機(jī)構(gòu)等;
??這里有提到公鑰的概念是故事中沒有的。我們常見的加密算法一般是一些對(duì)稱的算法,如凱撒加密;對(duì)稱算法即加密用的密鑰和解密用的密鑰是一個(gè)。如故事中的密鑰是4。還有一種加密解密算法稱之為非對(duì)稱算法。這種算法加密用的密鑰(公鑰)和解密用的密鑰(私鑰)是兩個(gè)不同的密鑰;通過公鑰加密的內(nèi)容一定要使用私鑰才能夠解密。
??這里,服務(wù)器就將自己用來加密用的公鑰一同發(fā)還給客戶端,而私鑰則服務(wù)器保存著,用戶解密客戶端加密過后的內(nèi)容。
3、客戶端收到了服務(wù)器發(fā)來的數(shù)據(jù)包后,會(huì)做這么幾件事情:
?1)驗(yàn)證一下證書是否合法。一般來說,證書是用來標(biāo)示一個(gè)站點(diǎn)是否合法的標(biāo)志。如果說該證書由權(quán)威的第三方頒發(fā)和簽名的,則說明證書合法。
?2)如果證書合法,或者客戶端接受和信任了不合法的證書,則客戶端就會(huì)隨機(jī)產(chǎn)生一串序列號(hào),使用服務(wù)器發(fā)來的公鑰進(jìn)行加密。這時(shí)候,一條返回的消息就基本就緒。
?3)最后使用服務(wù)器挑選的HASH算法,將剛才的消息使用剛才的隨機(jī)數(shù)進(jìn)行加密,生成相應(yīng)的消息校驗(yàn)值,與剛才的消息一同發(fā)還給服務(wù)器。
4、服務(wù)器接受到客戶端發(fā)來的消息后,會(huì)做這么幾件事情:
?1)使用私鑰解密上面第2)中公鑰加密的消息,得到客戶端產(chǎn)生的隨機(jī)序列號(hào)。
?2)使用該隨機(jī)序列號(hào),對(duì)該消息進(jìn)行加密,驗(yàn)證的到的校驗(yàn)值是否與客戶端發(fā)來的一致。如果一致則說明消息未被篡改,可以信任。
?3)最后,使用該隨機(jī)序列號(hào),加上之前第2步中選擇的加密算法,加密一段握手消息,發(fā)還給客戶端。同時(shí)HASH值也帶上。
5、客戶端收到服務(wù)器端的消息后,接著做這么幾件事情:
?1)計(jì)算HASH值是否與發(fā)回的消息一致
?2)檢查消息是否為握手消息
6、握手結(jié)束后,客戶端和服務(wù)器端使用握手階段產(chǎn)生的隨機(jī)數(shù)以及挑選出來的算法進(jìn)行對(duì)稱加解密的傳輸。
??為什么不直接全程使用非對(duì)稱加密算法進(jìn)行數(shù)據(jù)傳輸?這個(gè)問題的答案是因?yàn)榉菍?duì)稱算法的效率對(duì)比起對(duì)稱算法來說,要低得多得多;因此往往只用在HTTPS的握手階段。
??以下是我們一些經(jīng)常使用的加密算法,是不是有熟悉的味道?
???非對(duì)稱加密算法:RSA, DSA/DSS
???對(duì)稱加密算法: AES, 3DES
???HASH算法:MD5, SHA1, SHA256
這就是HTTPS的基本原理,如果沒有簡(jiǎn)單粗暴,請(qǐng)告訴我,以幫助我持續(xù)改進(jìn);如果真的簡(jiǎn)單粗暴,請(qǐng)告訴有需要的人,大家共同進(jìn)步。