androidhttphttps
1. Android面試筆記——HTTP/HTTPS
HTTP和HTTPS是面試常問的問題,內容比較多而且復雜,HTTPS裡面的細節很多,本文只是把主要的東西寫出來,想要弄懂HTTPS還是要多看幾篇博文,自己動手走一遍把各個攻擊的case搞明白。
HTTP 是超⽂本傳輸協議,也就是HyperText Transfer Protocol。
Host 欄位 :客戶端發送請求時,⽤來指定伺服器的域名。 Host: www..com
Content-Length 欄位 :伺服器在返回數據時,會有 Content-Length 欄位,表明本次回應的數據長度。 Content-Length: 1000
Connection 欄位 :Connection 欄位最常用於客戶端要求伺服器使⽤ TCP 持久連接,以便其他請求復⽤。 HTTP/1.1 版本的默認連接都是持久連接,但為了兼容⽼版本的 HTTP,需要指定 Connection ⾸部欄位的值為Keep-Alive 。
Content-Type 欄位 :Content-Type 欄位⽤於伺服器回應時,告訴客戶端,本次數據是什麼格式 。 Content-Type: text/html; charset=utf-8
Content-Encoding 欄位 :Content-Encoding 欄位說明數據的壓縮⽅法。表示伺服器返回的數據使用了什麼壓縮格式 。客戶端在請求時,⽤ Accept-Encoding 欄位說明自己可以接受哪些壓縮⽅法。 Accept-Encoding: gzip, deflate
下圖為訪問網路的返回欄位
HTTP/2 協議是基於 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。
這都是基於 TCP 傳輸層的問題,所以 HTTP/3 把 HTTP 下層的 TCP 協議改成了 UDP 。
UDP 發生是不管順序,也不管丟包的,所以不會出現 HTTP/1.1 的隊頭阻塞 和 HTTP/2 的⼀個丟包全部重傳問題。
UDP 是不可靠傳輸的,但基於 UDP 的 QUIC 協議 可以實現類似 TCP 的可靠性傳輸。
HTTPS 采⽤的是 對稱加密和⾮對稱加密結合 的「混合加密」⽅式:
采⽤「混合加密」的⽅式的原因:
摘要演算法⽤來實現 完整性 ,能夠為數據⽣成獨⼀⽆⼆的「指紋」,⽤於校驗數據的完整性,解決了篡改的⻛險。
客戶端在發送明⽂之前會通過摘要演算法算出明文的「指紋」,發送的時候把「指紋 + 明文」⼀同加密成密文後,發送給伺服器,伺服器解密後,用相同的摘要演算法算出發送過來的明文,通過⽐較客戶端攜帶的「指紋」和當前算出的「指紋」做⽐較,若「指紋」相同,說明數據是完整的。
客戶端先向伺服器端索要公鑰,然後⽤公鑰加密信息,伺服器收到密文後,⽤⾃⼰的私鑰解密。這就存在些問題,如何保證公鑰不被篡改和信任度?
所以這⾥就需要藉助第三⽅權威機構 CA (數字證書認證機構),將伺服器公鑰放在數字證書(由數字證書認證機構頒發)中,只要證書是可信的,公鑰就是可信的。
通過數字證書的⽅式保證伺服器公鑰的身份,解決冒充的⻛險 。
證書簽名和驗證過程 :
兩種情況 :