之前的文章說了一下關于 Cookie 的內容,但是也就引出來了一些問題,比如 HTTP 是怎么進行安全處理的?來了,本文給大家講述 HTTP 的安全問題。
1. HTTPS
HTTPS 是最流行的 HTTP 安全形式。它是由網景公司首創的,所有主要的瀏覽器和服務器都支持此協議。
大家來看這個圖,

HTTPS 方案的 URL 以 https://,而不是 http:// 開頭,據此就可以分辨某個 Web 頁面是通 過 HTTPS 而不是 HTTP 訪問的(有些瀏覽器還會顯示一些標志性的安全提示)
使用 HTTPS 時,所有的 HTTP 請求和響應數據在發送到網絡之前,都要進行加密。 HTTPS 在 HTTP 下面提供了一個傳輸級的密碼安全層。
我們可以來看一下關于 HTTP 和 HTTPS 的層。

大部分困難的編碼及解碼工作都是在 SSL or TLS 庫中完成的,所以 Web 客戶端和服務器在使用 安全 HTTP 時無需過多地修改其協議處理邏輯。在大多數情況下,只需要用 SSL 的輸入 / 輸出調用取代 TCP 的調用,再增加其他幾個調用來配置和管理安全信息就行了。
2.數字加密
關于數字加密,很容易理解的,不知道大家看過一些 “神劇” 么? 在抗戰時期的電報密碼,都是用本子的形式,然后密碼本不同的字母來對應不同的數據信息,然后把對應的數字拼接起來。這只是我們對數字密碼的簡單理解,來官方的說法:

這里面的編碼器和解碼器在 “神劇”中不就是密碼本的存在么?用密碼來生成保密信息已經有數千年了。傳說尤利烏斯 · 凱撒(Julius Caesar)曾使用過 一種三字符循環移位密碼,報文中的每個字符都由字母表中三個位置之后的字符來取代。 在現代的字母表中,“A”就應該由“D”來取代,“B”就應該由“E”來取代,以此類推。
我們按照 “旋轉3” 為例子,

密碼就可以將報文“meet me at the pier at midnight”編碼為密文“phhw ph dw wkh slhu dw plgqljkw”。
1 通過解碼,在字母 表中旋轉 -3 個字符,就可以將密文解密回原來的明文報文。
但是缺點我們同時也能想到,密碼本容易被對方給獲取,編碼機器也容易被敵人獲取,在戰爭年代,密碼本這是必爭之物呀。
所以大部分機器上都有一些號盤,可以將其 設置為大量不同的值以改變密碼的工作方式。即使機器被盜,沒有正確的號盤設置(密鑰值),解碼器也無法工作。
這些密碼參數被稱為密鑰(key)。要在密碼機中輸入正確的密鑰,解密過程才能正確進 行。密碼密鑰會讓一個密碼機看起來好像是多個虛擬密碼機一樣,每個密碼機都有不同的 密鑰值,因此其行為都會有所不同。

上圖中就是使用不同密鑰的旋轉 N 字符密碼。。密鑰越長,編碼組合就越多,通過隨機猜測 密鑰來破解代碼就越困難。
給定一段明文報文 P、一個編碼函數 E 和一個數字編碼密鑰 e,就可以生成一段經過編碼的密文 C 如下圖。通過解碼函數 D 和解碼密鑰 d,可以將密文 C 解碼為原始的明文 P。當然,編 / 解碼函數都是互為反函數的,對 P 的編碼進行解碼就會回到原始報文 P 上去。

3.對稱密鑰加密
我們來更詳細地看看密鑰和密碼是怎樣配合工作的。很多數字加密算法都被稱為對稱密 鑰(symmetric-key)加密技術,這是因為它們在編碼時使用的密鑰值和解碼時一樣 (e=d)。我們就將其統稱為密鑰 k。
在對稱密鑰加密技術中,發送端和接收端要共享相同的密鑰 k 才能進行通信。發送端用共 享的密鑰來加密報文,并將得到的密文發送給接收端。接收端收到密文,并對其應用解密 函數和相同的共享密鑰,恢復出原始的明文。大家看下面的一幅圖:

對稱密鑰加密算法為編 / 解碼使用相同的密鑰,流行的對稱密鑰加密算法包括:DES、Triple-DES、RC2 和 RC4。
3.1 密鑰長度與枚舉攻擊
在很多情況下,編 / 解碼算法都是眾所周知的,因此密 鑰就是唯一保密的東西了。
好的加密算法會迫使攻擊者試遍每一個可能的密鑰,才能破解代碼。用暴力去嘗試所有的密鑰值稱為枚舉攻擊(enumeration attack)。如果只有幾種可能的密鑰值,居心不良的人通過暴力遍歷所有值,就能最終破解代碼了。但如果有大量可能的密鑰值,他可能就要花 費數天、數年,甚至無限長的時間來遍歷所有的密鑰,去查找能夠破解密碼的那一個。
可用密鑰值的數量取決于密鑰中的位數,以及可能的密鑰中有多少是有效的。
8 位的密鑰只有 256 個可能的密鑰值, 40 位的密鑰可以有 240 個可能的密鑰值(大約是一萬億個密鑰),128 位的密鑰可以產生 大約 340 000 000 000 000 000 000 000 000 000 000 000 000 個可能的密鑰值。
但是也有例外,并不是所有的加密技術中的密鑰值都是全部有效果的,比如,在最知名的非對稱加密算法 RSA 中,有效密鑰 必須以某種方式與 質數相關??赡艿拿荑€值中只有少量密鑰具備此特性。
在傳統的對稱密鑰加密技術中,對小型的、不太重要的事務來說,40 位的密鑰就足夠安 全了。但現在的高速工作站就可以將其破解,這些工作站每秒可以進行數十億次計算。 相比之下,對于對稱密鑰加密技術,128 位的密鑰被認為是非常強大的。
實際上,長密鑰對密碼安全有著非常重要的影響,美國政府甚至對使用長密鑰的加密軟件實施了出口控制,以防止潛在的敵對組織創建出美國國家安全局(National Security Agency,NSA)自己都無法破解的秘密代碼。
Applied Cryptography 這本書中有一個表,記錄了1995年的通過猜測所有的密鑰來破解一個 DES 密碼所需的時間進行了描述。

可能這個數據并不是很適用現在,計算機的速度在成倍數的增長,但是這個圖,我們也可以乘以相對應的倍數,那還是比較有參考價值的哈。
對稱密鑰加密技術的缺點之一就是發送者和接收者在互相對話之前,一定要有一個共享的保密密鑰。
比如你想要和淘寶賣家建立私密的對話的話,那么在安全下單之前,需要和淘寶網建立一個私有的保密密鑰,你需要一種產生保密密鑰并將其記住的方式,如果全網的人都是這樣的,那就可能記住太多的東西了,這就是噩夢般的存在呀。于是就出現了后邊的內容,請看下邊:
4.公開密鑰加密
公開密鑰加密技術沒有為每對主機使用單獨的加密 / 解密密鑰,而是使用了兩個非對稱密鑰:一個用來對主機報文編碼,另一個用來對主機報文解碼。編碼密鑰是眾所周知的(這 也是公開密鑰加密這個名字的由來),但只有主機才知道私有的解密密鑰。
每個人都能找到某個特定主機的公開密鑰,密鑰的建立變得更加簡單。但解碼密鑰是保密的,因此只有接收端才能對發送給它的報文進行解碼。

公開密鑰加密技術是非對稱的,為編碼和解碼使用了不同的密鑰。
那我們就需要把對稱密鑰加密和公開密鑰加密來做個對比了。

所有公開密鑰非對稱加密系統所面臨的共同挑戰是:
- 公開密鑰(是公有的,所有人都可以獲得);
- 一小片攔截下來的密文(可通過對網絡的嗅探獲?。?;
- 一條報文及與之相關的密文(對任意一段文本運行加密器就可以得到)。
就算你知道這三個條件,也無法計算出保密的私有密鑰,這就是公開密鑰非對稱加密系統所要面臨的挑戰。
RSA 算法就是一個滿足了所有這些條件的流行的公開密鑰加密系統,關于RSA算法,本文先不深究,之后在我看完密碼學這本書之后,然后再給大家進行解讀。
5.數字簽名
前面我們已經說了對稱和非對稱密鑰加 / 解密,下面我們來說數字簽名是什么意思。
百度百科:數字簽名(又稱公鑰數字簽名)是只有信息的發送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對信息的發送者發送信息真實性的一個有效證明。它是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術來實現的,用于鑒別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用于簽名,另一個用于驗證。數字簽名是非對稱密鑰加密技術與數字摘要技術的應用。
其實說白了,數字簽名就是附加在報文上的特殊加密校驗碼。
我們用一個例子來進行解釋,我們先看一幅圖,節點 A 是如何向節點 B 發送一條報文,并對其進行簽名的。
- 節點 A 將變長報文提取為定長的摘要。
- 節點 A 對摘要應用了一個“簽名”函數,這個函數會將用戶的私有密鑰作為參數。因 為只有用戶才知道私有密鑰,所以正確的簽名函數會說明簽名者就是其所有者。在圖中,,由于解碼函數 D 中包含了用戶的私有密鑰,所以我們將其作為簽名函數使用。
- 一旦計算出簽名,節點 A 就將其附加在報文的末尾,并將報文和簽名都發送給 B。
- 在接收端,如果節點 B 需要確定報文確實是節點 A 寫的,而且沒有被篡改過,節點 B 就可以對簽名進行檢查。節點 B 接收經私有密鑰擾碼的簽名,并應用了使用公開 密鑰的反函數。如果拆包后的摘要與節點 B 自己的摘要版本不匹配,要么就是報文在傳輸過程中被篡改了,要么就是發送端沒有節點 A 的私有密鑰(也就是說它不是節點 A)。
把圖理解是,是不是關于數字簽名就很好理解了呢?
6.數字證書
我們來看一下百度百科對他的解釋:數字證書是指CA(電子認證服務)機構發行的一種電子文檔,是一串能夠表明網絡用戶身份信息的數字,提供了一種在計算機網絡上驗證網絡用戶身份的方式,因此數字證書又稱為數字標識。數字證書對網絡用戶在計算機網絡交流中的信息和數據等以加密或解密的形式保證了信息和數據的完整性和安全性。
數字證書其實并沒有我們想的那么難,數字證書的基本架構是公開密鑰PKI,即利用一對密鑰實施加密和解密。其中密鑰包括私鑰和公鑰,私鑰主要用于簽名和解密,由用戶自定義,只有用戶自己知道;公鑰用于簽名驗證和加密,可被多個用戶共享。
HTTPS 建立了一個安全 Web 事務之后,現代的瀏覽器都會自動獲取所連接服務器的 數字證書。如果服務器沒有證書,安全連接就會失敗。服務器證書中包含很多字段,其中包括:
- Web 站點的名稱和主機名;
- Web 站點的公開密鑰;
- 簽名頒發機構的名稱;
- 來自簽名頒發機構的簽名
瀏覽器收到證書時會對簽名頒發機構進行檢查。1 如果這個機構是個很有權威的公共簽名 機構,瀏覽器可能已經知道其公開密鑰了(瀏覽器會預先安裝很多簽名頒發機構的證書)。
如果對簽名頒發機構一無所知,瀏覽器就無法確定是否應該信任這個簽名頒發機構,它通 常會向用戶顯示一個對話框,看看他是否相信這個簽名發布者。簽名發布者可能是本地的 IT 部門或軟件廠商。
是不是很容易理解呢?
文章參考:
《圖解 HTTP》
《HTTP 權威指南》