談到https
, 就不得不談到與之相對的http
。http
的特性是明文傳輸,因此在傳輸的每乙個環節,資料都有可能被第三方竊取或者篡改,具體來說,http 資料經過 tcp 層,然後經過wifi路由器
、運營商
和目標伺服器
,這些環節中都可能被中間人拿到資料並進行篡改,也就是我們常說的中間人攻擊。
為了防範這樣一類攻擊,我們不得已要引入新的加密方案,即 https。
https
並不是乙個新的協議, 而是乙個加強版的http
。其原理是在http
和tcp
之間建立了乙個中間層,當http
和tcp
通訊時並不是像以前那樣直接通訊,直接經過了乙個中間層進行加密,將加密後的資料報傳給tcp
, 相應的,tcp
必須將資料報解密,才能傳給上面的http
。這個中間層也叫安全層
。安全層
的核心就是對資料加解密
。
接下來我們就來剖析一下https
的加解密是如何實現的。
首先需要理解對稱加密
和非對稱加密
的概念,然後討論兩者應用後的效果如何。
對稱加密
是最簡單的方式,指的是加密
和解密
用的是同樣的金鑰。
而對於非對稱加密
,如果有 a、 b 兩把金鑰,如果用 a 加密過的資料報只能用 b 解密,反之,如果用 b 加密過的資料報只能用 a 解密。
接著我們來談談瀏覽器
和伺服器
進行協商加解密的過程。
首先,瀏覽器會給伺服器傳送乙個隨機數client_random
和乙個加密的方法列表。
伺服器接收後給瀏覽器返回另乙個隨機數server_random
和加密方法。
現在,兩者擁有三樣相同的憑證:client_random
、server_random
和加密方法。
接著用這個加密方法將兩個隨機數混合起來生成金鑰,這個金鑰就是瀏覽器和服務端通訊的暗號
。
如果用對稱加密
的方式,那麼第三方可以在中間獲取到client_random
、server_random
和加密方法,由於這個加密方法同時可以解密,所以中間人可以成功對暗號進行解密,拿到資料,很容易就將這種加密方式破解了。
既然對稱加密
這麼不堪一擊,我們就來試一試非對稱
加密。在這種加密方式中,伺服器手裡有兩把鑰匙,一把是公鑰
,也就是說每個人都能拿到,是公開的,另一把是私鑰
,這把私鑰只有伺服器自己知道。
好,現在開始傳輸。
瀏覽器把client_random
和加密方法列表傳過來,伺服器接收到,把server_random
、加密方法
和公鑰
傳給瀏覽器。
現在兩者擁有相同的client_random
、server_random
和加密方法。然後瀏覽器用公鑰將client_random
和server_random
加密,生成與伺服器通訊的暗號
。
這時候由於是非對稱加密,公鑰加密過的資料只能用私鑰
解密,因此中間人就算拿到瀏覽器傳來的資料,由於他沒有私鑰,照樣無法解密,保證了資料的安全性。
這難道一定就安全嗎?聰明的小夥伴早就發現了端倪。回到非對稱加密
的定義,公鑰加密的資料可以用私鑰解密,那私鑰加密的資料也可以用公鑰解密呀!
伺服器的資料只能用私鑰進行加密(因為如果它用公鑰那麼瀏覽器也沒法解密啦),中間人一旦拿到公鑰,那麼就可以對服務端傳來的資料進行解密了,就這樣又被破解了。而且,只是採用非對稱加密,對於伺服器效能的消耗也是相當巨大的,因此我們暫且不採用這種方案。
可以發現,對稱加密和非對稱加密,單獨應用任何乙個,都會存在安全隱患。那我們能不能把兩者結合,進一步保證安全呢?
其實是可以的,演示一下整個流程:
瀏覽器向伺服器傳送client_random
和加密方法列表。
伺服器接收到,返回server_random
、加密方法以及公鑰。
瀏覽器接收,接著生成另乙個隨機數pre_random
, 並且用公鑰加密,傳給伺服器。(敲黑板!重點操作!)
伺服器用私鑰解密這個被加密後的pre_random
。
現在瀏覽器和伺服器有三樣相同的憑證:client_random
、server_random
和pre_random
。然後兩者用相同的加密方法混合這三個隨機數,生成最終的金鑰
。
然後瀏覽器和伺服器儘管用一樣的金鑰進行通訊,即使用對稱加密
。
這個最終的金鑰是很難被中間人拿到的,為什麼呢? 因為中間人沒有私鑰,從而拿不到pre_random,也就無法生成最終的金鑰了。
回頭比較一下和單純的使用非對稱加密, 這種方式做了什麼改進呢?本質上是防止了私鑰加密的資料外傳。單獨使用非對稱加密,最大的漏洞在於伺服器傳資料給瀏覽器只能用私鑰
加密,這是危險產生的根源。利用對稱和非對稱
加密結合的方式,就防止了這一點,從而保證了安全。
儘管通過兩者加密方式的結合,能夠很好地實現加密傳輸,但實際上還是存在一些問題。黑客如果採用 dns 劫持,將目標位址替換成黑客伺服器的位址,然後黑客自己造乙份公鑰和私鑰,照樣能進行資料傳輸。而對於瀏覽器使用者而言,他是不知道自己正在訪問乙個危險的伺服器的。
事實上https
在上述結合對稱和非對稱加密
的基礎上,又新增了數字證書認證
的步驟。其目的就是讓伺服器證明自己的身份。
為了獲取這個證書,伺服器運營者需要向第三方認證機構獲取授權,這個第三方機構也叫ca
(certificate authority
), 認證通過後 ca 會給伺服器頒發數字證書。
這個數字證書有兩個作用:
伺服器向瀏覽器證明自己的身份。
把公鑰傳給瀏覽器。
這個驗證的過程發生在什麼時候呢?
當伺服器傳送server_random
、加密方法的時候,順便會帶上數字證書
(包含了公鑰
), 接著瀏覽器接收之後就會開始驗證數字證書。如果驗證通過,那麼後面的過程照常進行,否則拒絕執行。
現在我們來梳理一下https
最終的加解密過程:
瀏覽器拿到數字證書後,如何來對證書進行認證呢?
首先,會讀取證書中的明文內容。ca 進行數字證書的簽名時會儲存乙個 hash 函式,來這個函式來計算明文內容得到資訊a
,然後用公鑰解密明文內容得到資訊b
,兩份資訊做比對,一致則表示認證合法。
當然有時候對於瀏覽器而言,它不知道哪些 ca 是值得信任的,因此會繼續查詢 ca 的上級 ca,以同樣的資訊比對方式驗證上級 ca 的合法性。一般根級的 ca 會內建在作業系統當中,當然如果向上找沒有找到根級的 ca,那麼將被視為不合法。
中間人攻擊過程如下:
1. 伺服器向客戶端傳送公鑰。
2. 攻擊者截獲公鑰,保留在自己手上。
3. 然後攻擊者自己生成乙個【偽造的】公鑰,發給客戶端。
4. 客戶端收到偽造的公鑰後,生成加密hash值發給伺服器。
5. 攻擊者獲得加密hash值,用自己的私鑰解密獲得真秘鑰。
6. 同時生成假的加密hash值,發給伺服器。
7. 伺服器用私鑰解密獲得假秘鑰。
8. 伺服器用假秘鑰加密傳輸資訊
防範方法:
服務端在傳送瀏覽器的公鑰中加入ca證書,瀏覽器可以驗證ca證書的有效性。
ssl是一種標準協議,用於加密瀏覽器和伺服器之間的通訊。它允許通過internet安全輕鬆地傳輸賬號密碼、銀行卡、手機號等私密資訊。
ssl證書就是遵守ssl協議,由受信任的ca機構頒發的數字證書。
https=http+ssl。如果想要建立https連線,則首先必須從受信任的證書頒發機構(ca)gworg機構註冊 ssl證書。安裝ssl證書後,**位址列http後面就會多乙個「s」,還有綠色安全鎖標誌。
六、總結
https並不是乙個新的協議, 它在http
和tcp
的傳輸中建立了乙個安全層,利用對稱加密
和非對稱加密
結合數字證書認證的方式,讓傳輸過程的安全性大大提高。
HTTPS資料傳輸流程
1.客戶端向伺服器端發起https請求,連線到伺服器端的443埠上 2.伺服器端有乙個秘鑰對,即公鑰和私鑰,是用來進行非對稱加密使用的,伺服器端儲存著私鑰,將公鑰傳送給客戶端 3.客戶端收到伺服器端的公鑰之後,對公鑰進行檢查,驗證其合法性,如果發現公鑰有問題,那麼https傳輸無法繼續 如果合格,那...
網路 HTTPS 怎麼保證資料傳輸的安全性
大家都知道,在客戶端與伺服器資料傳輸的過程中,http協議的傳輸是不安全的,也就是一般情況下http是明文傳輸的。但https協議的資料傳輸是安全的,也就是說https資料的傳輸是經過加密的。在客戶端與伺服器這兩個完全沒有見過面的陌生人交流中,https是如何保證資料傳輸的安全性的呢?下面我們來一步...
資料傳輸安全性保證
資料傳輸過程中,安全性十分重要,尤其是對於一些敏感的使用者資訊,其安全性保證更應當被重視。現代軟體開發中,無論是基於敏捷式的軟體開發,或者基於前後端分離的軟體開發,都離不開提供對外介面,而請求這些介面資料的安全性應當得到保證。保證傳輸資料的安全性,主要有以下方法 資料加密 資料加密一直是保密資料的重...