都用HTTPS了,还能被查出浏览记录?
最近,群里一个刚入职的小伙因为用公司电脑访问奇怪的网站,被约谈了。他很困惑 —— 访问的都是HTTPS
的网站,公司咋知道他访问了啥?
实际上,由于网络通信有很多层,即使加密通信,仍有很多途径暴露你的访问地址,比如:
-
DNS
查询:通常DNS
查询是不会加密的,所以,能看到你DNS
查询的观察者(比如运营商)是可以推断出访问的网站 -
IP
地址:如果一个网站的IP
地址是独一无二的,那么只需看到目标IP
地址,就能推断出用户正在访问哪个网站。当然,这种方式对于多网站共享同一个IP
地址(比如CDN
)的情况不好使 -
流量分析:当访问一些网站的特定页面,可能导致特定大小和顺序的数据包,这种模式可能被用来识别访问的网站
-
cookies
或其他存储:如果你的浏览器有某个网站的cookies
,显然这代表你曾访问过该网站,其他存储信息(比如localStorage
)同理
除此之外,还有很多方式可以直接、间接知道你的网站访问情况。
本文将聚焦在HTTPS
协议本身,聊聊只考虑HTTPS
协议的情况下,你的隐私是如何泄露的。
欢迎围观朋友圈、加入人类高质量前端交流群,带飞
HTTPS简介
我们每天访问的网站大部分是基于HTTPS
协议的,简单来说,HTTPS
= HTTP
+ TLS
,其中:
-
HTTP
是一种应用层协议,用于在互联网上传输超文本(比如网页内容)。由于HTTP
是明文传递,所以并不安全 -
TLS
是一种安全协议。TLS
在传输层对数据进行加密,确保任何敏感信息在两端(比如客户端和服务器)之间安全传输,不被第三方窃取或篡改
所以理论上,结合了HTTP
和TLS
特性的HTTPS
,在数据传输过程是被加密的。但是,TLS
建立连接的过程却不一定是加密的。
TLS的握手机制
当我们通过TLS
传递加密的HTTP
信息之前,需要先建立TLS
连接,比如:
-
当用户首次访问一个
HTTPS
网站,浏览器开始查询网站服务器时,会发生TLS
连接 -
当页面请求
API
时,会发生TLS
连接
建立连接的过程被称为TLS握手,根据TLS
版本不同,握手的步骤会有所区别。
但总体来说,TLS握手是为了达到三个目的:
-
协商协议和加密套件:通信的两端确认接下来使用的
TLS
版本及加密套件 -
验证省份:为了防止“中间人”攻击,握手过程中,服务器会向客户端发送其证书,包含服务器公钥和证书授权中心(即
CA
)签名的身份信息。客户端可以使用这些信息验证服务器的身份 -
生成会话密钥:生成用于加密接下来数据传输的密钥
TLS握手机制的缺点
虽然TLS
握手机制会建立安全的通信,但在握手初期,数据却是明文发送的,这就造成隐私泄漏的风险。
在握手初期,客户端、服务端会依次发送、接收对方的打招呼信息。首先,客户端会向服务端打招呼(发送client hello信息),该消息包含:
-
客户端支持的
TLS
版本 -
支持的加密套件
-
一串称为客户端随机数(
client random
)的随机字节 -
SNI
等一些服务器信息
服务端接收到上述消息后,会向客户端打招呼(发送server hello消息),再回传一些信息。
其中,SNI
(Server Name Indication
,服务器名称指示)就包含了用户访问的网站域名。
那么,握手过程为什么要包含SNI
呢?
这是因为,当多个网站托管在一台服务器上并共享一个IP
地址,且每个网站都有自己的SSL
证书时,那就没法通过IP
地址判断客户端是想和哪个网站建立TLS
连接,此时就需要域名信息辅助判断。
打个比方,快递员送货上门时,如果快递单只有收货的小区地址(IP
地址),没有具体的门牌号(域名),那就没法将快递送到正确的客户手上(与正确的网站建立TLS
连接)。
所以,SNI
作为TLS
的扩展,会在TLS
握手时附带上域名信息。由于打招呼的过程是明文发送的,所以在建立HTTPS
连接的过程中,中间人就能知道你访问的域名信息。
企业内部防火墙的访问控制和安全策略,就是通过分析SNI
信息完成的。
虽然防火墙可能已经有授信的证书,但可以先分析
SNI
,根据域名情况再判断要不要进行深度检查,而不是对所有流量都进行深度检查
那么,这种情况下该如何保护个人隐私呢?
Encrypted ClientHello
Encrypted ClientHello(ECH
)是TLS
1.3的一个扩展,用于加密Client Hello
消息中的SNI
等信息。
当用户访问一个启用ECH
的服务器时,网管无法通过观察SNI
来窥探域名信息。只有目标服务器才能解密ECH
中的SNI
,从而保护了用户的隐私。
当然,对于授信的防火墙还是不行,但可以增加检查的成本
开启ECH
需要同时满足:
-
服务器支持
TLS
的ECH
扩展 -
客户端支持
ECH
比如,cloudflare SNI测试页支持ECH
扩展,当你的浏览器不支持ECH
时,访问该网站sni
会返回plaintext
:
对于chrome
,在chrome://flags/#encrypted-client-hello中,配置ECH
支持:
再访问上述网站,sni
如果返回encrypted
则代表支持ECH
。
总结
虽然HTTPS
连接本身是加密的,但在建立HTTPS
的过程中(TLS
握手),是有数据明文传输的,其中SNI
中包含了服务器的域名信息。
虽然SNI
信息的本意是解决同一IP下部署多个网站,每个网站对应不同的SSL证书,但也会泄漏访问的网站地址。
ECH
通过对TLS
握手过程中的敏感信息(主要是SNI
)进行加密,为用户提供了更强的隐私保护。
相关文章:

都用HTTPS了,还能被查出浏览记录?
最近,群里一个刚入职的小伙因为用公司电脑访问奇怪的网站,被约谈了。他很困惑 —— 访问的都是HTTPS的网站,公司咋知道他访问了啥? 实际上,由于网络通信有很多层,即使加密通信,仍有很多途径暴露…...
vi配置文件.vimrc内容示例
1、.vimrc配置文件介绍 (1).vimrc是vi编辑器的配置文件,里面可以对vi编译器做个性化配置; (2).vimrc在用户目录下,每个用户有一个,类似于.bashrc文件,将下面的配置文件内…...

MacOS上的Pip和Python升级指南
在MacOS系统上,保持Pip和Python版本的最新状态对于顺利进行Python开发至关重要。通过升级Pip和Python,你可以享受到最新的功能、修复的bug以及提升的开发效率。本文将为你提供在MacOS上升级Pip和Python的详细指南,助你打造更强大的开发环境。…...
VB6.0实现修改EXE程序的图标
当你给一家公司做技术支持的时候,需求各种各样的,其中今天遇到就是要修改某个程序的图标,代码实现如下。 // q1016058890 群 214016721 //注 意:这个方法貌似只对有些EXE文件有效,这不是万能的方法,此…...
Python 编程基础 | 第二章-基础语法 | 2.3、for 语句
一、for 语句 1、循环语句 for循环的语法格式如下: for iterating_var in sequence:statements(s)例如: for ch in "hello world":print(ch)fruits ["banana", "apple", "mango"] for fruit in fruits:print(…...

linux下解决tomcat错误问题
错误一: Linux下Tomcat启动报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 原因:可能是Linux环境变了,需要在catalina.sh文件里指定JDK路径 解决方式: 在/bin/catalina.sh配置文件中加…...

PMP证书的价值如何?
2022年开始,PMP考试启用了新考纲,不光考试内容进行了大刀阔斧的改革,出题方式也进行了更新。除原有的PMBOK6和PMBOK7主考教材外,还增加了一本《敏捷实践指南》。 别小看新加的这本书,它虽然与PMBOK代表的预测法属于完…...

linux上mysql数据备份(全量备份策略+增量备份策略)
执行备份策略前,先做好scp命令的准备 解决思路: 生成SSH公钥/私钥后,您需要将公钥添加到服务器上,从而使服务器可以使用该公钥来验证您的身份。 生成SSH公钥/私钥的命令为 ssh-keygen -t rsa -b 4096什么都不用输入,…...
PHP实现DFA算法,查找关键词
# 添加关键词 到全局字典dict里面 protected function addWord($strWord) {$len mb_strlen($strWord,UTF-8);$curNode &$this->dict;for ($index 0; $index < $len; $index) {$word mb_substr($strWord, $index, 1, UTF-8);if (!isset($curNode[$word])) {$curNo…...

JTS:08 JTS图形相交
这里写目录标题 版本JTS disjoint intersects俩个图形不相交俩个图形 边相交俩个图形 内部相交俩个图形 点相交 版本 org.locationtech.jts:jts-core:1.19.0 链接: github JTS disjoint intersects 不相交的 九交模型FF*FF**** 相交的 九交模型 [T********] [*T*******] [**…...

深挖 ThreadLocal 底层原理?它有什么用?学会之后手撕面试官
目录 1. ThreadLocal 的主要功能? 2. ThreadLocal 代码举例 3. ThreadLocal 源码分析 3.1 ThreadLocal 的 get 方法源码解析 3.2 ThreadLocal 的 set 方法源码解析 3.3 ThreadLocal 的 createMap 方法源码解析 3.4 ThreadLocal 的 set 方法总结 4. 为什么En…...
sort()排序函数(c++)
文章目录 sort()排序函数(c)一、原理二、使用方法(一)头文件(二)使用语法1.方式一(默认)2.方式二:定义升序或降序3.方式三:自定义 sort()排序函数(…...

如何评估测试用例的优先级?
评估测试用例的优先级,有助于我们及早发现和解决可能对系统稳定性和功能完整性产生重大影响的问题,助于提高测试质量,提高用户满意度。 如果没有做好测试用例的优先级评估,往往容易造成对系统关键功能和高风险场景测试的忽略&…...

510758-28-8,用于标记蛋白质和酶的配体TBTA
产品简介:Tris(benzyltriazolylmethyl)amine (TBTA)是一种配体,能作为生化工具用于标记蛋白质和酶。 CAS号:510758-28-8 中文名:三[(1-苄基-1H-1,2,3-三唑-4-基)甲基]胺 英文名:TBTA 化学式:C30H30N10…...
Jtti:云服务器ftp不能访问端口如何解决
如果您的云服务器上的FTP服务无法访问端口,可能有多种原因导致这种情况。以下是一些可能的解决方法: 检查FTP服务状态: 首先,请确保您的FTP服务器正在运行。您可以使用以下命令来检查FTP服务器的状态,具体命令可能因FT…...

云服务器租用价格表概览_阿里云腾讯云华为云
云服务器租用价格多少钱一年?阿腾云分享阿里云、腾讯云和华为云的云服务器租用价格表:阿里云2核2G服务器108元一年起、腾讯云2核2G3M带宽轻量服务器95元一年、华为云2核2G3M云耀L实例89元一年起,阿腾云分享更多关于云服务器租用价格明细&…...
E. Iva Pav -前缀和 + 二分 +位运算
题面 分析: 赛时一直纠结于与运算前缀和不可逆,导致没有思路,但是发现行不通并没有及时思考别的解决办法导致一条路走到黑,阻碍了自己的思维,在今年的网络赛赛时也是一样,行不通的时候就没心思去重新想其…...

新手学习:ArcGIS对shp文件裁剪
新手学习:ArcGIS对SHP文件裁剪 新手学习 记录每个步骤,因为有很多控件可能刚开始还不熟悉,根本不知道在哪里,所以写的比较详细。 1.添加要裁剪的shp文件 2.查看shp文件的地理坐标系 双击shp文件,就可以查看shp文件的…...

Java 设计模式——抽象工厂模式
目录 1.概念2.结构3.实现4.优缺点5.使用场景6.模式扩展7.JDK源码解析——Collection.iterator方法 1.概念 (1)Java 设计模式——工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机等。这些工厂只生产同种类产品…...

如何使用ChatGPT构建一个Web应用程序?
围绕ChatGPT的最大卖点之一是它可以成为一种有效的编程工具。其想法是这样的:你用自然语言描述需求,该聊天机器人生成满足该需求的代码。但是ChatGPT在这方面到底有多好呢? 还有什么比亲自测试一下更好的方法呢?我们让ChatGPT从头…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...