字節一面:HTTPS 會加密 URL 嗎?

作者:小林 coding

八股文網站:xiaolincoding.com

大家好,我是小林,昨晚有位讀者又給我送素材來了。

他在面試字節,被問到這個問題:HTTPS 會加密 URL 嗎?

答案是,會加密的。

因爲 URL 的信息都是保存在 HTTP Header 中的,而 HTTPS 是會對 HTTP Header + HTTP Body 整個加密的,所以 URL 自然是會被加密的。

下圖是 HTTP/1.1 的請求頭部,可以看到是包含 URL 信息的。

對應的實際的 HTTP/1.1 的請求頭部:

HTTP/1.1 請求的第一行包含請求方法和路徑。HTTP/2 用一系列僞頭部(pseudo-header)替換了請求行,這五個僞頭部很容易識別,因爲它們在名稱的開頭用了一個冒號來表示。

比如請求方法和路徑僞頭字段如下:

如下圖:

上圖是我瀏覽器 F12 開發者工具查看的信息,瀏覽器顯示信息是已經解密後的信息,所以不要誤以爲 URL 沒有加密。

如果你用抓包工具,抓包 HTTPS 的數據的話,你是什麼都看不到的,如下圖,只會顯示 “Application Data”,表示這是一個已經加密的 HTTP 應用數據。

HTTPS 可以看到域名嗎?

再問大家一個問題,HTTPS 可以看到請求的域名嗎?

從上面我們知道,HTTPS 是已經把  HTTP Header + HTTP Body 整個加密的,所以我們是無法從加密的 HTTP 數據中獲取請求的域名的。

但是我們可以在 TLS 握手過程中看到域名信息

比如下圖,TLS 第一次握手的 “Client Hello” 消息中,有個 server name 字段,它就是請求的域名地址。

所以,用了 HTTPS 也不能以爲偷偷在公司上某 hub 不會被發現

HTTPS 的應用數據是如何保證完整性的?

TLS 的握手協議我相信大家都很熟悉了,我也寫過很多相關的文章了:

然後對於 HTTPS 是怎麼加密 HTTP 數據的,我沒有提到過。

然後很多讀者以爲 HTTP 數據就用對稱加密密鑰(TLS 握手過程中協商出來的對稱加密密鑰)加密後就直接發送了,然後就疑惑 HTTP 數據有沒有通過摘要算法來保證完整性?

事實上,TLS 在實現上分爲握手協議記錄協議兩層:

TLS 記錄協議主要負責消息(HTTP 數據)的壓縮,加密及數據的認證,過程如下圖:

具體過程如下:

記錄協議完成後,最終的加密報文數據將傳遞到傳輸控制協議 (TCP) 層進行傳輸。

好了,寫滿 1000 字了,今天就水到這了

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/SPmx7tEhQYtHH_HDw7zXFw