我們大多瞭解的http優秀和方便的一面,但凡事總有兩面性,有好的一面也有不好的一面,本節聊聊不好的一面。
缺點
- 通訊使用明文(不加密),內容可能會被竊聽。
- 不驗證通訊方的身份,因此有可能遭遇偽裝(客戶端和服務端都有可能)
- 無法證明報文的完整性,有可能會被篡改。
其實以上問題不止http有,其他未加密的協議也有此類問題。
通訊使用明文(不加密),內容可能會被竊聽
因為http不具備加密的功能,所以無法對通訊報文進行加密,所以是使用明文進行傳送,那麼就有可能被竊聽。
可以看到竊聽無處不在
竊聽的方式有多種,比較常見有抓包工具(Wireshark)或者嗅探器(Sniffer)等工具,進行竊聽。
下面圖片是使用Wireshark抓取的資料:
如何防止
-
通訊的層加密
通過http與SSL/TLS的組合使用(SSL/TSS後續章節介紹),可以加密http通訊內容。
-
通訊報文內容加密
雙方約定好金鑰,在傳輸前對原報文進行一個加密,傳輸至服務端或客戶端在進行解密,因為此類方式不同於https方式,所以還是有一定的風險。
- 金鑰不是一次一密,而且是內嵌在程式碼中,都有可能被獲取。
- 如果是基於瀏覽器的工程,那麼這個金鑰是內嵌在js中的,而js是可以訪問的,那麼就有可能被獲取。
- 如果是app工程中,也有可能被反編譯獲取。
不驗證通訊方的身份,因此有可能遭遇偽裝
http協議的請求與響應不會對通訊方進行身份的確認,因此這種無法確認通訊方,總結有以下幾類問題:
- 無法確定請求目標的Web伺服器是否,真正要訪問的伺服器。
- 無法確定客戶端是否是真實要響應的客戶端。
- 無法確定正在通訊的雙方是否具備訪問許可權,比如:提供的WEB服務只想開發給指定的客戶端訪問。
- 無法判定請求來自何方,出自誰手。
- 即使是無意義的請求,也會照單全收。如海量的Dos攻擊。
如何防止
使用SSL才可以防止此類問題,SSL不僅提供加密功能,還提供證書,通過證書可以確定通訊的方是意料之中的,這裡肯定有人會問那證書如何保證可信呢?
證書是有公認值得信賴的CA機構頒發的,其他機構是沒有頒發證書許可權的。CA機構是可信賴的,那麼頒發的證書也是可信賴的。
客戶端驗證服務端是否是可信的服務端,即單向認證。
客戶端與服務端相互認證,即雙向認證。
無法證明報文的完整性,有可能會被篡改
所謂完整性指資訊的準確度。無法證明完整性,那麼也就無法判定資訊是否準確。
由於http協議無法證明通訊的完整性,那麼請求或者響應過程中報文就有可能被篡改,而服務端或者客戶端是無法感知的。
比如從網上下載的內容,是無法確認下載後的內容是否跟伺服器上的內容一致。
像這樣在請求/響應途中,遭攻擊者攔截並篡改內容攻擊,稱為中間人攻擊。
如何防止
- 使用md5/sha1/pgp來確定報文完整性的方法
點選下載後,可以檢視對應檔案簽名或者雜湊值,當我點選MD5後,如下圖:
通過對下載後檔案在通過MD5生成雜湊碼,與官網上的雜湊碼進行比較,來確定檔案是否被篡改。
但是從其他方式證明此種方式也不是絕對安全的,具體可以參見:bobao.360.cn/news/detail…大概意思就是構造”字首碰撞法“,來製造MD5值一樣,檔案內容不一樣的檔案。