當前位置:
首頁 > 知識 > 九個問題從入門到熟悉HTTPS

九個問題從入門到熟悉HTTPS

九個問題從入門到熟悉HTTPS



來自:簡書

鏈接:www.jianshu.com/p/072a657337ae(點擊尾部閱讀原文前往)


程序猿自媒體已獲轉載授權


Q1: 什麼是 HTTPS?BS: HTTPS 是安全的 HTTP


HTTP 協議中的內容都是明文傳輸,HTTPS 的目的是將這些內容加密,確保信息傳輸安全。最後一個字母 S 指的是 SSL/TLS 協議,它位於 HTTP 協議與 TCP/IP 協議中間。

Q2: 你說的信息傳輸安全是什麼意思BS: 信息傳輸的安全有三個方面:


1、客戶端和伺服器直接的通信只


2、有自己能看懂,即使第三方拿到數據也看不懂這些信息的真實含義。


3、第三方雖然看不懂數據,但可以 XJB 改,因此客戶端和伺服器必須有能力判斷數據是否被修改過。


4、客戶端必須避免中間人攻擊,即除了真正的伺服器,任何第三方都無法冒充伺服器。

很遺憾的是,目前的 HTTP 協議還不滿足上述三條要求中的任何一條。


Q3: 這麼多要求,一個一個去滿足是不是很累?BS: 不累,第三個要求可以不用管


是的,我沒開玩笑,你可以暫時別管第三個要求,因為它實際上隸屬於第一個需求。我們都知道加密需要密碼,密碼不是天下掉下來,也得需要雙方經過通信才能協商出來。所以一個設計良好的加密機制必然會防止第三者的干擾和偽造。等搞明白了加密的具體原理,我們自然可以檢驗是否滿足:「任何第三者無法冒充伺服器」這一要求。


Q4: 那怎麼加密信息呢BS: 使用對稱加密技術


對稱加密可以理解為對原始數據的可逆變換。比如 Hello 可以變換成 Ifmmp,規則就是每個字母變成它在字母表上的後一個字母,這裡的秘鑰就是 1,另一方拿到 Ifmmp 就可以還原成原來的信息 Hello 了。

引入對稱加密後,HTTPS 的握手流程就會多了兩步,用來傳遞對稱加密的秘鑰:


1、客戶端: 你好,我需要發起一個 HTTPS 請求


1、伺服器: 好的,你的秘鑰是 1。


提到了對稱加密,那麼自然還有非對稱加密。它的思想很簡單,計算兩個質數的乘積很容易,但反過來分解成兩個質數的乘積就很難,要經過極為複雜的運算。非對稱加密有兩個秘鑰,一個是公鑰,一個是私鑰。公鑰加密的內容只有私鑰可以解密,私鑰加密的內容只有公鑰可以解密。一般我們把伺服器自己留著,不對外公布的密鑰稱為私鑰,所有人都可以獲取的稱為公鑰。

使用對稱加密一般要比非對稱加密快得多,對伺服器的運算壓力也小得多。


Q5: 對稱秘鑰如何傳輸


伺服器直接返回明文的對稱加密密鑰是不是不安全。如果有監聽者拿到這個密鑰,不就知道客戶端和伺服器後續的通信內容了么?


BS: 利用非對稱加密


是這樣,所以不能明文傳遞對稱秘鑰,而且也不能用一個新的對稱加密演算法來加密原來的對稱秘鑰,否則新的對稱秘鑰同樣無法傳輸,這就是雞生蛋、蛋生雞的悖論。


這裡我們引入非對稱加密的方式,非對稱加密的特性決定了伺服器用私鑰加密的內容並不是真正的加密,因為公鑰所有人都有,所以伺服器的密文能被所有人解析。但私鑰只掌握在伺服器手上,這就帶來了兩個巨大的優勢:


1、伺服器下發的內容不可能被偽造,因為別人都沒有私鑰,所以無法加密。強行加密的後果是客戶端用公鑰無法解開。


2、任何人用公鑰加密的內容都是絕對安全的,因為私鑰只有伺服器有,也就是只有真正的伺服器可以看到被加密的原文。


所以傳輸對稱秘鑰的問題就迎刃而解了: 秘鑰不是由伺服器下發,而是由客戶端生成並且主動告訴伺服器。


所以當引入非對稱加密後,HTTPS 的握手流程依然是兩步,不過細節略有變化:


客戶端: 你好,我需要發起一個 HTTPS 請求,這是我的 (用公鑰加密後的) 秘鑰。


伺服器: 好的,我知道你的秘鑰了,後續就用它傳輸。


Q5: 那公鑰怎麼傳輸


你好像還是沒有解決雞生蛋,蛋生雞的問題。你說客戶端發送請求時要用公鑰加密對稱秘鑰,那公鑰怎麼傳輸呢?


BS: 對公鑰加密就行了。。。


每一個使用 HTTPS 的伺服器都必須去專門的證書機構註冊一個證書,證書中存儲了用權威機構私鑰加密的公鑰。這樣客戶端用權威機構的公鑰解密就可以了。


現在 HTTPS 協議的握手階段變成了四步:


1、客戶端: 你好,我要發起一個 HTTPS 請求,請給我公鑰


2、伺服器: 好的,這是我的證書,裡面有加密後的公鑰


3、客戶端: 解密成功以後告訴伺服器: 這是我的 (用公鑰加密後的) 對稱秘鑰。


4、伺服器: 好的,我知道你的秘鑰了,後續就用它傳輸。


Q6: 你在逗我么。。。。


那權威機構的公鑰又怎麼傳輸?


BS: 存在電腦里


這個公鑰不用傳輸,會直接內置在各大操作系統(或者瀏覽器)的出廠設置里。之所以不把每個伺服器的公鑰內置在電腦里,一方面是因為伺服器太多,存不過來。另一方面操作系統也不信任你,憑什麼你說你這個就是百度/淘寶的證書呢?


Q7: 怎麼知道證書有沒有被篡改?


你說伺服器第一次會返回證書,也就是加密以後的公鑰,那我怎麼知道這個證書是可靠的?


BS: 將信息 hash 值隨著信息一起傳遞


我們都知道哈希演算法的特點,它可以壓縮數據,如果從函數角度來看,不管多複雜的數據(定義域可以非常大)經過哈希演算法都會得到一個值,而且這個值處在某個特定(遠小於定義域的範圍)值域內。相同數據的哈希結果一定相同,不相同數據的哈希結果一般不同,不過也有小概率會重複,這叫哈希衝突。


為了確保原始證書沒有被篡改,我們可以在傳遞證書的同時傳遞證書的哈希值。由於第三者無法解析數據,只能 XJB 改,那麼修改後的數據在解密後,就不可能通過哈希。


比如說公鑰就是之前的例子 Hello,我們假設哈希演算法是獲取字元串的最後一個字元,那麼 Hello 的哈希值就是 o,所以加密字元串是 Ifmmpp。雖然公鑰已知,每個人都可以解密,解密完也可以篡改,但是因為沒有私鑰, 所以無法正確的加密。所以它再返回給客戶端的數據是無效數據,用公鑰解析後會得到亂碼。即使攻擊者通過多次嘗試碰巧能夠解析,也無法通過哈希校驗。


Q8: 這樣可以防止第三方冒充伺服器么BS: 也許可以


首先真正的伺服器下發的內容,無法被別人篡改。他們有權威機構的公鑰,所以可以解密,但是因為沒有私鑰,所以解密以後的信息無法加密。沒有加密或者錯誤加密的信息被客戶端用公鑰解密以後,必然無法通過哈希校驗。


但是,如果你一開始請求的就不是真的伺服器,而是一個攻擊者,此時的他完全有機會進行中間人攻擊。我們知道第一次握手的時候伺服器會下發用於證明自己身份的證書,這個證書會用預設在設備上的公鑰來解密。所以要麼是經過認證的證書用權威機構的私鑰加密,再用權威機構解密,要麼是用非權威機構的私鑰加密,然後找不到公鑰解密。


所以如果不小心安裝過非權威機構的根證書,比如黑客提供的惡意證書,這時候設備上就多了一個預設的公鑰,那麼用惡意私鑰加密的證書就能被正常解析出來。所以千萬不要隨便裝根證書,這等於是為那些惡意證書留了一扇門。


當然,凡是都有兩面性。我們知道 Charles 可以調試 HTTPS 通信,它的原理就是需要用戶安裝 Charles 的根證書,然後我們的請求會被代理到 Charles 伺服器,它下發的 Charles 證書才能被正確解析。另一方面,Charles 會作為客戶端,從真正的伺服器哪裡拿到正確的 https 證書並用於後續通信。幸好 Charles 不是流氓軟體,或者它的私鑰一旦泄露,對用戶都會造成很大的影響。


我可以舉一個例子,證書有多個種類,最貴的叫 EV (Extended Validation),它需要公司營業執照等多個文件才能申請人工審核,好處也很明顯,可以在瀏覽器地址欄左側準確顯示公司名稱,比如 Bitbucket 的官網:


代理模式下無法顯示


Q9: HTTPS 握手會影響性能么


TCP 有三次握手,再加上 HTTPS 的四次握手,會不會影響性能?


BS: 影響肯定有,但是可以接受


首先,HTTPS 肯定會更慢一點,時間主要花費在兩組 SSL 之間的耗時和證書的讀取驗證上,對稱演算法的加解密時間幾乎可以忽略不計。


而且如果不是首次握手,後續的請求並不需要完整的握手過程。客戶端可以把上次的加密情況直接發送給伺服器從而快速恢復,具體細節可以參考圖解SSL/TLS協議。


除此以外,SSL 握手的時間並不是只能用來傳遞加密信息,還可以承擔起客戶端和伺服器溝通 HTTP2 兼容情況的任務。因此從 HTTPS 切換到 HTTP2.0 不會有任何性能上的開銷,反倒是得益於 HTTP2.0 的多路復用等技術,後續可以節約大量時間。


如果把 HTTPS2.0 當做目標,那麼 HTTPS 的性能損耗就更小了,遠遠比不上它帶來的安全性提升。


結語


相信以上九個問題足夠幫助新人了解 HTTPS 了,但這只是基本概念,關於 HTTPS 的使用(比如 iOS 上的一些具體問題)還需要不斷嘗試和研究。


本文編號2283,以後想閱讀這篇文章直接輸入2283即可。


輸入m可以獲取到文章目錄


本文內容的相關公眾號推薦


黑客技術與網路安全


前端開發


更多推薦15個技術類公眾微信


涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序猿 的精彩文章:

拯救程序員的自尊心 我建議他去伯克利
技術的熱門度曲線
2016年總結-Java程序員
程序猿的電腦是怎麼樣個配置?
6個可以讓代碼變得更整潔的Android庫

TAG:程序猿 |

您可能感興趣

《最遊記RELOAD BLAST》新PV 還是熟悉的感覺
熟悉面孔齊聚《AV男優忘年會》HIGH到一半還要4P真累人……
熟悉的迷彩、猿人、鯊魚都有!A BATHING APE2017秋冬系列開啟
德國BRAX全新GRAPHIC系列喇叭 熟悉的Hi-End味
YEEZY CALABASAS 系列開售,仍舊是熟悉的秒速售罄...
Apple TV 4K開箱 熟悉的「味道」亮點不足
ARMS新角色DNAMan 怎麼有種熟悉的感覺?
GD是想TOP了嗎?熟悉的INS,倍感心酸……
寶馬推出了 MINI NEXT 100 概念車,還是熟悉的感覺
還是熟悉的賣肉!《NEW GAME!》OVA圖透曝光
在VR區,被業界熟悉的VR頭顯只有一個:深圳3Glasses
熟悉的 Apple TV 4K,何時才能來到國內?
LOL-LPL:熟悉的EDG終於回來了!2-0輕鬆擊敗IG!
LOL:KT迎來LCK夏季首秀!都是我們熟悉的老面孔!
EDG惜敗SKT無緣八強 網友:熟悉的劇本再次上演
熟悉又曖昧 | DISSONA推出全新2017秋季系列包包
OPPO全面屏F5曝光 外觀有熟悉的味道
還是熟悉的配方 GRANRODEO將唱《黑籃》劇場版主題曲
2017款ThinkPad小黑體驗:還是熟悉的味道