当前位置: 首页 > 科技观察

TheByteSide:HTTPS会加密URL吗?

时间:2023-03-19 00:14:05 科技观察

大家好,我是小林,昨晚有读者又给我发了一份资料。他在Byte面试,被问到这个问题:HTTPS会加密URL吗?答案是,会加密。因为URL信息是保存在HTTPHeader中的,而HTTPS加密了整个HTTPHeader+HTTPBody,所以URL自然会被加密。下图是HTTP/1.1的请求头,其中包含了URL信息。对应实际的HTTP/1.1请求头:HTTP/1.1请求的第一行包含请求方法和路径。HTTP/2用一系列伪标头替换了请求行,其中五个很容易识别,因为它们在名称的开头用冒号表示。例如请求方法和路径伪头字段如下:“:method”伪头字段包含HTTP方法;“:path”伪头字段包含目标URL的路径和查询部分;如下图:上图是我的浏览器F12开发者工具查看到的信息和浏览器显示的信息是解密后的信息,所以不要误以为网址没有加密。如果使用抓包工具抓取HTTPS数据,是看不到任何东西的,如下图,只会显示“ApplicationData”,说明这是一个加密的HTTP应用数据。HTTPS能看域名吗?再问你一个问题,HTTPS能看到请求的域名吗?从上面我们知道,HTTPS对整个HTTPHeader+HTTPBody进行了加密,所以我们无法从加密后的HTTP数据中获取请求的域名。但是我们可以在TLS握手的时候看到域名信息。比如下图中,在第一次TLS握手的“ClientHello”报文中,有一个servername字段,就是请求的域名地址。因此,即使使用HTTPS,也不能假设公司内的hub偷偷不被发现。HTTPS如何保证应用数据的完整性?TLS握手协议相信大家都不陌生,我也写过相关文章:HTTPSRSA握手分析HTTPSECDHE握手分析以及HTTPS如何加密HTTP数据,我没提过。那么很多读者就认为HTTP数据是用对称加密密钥(TLS握手过程中协商的对称加密密钥)加密后直接发送的,进而想知道HTTP数据是否有摘要算法来保证完整性?TLS的实现其实分为两层:握手协议和记录协议:TLS握手协议就是我们所说的TLS四次握手过程,负责协商加密算法和生成对称密钥,随后用于保护应用程序数据(即HTTP数据);TLS记录协议负责保护应用数据并验证其完整性和来源,所以HTTP数据加密就是使用记录协议;TLS记录协议主要负责消息(HTTP数据)的压缩、加密和数据认证,流程如下图所示:具体流程如下:首先将消息分成多个更短的片段,然后每个片段都被单独压缩。接下来,压缩后的分片会加上一个消息认证码(MAC值,由哈希算法生成),用于保证完整性和认证数据。可以通过附加消息验证码的MAC值来识别篡改。同时,为了防止重放攻击,在计算消息认证码时,也加入了分片的代码。接下来,压缩段加上消息验证码用对称密码加密。最后,上述加密后的数据加上一个由数据类型、版本号、压缩长度组成的头部就是最终的加密报文数据。记录协议完成后,将最终加密的消息数据传递给传输控制协议(TCP)层进行传输。