事物皆有兩面性,HTTP也有不足,比如:
- 通訊使用明文,內容可能被竊聽
- 不驗證通訊方的身份,可能被偽裝
- 無法證明報文的完整性,可能被篡改
為了有效防止這些弊端,HTTPS就應運而生了。
HTTPS
開門見山吧,HTTPS = HTTP + 加密 + 認證 + 完整性保護
HTTPS到底是如何實現的,這是我們要重點關注的。
首先,HTTPS不是應用層的新協議。只是HTTP通訊介面部分用SSL和TLS協議代替而已。
通常,HTTP直接和TCP通訊,當使用SSL時,則演變成先和SSL通訊,再由SSL和TCP通訊了。簡言之,所謂HTTPS,就是身披SSL協議這層外殼的HTTP。
這裡不得不提一下SSL協議,他是獨立於HTTP的協議,所以其他執行在應用層的協議都可以跟SSL配合使用。SSL是當今世界上應用最廣泛的網路安全技術。
在採用SSL後,HTTP就擁有了HTTPS加密、證書、完整性保護這些功能。
談談加密
共享金鑰加密
近代加密方法中加密演算法是公開的,而金鑰是保密的,加密和解密都會用到金鑰,沒有金鑰就無法對密碼解密。
加密和解密同用一個金鑰的方式稱為共享金鑰加密(Common Key crypto system),也叫做對稱金鑰加密。
如果發生金鑰就有被竊聽的風險,但不傳送,對方就不能解密,再說,金鑰若能夠安全傳送,那資料也應該能安全送達——這是矛盾的地方。
因為上述的矛盾,共享金鑰加密是不安全的。
公開金鑰加密技術
SSL採用一種叫做公開金鑰加密的加密處理方式。
公開金鑰加密使用一對非對稱的金鑰。一把叫做私有金鑰,一把叫做公開金鑰。私有金鑰保密,公開金鑰可以隨意釋出,任何人都可以獲得。傳送密文的一方使用對方的公開金鑰進行加密處理。對方收到被加密的資訊後,在使用自己的私有金鑰進行解密。無需傳送私有金鑰,也就斷絕了被盜走的可能。
從上圖可以看到,私有金鑰一直存在傳送密文一方的伺服器上,沒有傳送到網路中,所以就不會被竊聽。
但這樣做也是有侷限的,因為公開金鑰加密與私有金鑰加密相比,其處理速度要慢。
HTTPS採用混合加密機制
HTTPS採用共享金鑰和公開金鑰加密兩者並用的混合加密機制。
在交換金鑰環節使用公開金鑰加密方式,之後的建立通訊交換報文階段則使用共享金鑰加密方式。
公開金鑰加密處理起來比共享金鑰加密方式更為複雜,因此若在通訊時使用公開金鑰加密方式,效率就很低。
證明公開金鑰正確性的證書
HTTPS的加密機制看似很完美,但還是存在一個致命的缺陷,那就是公開金鑰是放在網上的,使用者證明公開金鑰就是貨真價實的公開金鑰。
比如,正準備和某臺伺服器建立公開金鑰加密方式的通訊時,如何證明收到的公開金鑰就是原本預想的那臺伺服器發行的公開金鑰。或許在公開金鑰交換途中,真正的公開金鑰已經被攻擊者替換掉了。
數字證書認證機構
這就要藉助第三方機構了,而且這個機構,必須是大家都信任的,這就輪到數字證書認證機構上場。
伺服器的運營人員向數字證書認證機構提出公開金鑰的申請,數字證書認證機構在判明提出申請者的身份後,會對已申請的公開金鑰做數字簽名,然後分配這個已簽名的公開金鑰,並將該公開金鑰放入公鑰證書後繫結在一起。
接到證書的客戶端可使用數字證書認證機構的公開金鑰,對那張證書上的數字簽名進行驗證,一旦驗證通過,客戶端可以明確兩件事:
一、認證伺服器的公開金鑰是真實有效的數字證書認證機構的。
二、伺服器的公開金鑰是值的信賴的。
這樣以來,你就可以放心使用HTTPS了。