眾所周知,Https能夠加密信息,防止在數據傳輸過程中被惡意攔截和修改。所以那些安全級別高的服務都會使用Https協議。
Https簡介
在介紹Https之前先簡單的說一下Http,HTTP協議是我們使用比較多的協議,比如我們平時瀏覽網頁時候使用的一種協議。HTTP協議傳輸的數據都是未經過加密的,也就是明文的,因此使用HTTP協議傳輸隱私信息非常不安全。為了保證這些隱私數據能加密傳輸不被攔截和修改,于是網景公司設計了SSL(Secure Sockets Layer 安全套接字層)/TLS(Transport Layer Security,傳輸層安全協議)協議用于對HTTP協議傳輸的數據進行加密,這樣Https就出現了,也就是說Https就是Http+SSL / TLS,也就是在Http的外層又加了一層處理加密信息的模塊。不管是客戶端還是服務端傳輸的數據都是經過TLS進行加密后的數據。簡而言之,HTTPS是通過一次非對稱加密算法(如RSA算法)進行了協商密鑰的生成與交換,然后在后續通信過程中就使用協商密鑰進行對稱加密通信。下面通過下圖來詳細看一下Https的加密傳輸原理。
1.客戶端發起Https請求
這個就沒有什么可說的啦,就是在瀏覽器輸入url之后點擊回車發送請求就可以啦。此時客戶端發起的是明文的請求,客戶端將自己支持的一套加密規則和一個隨機數(Random_C)發送給服務器,以便能夠實現數據的加密和解密。
2.服務器響應
服務端在接收到客戶端的請求后,根據自己的加密規則從請求中選出一組加密算法和HASH算法,生成隨機數,并將自己的身份信息以證書(CA)的形式返回給瀏覽器。大家可能對這個CA證書存在疑惑,什么是CA證書呢?這套證書其實就是一對公鑰和私鑰。如果對公鑰和私鑰還是不太理解,可以把它想象成一把鑰匙和一個鎖頭,區別就是全世界只有你一個人有這把鑰匙,你可以把鎖頭給別人,別人用這個鎖頭鎖住東西,然后發給你,由于只有你一個人有這把鑰匙,所以也就只有你才能看見用這個鎖鎖住的東西。在這里再說一下這個證書怎么獲得的?有兩種方式獲得這個證書,一種是自己制作,另一種是去相關的機構去申請。區別就是第一種需要客戶端認證,第二種則不會彈出認證提示頁面。CA證書里面包含了服務器地址,加密公鑰,以及證書的頒發機構等信息。這時服務器給客戶端的包括選擇使用的加密規則、CA證書、一個隨機數(Random_S)。
3.解析證書
當客戶端接收到服務器給的這些信息的時候,進行解析證書,這部分工作就由客戶端的SSL/TLS來完成的,SSL/TLS介于應用層和TCP層之間。應用層和傳輸層進行交互的話需要先把數據傳輸到SSL/TLS層,SSL/TLS層對應用層的數據進行加密,并增加自己的SSL頭再傳到應用層(如下圖)。解析證書大概分為以下幾個步驟:
a.驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。
b.生成密碼,如果證書不存在問題,那么先生成一串隨機數密碼(Pre_master),之后用CA證書里的公鑰進行加密。
c.根據隨機數來計算協商秘鑰,就是用鎖頭(公鑰)將Random_C Random_S和Pre_master鎖在一起,只有有鑰匙(私鑰)才能看見被鎖住的內容。
d.生成用于握手的信息,使用約定好的HASH計算握手消息,并使用協商密鑰及約定好的算法對消息進行加密。
4.向服務器發送加密信息
在這里客戶端將其產生的加密后的隨機數密碼和握手信息發送給服務器端,并通知服務器以后進行通信就要使用咱們約定好的算法和協商秘鑰。
5.服務器進行解密
現在用鎖頭鎖住的信息收到了,現在就要使用鑰匙打開鎖住的信息進行閱讀,具體的做法如下:
a.將公鑰加密的隨機數密碼進行解密成Pre_master。
b.計算協商秘鑰,也是根據Random_C Random_S和Pre_master來計算的。
c.解密握手信息,使用協商密鑰解密客戶端發來的握手消息,并驗證HASH是否與客戶端發來的一致。
d.再次生成握手信息,使用協商秘鑰以及已經約定的加密方式來生成握手信息,準備發送給客戶端。
6.將握手信息發送給客戶端
服務器端將生成的握手信息發送給客戶端,并通知客戶端這個加密信息是根據約定好的算法和協商秘鑰進行加密的。
7.客戶端解密信息
客戶端進行計算握手信息中的HASH值,并和服務端發來的HASH值進行比對,如果一致的話就代表握手過程結束,以后服務端和客戶端之間就可以根據約定好的算法和協商秘鑰進行數據加密來通信。
有的人就會問,客戶端和服務端在握手期間為什么要那么麻煩的加密解密進行傳輸啊?那是因為這樣做既保證了雙方都獲得了一致的密碼,并能夠正常的加密解密數據,為后續真正數據的傳輸做一次測試。
附:Https一般使用的加密和HASH算法如下:
非對稱加密算法:RSA,DSA/DSS
對稱加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
希望通過這篇文章大家可以對Https有一定的了解。