做爲一個有追求的程序員,瞭解行業發展趨勢和擴充本身的計算機知識儲備都是頗有必要的,特別是一些計算機基礎方面的內容,就好比本篇文章要講的計算機網絡方面的知識。本文將爲你們詳細梳理一下 HTTPS 的實現原理。html
近年來,隨着用戶和互聯網企業安全意識的提升和 HTTPS 成本的降低,HTTPS 已經愈來愈普及。不少互聯網巨頭也在力推 HTTPS,好比谷歌的 Chrome 瀏覽器在訪問 HTTP 網站時會在地址欄顯示不安全的提醒,微信要求全部的小程序必須使用 HTTPS 傳輸協議,蘋果也要求全部在 App Store 上架的應用必須採用 HTTPS ,國內外的大部分主流網站也都已遷移至 HTTPS,可見 HTTPS 全面取代 HTTP 只是時間問題。前端
說了這麼多,究竟什麼是 HTTPS,它與 HTTP 相比有什麼優缺點?其底層原理又是怎麼實現的呢?下面就爲你一一解答,先來看一下 HTTP 的弊端吧。程序員
HTTP 之因此被 HTTPS 取代,最大的緣由就是不安全,至於爲何不安全,看了下面這張圖就一目瞭然了。算法
圖1. HTTP數據傳輸過程小程序
由圖可見,HTTP 在傳輸數據的過程當中,全部的數據都是明文傳輸,天然沒有安全性可言,特別是一些敏感數據,好比用戶密碼和信用卡信息等,一旦被第三方獲取,後果不堪設想。這裏可能有人會說,我在前端頁面對敏感數據進行加密不就好了,好比 MD5 加鹽加密。這麼想就太簡單了。首先 MD5 並非加密算法,其全稱是 Message Digest Algorithm MD5,意爲信息摘要算法,是一種不可逆的哈希算法,也就是說通過前端 MD5 處理過的數據在服務器端是沒法復原的。這裏以密碼舉例,前端把用戶密碼經過 MD5 進行處理,並把獲得的哈希值發送給服務器,服務器因爲沒法復原密碼,就會直接用這個哈希值處理用戶請求。因此第三方在獲取這個哈希值後,能夠繞過前端登陸頁面直接訪問服務器,形成安全問題。另外,MD5 算法自己的安全性也存在缺陷,這裏就不展開談了。segmentfault
總之 MD5,SHA-1 之類的哈希算法並不能讓 HTTP 變得更安全。要想讓 HTTP 更安全,只能使用真正的加密算法,由於加密算法能夠用密鑰加密並還原數據,只要確保密鑰不被第三方獲取,那就能確保數據傳輸的安全了。而這正是 HTTPS 的解決方案,那下面就來了解一下加密算法吧。瀏覽器
HTTPS 解決數據傳輸安全問題的方案就是使用加密算法,具體來講是混合加密算法,也就是對稱加密和非對稱加密的混合使用,這裏有必要先了解一下這兩種加密算法的區別和優缺點。安全
對稱加密,顧名思義就是加密和解密都是使用同一個密鑰,常見的對稱加密算法有 DES、3DES 和 AES 等,其優缺點以下:服務器
本文不對具體的加密算法作詳細介紹,有興趣的同窗能夠參考 對稱加密算法詳解,若是直接將對稱加密算法用在 HTTP 中,會是下面的效果:微信
圖2. 對稱加密數據傳輸過程
從圖中能夠看出,被加密的數據在傳輸過程當中是無規則的亂碼,即使被第三方截獲,在沒有密鑰的狀況下也沒法解密數據,也就保證了數據的安全。可是有一個致命的問題,那就是既然雙方要使用相同的密鑰,那就必然要在傳輸數據以前先由一方把密鑰傳給另外一方,那麼在此過程當中密鑰就頗有可能被截獲,這樣一來加密的數據也會被輕鬆解密。那如何確保密鑰在傳輸過程當中的安全呢?這就要用到非對稱加密了。
非對稱加密,顧名思義,就是加密和解密須要使用兩個不一樣的密鑰:公鑰(public key)和私鑰(private key)。公鑰與私鑰是一對,若是用公鑰對數據進行加密,只有用對應的私鑰才能解密;若是用私鑰對數據進行加密,那麼只有用對應的公鑰才能解密。非對稱加密算法實現機密信息交換的基本過程是:甲方生成一對密鑰並將其中的一把做爲公鑰對外公開;獲得該公鑰的乙方使用公鑰對機密信息進行加密後再發送給甲方;甲方再用本身保存的私鑰對加密後的信息進行解密。若是對公鑰和私鑰不太理解,能夠想象成一把鑰匙和一個鎖頭,只是全世界只有你一我的有這把鑰匙,你能夠把鎖頭給別人,別人能夠用這個鎖把重要的東西鎖起來,而後發給你,由於只有你一我的有這把鑰匙,因此只有你才能看到被這把鎖鎖起來的東西。經常使用的非對稱加密算法是 RSA 算法,想詳細瞭解的同窗點這裏:詳解一、詳解二,其優缺點以下:
因爲非對稱加密的強安全性,能夠用它完美解決對稱加密的密鑰泄露問題,效果圖以下:
圖3. 客戶端經過非對稱加密把密鑰 KEY 發送給服務器
在上述過程當中,客戶端先是經過非對稱加密把以後用於對稱加密的密鑰 KEY 返送給客戶端,而後雙方再使用 KEY 進行對稱加密交互數據。在非對稱加密的數據傳輸過程當中,即使第三方獲取了公鑰和加密後的 KEY,在沒有私鑰的狀況下也沒法破解 KEY (私鑰存在服務器,泄露風險極小),也就保證了接下來對稱加密的數據安全。而上面這個流程圖正是 HTTPS 的雛形,HTTPS 正好綜合了這兩種加密算法的優勢,不只保證了通訊安全,還保證了數據傳輸效率。
先看一下維基百科對 HTTPS 的定義
Hypertext Transfer Protocol Secure (HTTPS) is an extension of the Hypertext Transfer Protocol (HTTP). It is used for secure communication over a computer network, and is widely used on the Internet. In HTTPS, the communication protocol is encrypted using Transport Layer Security (TLS) or, formerly, its predecessor, Secure Sockets Layer (SSL). The protocol is therefore also often referred to as HTTP over TLS, or HTTP over SSL.
HTTPS (Hypertext Transfer Protocol Secure) 是基於 HTTP 的擴展,用於計算機網絡的安全通訊,已經在互聯網獲得普遍應用。在 HTTPS 中,原有的 HTTP 協議會獲得 TLS (安全傳輸層協議) 或其前輩 SSL (安全套接層) 的加密。所以 HTTPS 也常指 HTTP over TLS 或 HTTP over SSL。
可見HTTPS 並不是獨立的通訊協議,而是對 HTTP 的擴展,保證了通訊安全,兩者關係以下:
圖4. HTTP和HTTPS的關係
也就是說 HTTPS = HTTP + SSL / TLS。
接下來就是最重要的 HTTPS 原理解析了,老規矩先上圖。
圖5. HTTPS 加密、解密、驗證及數據傳輸過程
看上去眼花繚亂,不要怕,且聽我細細道來。HTTPS 的整個通訊過程能夠分爲兩大階段:證書驗證和數據傳輸階段,數據傳輸階段又能夠分爲非對稱加密和對稱加密兩個階段。具體流程按圖中的序號講解。
客戶端請求 HTTPS 網址,而後鏈接到 server 的 443 端口 (HTTPS 默認端口,相似於 HTTP 的80端口)。
採用 HTTPS 協議的服務器必需要有一套數字 CA (Certification Authority)證書,證書是須要申請的,並由專門的數字證書認證機構(CA)經過很是嚴格的審覈以後頒發的電子證書 ( (固然了是要錢的,安全級別越高價格越貴))。頒發證書的同時會產生一個私鑰和公鑰。私鑰由服務端本身保存,不可泄漏。公鑰則是附帶在證書的信息中,能夠公開的。證書自己也附帶一個證書電子簽名,這個簽名用來驗證證書的完整性和真實性,能夠防止證書被篡改。
服務器響應客戶端請求,將證書傳遞給客戶端,證書包含公鑰和大量其餘信息,好比證書頒發機構信息,公司信息和證書有效期等。Chrome 瀏覽器點擊地址欄的鎖標誌再點擊證書就能夠看到證書詳細信息。
圖6. B站 CA 證書
圖7. 瀏覽器安全警告
若是證書沒有問題,客戶端就會從服務器證書中取出服務器的公鑰A。而後客戶端還會生成一個隨機碼 KEY,並使用公鑰A將其加密。
客戶端把加密後的隨機碼 KEY 發送給服務器,做爲後面對稱加密的密鑰。
服務器在收到隨機碼 KEY 以後會使用私鑰B將其解密。通過以上這些步驟,客戶端和服務器終於創建了安全鏈接,完美解決了對稱加密的密鑰泄露問題,接下來就能夠用對稱加密愉快地進行通訊了。
服務器使用密鑰 (隨機碼 KEY)對數據進行對稱加密併發送給客戶端,客戶端使用相同的密鑰 (隨機碼 KEY)解密數據。
雙方使用對稱加密愉快地傳輸全部數據。
好了,以上就是 HTTPS 的原理詳解了,如此精美的圖搭配這麼詳細的過程解析,你再搞不懂就說不過去了吧哈哈。
再來總結一下 HTTPS 和 HTTP 的區別以及 HTTPS 的缺點吧:
HTTPS 和 HTTP 的區別:
HTTPS 的缺點:
好了,以上就是本篇文章的所有內容了,若有錯誤,歡迎指正。最後貼幾篇參考文章