本篇博文的目錄:
一:Http協議的優點與缺點
二:Https協議的特點
三:Https協議采用的加密技術
四:Https的安全通信機制
五:為什么還有很多網站不使用Https
六:總結
一:Http協議的優點與缺點
1.1:http協議的優點
1.1.:效率高
限制每個連接只有一個請求的無連接狀態,在服務器處理完客戶的請求,並收到客戶的反應,即斷開,通過這種方式可以節省傳輸時間。
1.1.2: 簡單快速
當服務器客戶端請求服務時,只需傳送請求方法和路徑。請求方法常用的GET,HEAD,POST。每種方法規定了客戶端與服務器聯系的是不同的類型。因為簡單的 HTTP 協議,通信速度很快。
1.1.3: 靈活
HTTP 允許任何類型的數據對象的傳輸,輸入被傳輸的內容類型進行標記。
1.1.4:無狀態
HTTP 協議是無狀態的協議,沒有一個國家是沒有協議的事務處理和存儲能力。如果該狀態是指由於缺乏必要前述信息的后續處理中,它必須被重傳,這可能導致在數據傳輸增加了每個連接。另一方面,當不需要在服務器上的快速響應的先驗信息。
1.2:Http協議的缺點
1.2.1:有被竊聽的風險,Http通信使用明文,傳輸過程中沒有任何的保證措施,可能會被竊聽
1.2.2:在傳輸過過程中,不驗證通信方的身份,這中間就有可能被遭遇偽裝
1.2.3:Http只是對報文進行了解析,並沒有對其進行完整的校驗,所以無法驗證報文的完整形,可能被遭篡改
二:Https協議的特點
2.1:Https簡介
Https並不是一個嶄新的協議,而是在http的基礎上發展而來,意為http Secure.相當於是Http的升級版。它主要是為了解決http協議安全性不足的問題而誕生的。在使用https之后,訪問瀏覽器的時候前綴由http變為https,現在我們看到網站都采用https的協議比比皆是,比如:如下都是https的網站:

可見https已經深刻的滲入到我們的經常訪問的網站中了,而關於它,本篇博文就來探討一下http協議如何變為https.
2.2:Http+加密+認證+完整性保護=https
Https的通信端口由SSL和TSL代替了,它是一種應用層協議。一般的情況下http直接和Tcp進行通信,當使用了SSL之后,就會變成先和SSL通信,SSL再和Tcp進行通信,原理圖如下:

當采用了SSL協議之后,Http協議就具備了加密、證書、完整性保護三大功能,SSL是獨立於Http存在的,它是現存的廣泛使用的網絡安全技術。
三:Https協議采用的加密技術
3.1:SSL采用的加密技術
SSL采用的加密技術叫做“共享密鑰加密”,也叫作“對稱密鑰加密”,這種加密方法是這樣的,比如客戶端向服務器發送一條信息,首先客戶端會采用已知的算法對信息進行加密,比如MD5或者Base64加密,接收端對加密的信息進行解密的時候需要用到密鑰,中間會傳遞密鑰,(加密和解密的密鑰是同一個),密鑰在傳輸中間是被加密的。這種方式看起來安全,但是仍有潛在的危險,一旦被竊聽,或者信息被挾持,就有可能破解密鑰,而破解其中的信息。因此“共享密鑰加密”這種方式存在安全隱患:


3.3.2:非對稱密鑰加密
“非對稱加密”使用的時候有兩把鎖,一把叫做“私有密鑰”,一把是“公開密鑰”,使用非對象加密的加密方式的時候,服務器首先告訴客戶端按照自己給定的公開密鑰進行加密處理,客戶端按照公開密鑰加密以后,服務器接受到信息再通過自己的私有密鑰進行解密,這樣做的好處就是解密的鑰匙根本就不會進行傳輸,因此也就避免了被挾持的風險。就算公開密鑰被竊聽者拿到了,它也很難進行解密,因為解密過程是對離散對數求值,這可不是輕而易舉就能做到的事。以下是非對稱加密的原理圖:

四:Https的安全通信機制
4.1:非稱加密方式的缺點
公開密鑰加密固然比共享密鑰加密的方式提升了一個檔次,但是它也存在兩個問題:
第一個是:如何保證接收端向發送端發出公開秘鑰的時候,發送端確保收到的是預先要發送的,而不會被挾持。只要是發送密鑰,就有可能有被挾持的風險。
第二個是:非對稱加密的方式效率比較低,它處理起來更為復雜,通信過程中使用就有一定的效率問題而影響通信速度
4.2:Https采用混合機制的加密方式
https則綜合了公開密鑰加密和共享密鑰加密的兩種方式,充分利用兩者的優勢,在最初的連接的時候使用非對稱密鑰的加密方式保證連接的安全性,之后穩定的通訊采用對稱加密的方式,穩定的通訊是指確保交換的密鑰是安全的。
4.3:https的證書機制
在4.1中我們講了非對稱加密的缺點,其中第一個就是公鑰很可能存在被挾持的情況,無法保證客戶端收到的公開密鑰就是服務器發行的公開密鑰。此時就引出了公開密鑰證書機制。數字證書認證機構是客戶端與服務器都可信賴的第三方機構。證書的具體傳播過程如下:
1:服務器的開發者攜帶公開密鑰,向數字證書認證機構提出公開密鑰的申請,數字證書認證機構在認清申請者的身份,審核通過以后,會對開發者申請的公開密鑰做數字簽名,然后分配這個已簽名的公開密鑰,並將密鑰放在證書里面,綁定在一起

2:服務器將這份數字證書發送給客戶端,因為客戶端也認可證書機構,客戶端可以通過數字證書中的數字簽名來驗證公鑰的真偽,來確保服務器傳過來的公開密鑰是真實的。一般情況下,證書的數字簽名是很難被偽造的,這取決於認證機構的公信力。一旦確認信息無誤之后,客戶端就會通過公鑰對報文進行加密發送,服務器接收到以后用自己的私鑰進行解密。
4.4:關於客戶端證書
客戶端證書是進行客戶端認證的,證明服務器正在通信的客戶端是安全的。但是使用客戶端證書使用存在以下幾個問題:
1:使用客戶端證書,客戶得自己安裝證書,客戶端證書是需要進行付費購買的,且每張證書對應到用戶意味着需要支付用戶數量對等的費用,這叫給用戶帶來了間接的問題。
2:客戶端證書存在另一個問題是,客戶端證書只能證明客戶端的存在,而不能證明用戶本人的真實有效。
五:為什么還有很多網站不使用Https?
Https既然如此安全可靠,為什么還有很多WEB網站不使用Https的協議?這其中的原因有以下幾點:
5.1:加密通信會消耗一定的cpu和服務器資源,如果每次通信都加密,就會消耗更多的資源
5.2:如果所有的信息都采用https加密,這無疑是一種浪費。非敏感信息就算被竊取了,也無傷大雅。可以在其傳輸敏感信息的時候,采用https協議進行加密
5.3:購買證書的開銷也是一筆很大的費用。向認證機構購買證書,證書價格會根據不同的認證機構略有不同,而一般的授權需要折合人民幣600多元。
六:總結
本篇博文由http協議出發,主要介紹了https協議,並對其加密機制進行了簡介,梳理其優缺點及其使用場景。作為一名java開發者,應該對https有所了解,明白其背后的機制,不用深究其細節,此乃本篇博文的初衷。
