1 HTTP協議
1.1 HTTP協議的簡單介紹
在正式將HTTPS之前,我們要簡單介紹一下HTTP協議,什麼是HTTP協議呢?我們知道,當我們要上網前,必須要先去運營商那裏開通一下寬帶,我們才能愉快地在網上進行衝浪。而運營商收了我們的錢之後,就會給我們拉一條線,這根線就是寬帶(寬帶只是一個泛稱,我們平時接觸的叫雙絞線,是寬帶的一種,另外還有很多種類的寬帶,比如無線寬帶
等,這裏就不再過多介紹),有了寬帶,就可以把兩臺,甚至是多臺計算機連了起來,這樣就有每臺計算機就在物理層面有了連接,也就是有了可以通信的基礎條件(對應着計算機網絡的物理層
)。當然,只是簡單的把計算機用寬帶連了起來,還遠遠不能讓但是之間進行通信,還需要做一些其他的事情才行。這中間的過程有點複雜,想要詳細瞭解這一個過程的同學可以去學一下《計算機網絡》這門課,我這裏就簡單的說一下兩臺電腦之間通信的流程,這裏以我們常用的QQ聊天爲例,涉及的角色用A和B代替,當A要給B發一個消息時,大概流程是這樣的:
- A在他的QQ軟件上寫一條信息,然後點擊一下發送按鈕,把消息發送出去;
- A的計算機上的QQ軟件將這條信息裏面的內容交給A計算機的操作系統;
- A的計算機上的操作系統找到計算機上面的一個硬件:網卡,然後把這條信息交給網卡;
- 網卡再把這條信息交給寬帶;
- 這條信息通過寬帶把這條信息的內容傳給B的計算機的網卡;
- 然後B的計算機的網卡再把這條信息交給B的計算機的操作系統;
- B的計算機的操作系統接受到這條信息之後,把這條信息交給B的QQ軟件。
至此,整個完整的通信流程就結束了,當然這裏是很簡單的描述了一下他的流程,通過上面的描述,我們可以知道,這裏面有很多不同層面的東西要在一起協同工作,而要把這些東西完美的結合在一起,讓他們協同工作,就需要制定很多的規範,這些規範也叫做協議。而HTTP就是期中一種協議,這種協議工作在應用層
,也就是上面所說的QQ,現實中常見的實現了HTTP協議的應用還有瀏覽器
、微博
等等。需要指出的是,不是每個應用都實現了HTTP協議,只有需要上網功能的才需要實現HTTP協議,比如記事本
就不需要實現HTTP協議。
HTTP協議我們介紹完了,接下來我們就簡單說一下它的缺點,HTTP誕生的時候,需要上網的人還不多,而且那個時候上網的人心思也比較單純,並且在網上傳輸的信息也不是很很重要,所以它存在着一些風險,下面的圖就是HTTPS和HTTP的簡單對比。
1.2 HTTP協議的存在風險
這裏用幾個小例子簡單解釋一下信息劫持、信息篡改和信息竊聽。
1.2.1 信息劫持
正常情況下,瀏覽器應該是直接去訪問正規服務器的,但是如果瀏覽器在訪問正規服務器的過程中被黑客做了手腳,讓瀏覽器就會去訪問黑客的服務器,這個過程就叫做劫持,劫持的類型有很多種,下面的圖中只畫出了最常見的一種。
舉一個簡單的例子幫助大家理解,當我們去車站去買票時,在半路的時候遇見了黃牛,然後被黃牛騙去了假售票處買了一張假票,黃牛把我們騙去假售票處的行爲就是劫持。
1.2.2 信息篡改
正常情況下,瀏覽器進行給服務器發送一個給張三轉賬10萬塊
的請求,服務器接收到這個請求之後,給張三轉10萬塊錢。但是這個請求被黑客攔截到了,並對請求的信息進行了修改,於是請求信息變成了給李四轉賬10萬塊
,瀏覽器接收到這個請求之後,就給李四轉了10萬塊錢,請求信息裏面的收賬人的名字被篡改了,這個過程就是信息篡改。圖示如下:
1.2.3 信息竊聽
正常情況下,瀏覽器進行給服務器發送一個給張三轉賬10萬塊
的請求,服務器接收這個請求之後,這個請求的內容只有瀏覽器與服務器知道。但是這個請求被黑客攔截到了,並對請求的信息的內容進行了讀取,於是除了瀏覽器和服務器之外,黑客也知道了請求裏面的內容,這個過程就是信息竊聽。圖示如下:
2 幾個相關的技術
前面我們簡單介紹了一下HTTP以及它存在的一些缺點,既然HTTP存在着一些風險,那我們就要想辦法來解決這些風險,而解決的方案就是HTTPS。那什麼是HTTPS呢?在正式介紹HTTPS之前,我們還需要先認識幾個的概念。
2.1 對稱加密技術
對稱加密指的就是加密和解密使用同一個密鑰,所以叫做對稱加密。對稱加密只有一個密鑰。常見的對稱加密算法有:DES,AES,3DES等等。對稱加密的特點是加密速度極快,但是因爲加密和解密都是用同一個密鑰的原因,所以如果要進行密鑰分發的話,一旦被第三者截獲之後,加密就沒有了意義,第三者拿着這個密鑰也可以對密文進行解密。所以在對稱加密技術中,密鑰的安全分發比較困難,存在密鑰在分發過程中被人截獲的風險。而且如果密鑰過短的話,密鑰容易被通過窮舉法給破解出來。
2.2 非對稱加密技術
非對稱加密指的是:加密和解密使用不同的密鑰,其中一把作爲公開的、可以發給任何人的公鑰,另一把作爲只有自己才能知道的、需要自己謹慎保管、任何人都不能給的私鑰。非對稱加密的特點是:
- 公鑰加密的信息,只有私鑰才能解密。
- 私鑰加密的信息,只有公鑰才能解密。
常見的非對稱加密算法有:RSA,ECC等等 。
非對稱加密有一個嚴重的缺點:加密速度慢。而且每次加密長度也有限制,比如1024位Key的加密長度不能超過117Byte。
2.3 數字摘要
數字摘要就是指使用單向Hash(散列)函數將需要加密的明文摘要
成一串固定長度
的密文這一串密文,這串密文又稱爲數字指紋
。這個密文的特點是,如果使用相同的單向Hash函數對他進行加密,它的長度是固定的,而且將不同的明文摘要成密文其結果總是不同的(哪怕原文只修改了一個標點符號它經過單向Hash函數運算得出的結果也是不一樣的),而如果使用相同的Hash單向函數對同樣的明文進行加密,其結果必定一致。常見的單向Hash(散列)函數有:MD5,SHA1等等。
3 幾個簡單的應用場景
介紹完了幾個相關的技術之後,我們接下來介紹幾個結合了我們剛剛所介紹的技術的應用場景。
3.1 數字簽名
在正式介紹數字簽名之前,我們可以看看下面的圖。圖中,正常情況下,趙總給小王發了一條消息,小王接收到消息之後,給李總轉賬。但是因爲小王沒有辦法驗證這個轉賬的消息是不是趙總發過來的,所以如果黑客給小王發了一個僞造的消息之後,小王就會把錢轉給張三。而且在消息發送的過程中,還會有一種情況,那就是信息篡改,如果消息被黑客截獲了並做了修改,小張因爲無法辨別這個轉賬消息是否被修改過,這時候小王也會把錢轉給張三。
這個時候就需要引入一個叫做數字簽名的技術了。
數字簽名
是隻有信息的發送者才能產生的、別人無法僞造的一段數字串,這段數字串同時也是對信息的發送者所發送的信息真實性的一個有效證明,即可以驗證這段數字串是否是由發送者所發出的 。一套數字簽名通常使用兩種互補的技術,一個用於簽名(非對稱加密技術
),另一個用於驗證信息的完整性(數字摘要
)。數字簽名是非對稱加密技術
與數字摘要技術
的相結合應用。3.2 數字信封
我們在前面介紹對稱加密與非對稱加密的時候,說了他們的優缺點:
- 對稱加密技術加密速度很快,但是密鑰分發困難,分發過程一旦被截獲了,整個加密過程就變得沒有了任何意義;
- 非對稱加密技術加密速度很慢,但是隻要我們將公鑰分發出去就行了,不怕別人知道我們的公鑰,公鑰分發相對簡單。
既然如此,我們能不能設計一種技術,將這兩種加密技術的優點都結合起來,把他們的缺點淘汰掉呢?這就誕生了數字信封技術。數字信封是指:將對稱密鑰
通過非對稱加密
的技術分發對稱密鑰
的方法,即發送方將原文用對稱密鑰加密
,然後將對稱密鑰
用接收方公鑰加密
之後發送給接收方。具體流程如下圖:
從圖中可以看出,一開始的時候,趙總先使用一個隨機數生成器,生成一個隨機數作爲對稱加密使用的對稱密鑰,然後使用這個對稱密鑰來加密要發給小王的原文,得到一串原文加密之後的密文,同時趙總使用小王的公鑰對對稱密鑰
進行加密,得到一串對稱密鑰加密之後的密文,然後將原文加密之後的密文與對稱密鑰加密之後的密文組合在一起,打包發給小王。小王接收到了王總髮給他的消息之後,先將打包好的信息進行拆分,得到趙總發過來的原文加密之後的密文
與對稱密鑰加密之後的密文
,然後使用自己的密鑰對對稱密鑰加密之後的密文
進行解密,得到對稱密鑰
,然後使用這個對稱密鑰對原文加密之後的密文
進行解密,得到原文。這就是數字信封的工作流程,數字信封技術是結合了對稱加密技術
與非對稱加密技術
兩種技術的一個具體實現,它綜合了性能與安全性的考慮。如果單單使用非對稱加密的話,它的速度會很慢,如果只使用對稱加密,那在密鑰的分發過程中,就存在被竊聽的風險。
3.3 CA機制
經過前面的討論,你是不是覺得有了數字信封,就可以完美的實現加密的安全通信了,遺憾的是,事實並非如此,還記得我們前面介紹的信息篡改嗎?如果在小王獲取趙總的公鑰過程中,信息被篡改了,那這個時候,小王拿到的公鑰就是黑客給他的假公鑰
,這時,如果小王用假公鑰
加密消息,黑客就可以對這個加密的密文進行解密了,在這種情況下,消息也無法保證機密性,而且即使趙總拿到了小王用假公鑰
加密的密文,趙總也無法對其進行解密。
所以,爲了防止出現這種情況,就需要引入CA機制,CA就是一個證書服務機構,專門給我們頒發證書的,可以理解爲類似國家教育部
一樣的權威機構,它給我們頒發的證書(比如:四六級證書),我們所有人都是信任並認可的。當我們使用公鑰加密機制時,我們去找CA機構給我們頒發一個證書,這個證書是使用了CA機構的私鑰
來進行了加密(也就是簽名)的。而爲了保證CA機構的公鑰在傳輸過程中被人篡改,我們直接把傳輸過程給砍掉,直接把CA機構內置到操作系統裏面,這樣就黑客就無法在傳輸過程中對CA機構的公鑰進行篡改了,我們可以在Windows系統中,同時按住Windows + R鍵,在彈出的窗口中輸入certmgr.msc
,就可以看到如下圖所示的頁面了。
爲了方便理解,我們畫圖說明一下引入了CA機構後的公鑰分發流程,圖中的小王可以理解爲我們的操作系統,趙總則是對應着服務器,具體如下圖:
這裏簡單描述一下引入了CA機構後的公鑰分發的流程,首先趙總去找CA機構申請一個屬於他的證書,這個證書裏面有
趙總的公鑰
,還有趙總的身份信息
以及使用趙總的公鑰
和趙總的身份信息
生成的數字簽名,此外,CA機構還會把跟趙總的公鑰配對的私鑰
給趙總,讓趙總妥善保管。趙總拿到了證書之後,會把證書傳給小王,小王收到了證書之後,會使用CA結構的公鑰
來解密證書裏面的數字簽名,然後如果解密出來了,就說明這個證書是CA機構頒發的,並且得到了一個數字摘要1
,這個數字摘要是使用趙總的身份信息
和趙總的公鑰
生成的,但是這個時候,還不說明這個證書的內容,特別是趙總的公鑰,有沒有被替換過,小王先要看一下證書裏面的身份信息是不是趙總的,如果是趙總的,再使用單向Hash函數將趙總的身份信息
和趙總的公鑰
來生成一個數字摘要2
,然後對比數字摘要1
和數字摘要2
是否相等,如果相等,證書裏面的內容(特別是趙總的公鑰)沒有被替換過。這個流程中,其實除了多了CA機構這個東西之外,其它的步驟和思想就是我們前面所說的數字簽名
。 需要指出的是,引入了CA機構之後,我們還可以
避免信息劫持
。大家可以想一下,如果瀏覽器在請求服務器的過程中,這個請求被黑客劫持了,如果黑客沒有證書,那黑客服務器所發送的消息就無法通過瀏覽器的認證,這時瀏覽器就可以終止這一次請求。如果黑客僞造了一個假的證書,因爲這個假證書是無法使用CA機構的私鑰進行簽名的,瀏覽器無法使用CA機構的公鑰對這個假證書的簽名內容進行解密,所以也無法通過身份認證。如果黑客也去CA機構申請了一個屬於他的證書B,用證書B來替換掉正規服務器的證書是不是可以呢?我們仔細思考後發現,也是不行的,因爲證書裏面還有服務器的身份信息(對應着服務器的域名),所以在瀏覽器在進行完整性校驗時,黑客的證書B是無法通過校驗的。
向CA機構申請證書的時候,CA機構是會對申請人的身份進行驗證的,具體方法的驗證方法,等下在HTTPS的圖中會說到。
4 HTTPS
前面鋪墊了那麼多,終於要到我們的主角HTTPS了,如果你對前面的知識已經瞭解了,那麼,我相信只要我把圖給貼出來,你就可以瞭解它的工作原理了。不信的話,看圖:
其實這塊已經沒有什麼好說的了,我個人人爲我這個圖已經畫得比較清晰了,圖中每個模塊的詳細過程都可以在前面所講的技術中所列出的圖中找到。HTTPS其實就是對前面所講的各種技術的進行了非常巧妙組合而得到的一個技術產物,這裏面需要指出的是,圖中出現了三個隨機數,這三個隨機數其實是因爲計算機產生的隨機數是一個假隨機數,所以爲了避免出現每次產生的隨機數都一樣的情況,使用了三個隨機數來生成對稱密鑰,爲什麼是三個隨機數呢?其實這是在實踐過程中得出的一個結果,人們發現三個隨機數已經可以滿足需求了(這裏指出一點,我們在設計某一個技術算法的時候,其實大多數時候我們會發現,功能和性能往往是不能兼得的,所以我們需要在兩者之間找到一個平衡點,這裏的隨機數是一個例子,數字信封也是一個例子)。還有一點,圖中服務器與瀏覽器交互的線其實就是TLS/SSL的握手過程,我這裏只是列出了關鍵的幾部,更詳細的過程大家可以自行去網上查閱相關資料,因爲時間與篇幅原因,我這裏就不再贅述了。