浏览器指纹技术有哪些:主动与被动两大类,每种怎么工作(2026)
浏览器指纹技术分两大类:主动式在页面里运行脚本,读取浏览器报告或渲染出来的东西——属性、Canvas、WebGL、音频、字体、API 支持情况;被动式不需要任何脚本,只看连接本身暴露的信息——请求头、TLS 握手、HTTP/2 设置和 TCP/IP 协议栈特征。追踪方把两类结果合在一起,再按稳定性和一致性加权判断。
本文逐项拆解每一种浏览器指纹技术:它读什么、为什么不同机器的值会不同、稳定性如何、不一致时长什么样。如果你想做的是检查自己浏览器的指纹,而不是理解原理,直接看我们的浏览器指纹检测指南。
浏览器指纹技术的两大类
W3C 隐私兴趣小组(PING)的文档《Mitigating Browser Fingerprinting in Web Specifications》给出了业内通用的划分:
- 被动指纹:利用浏览器本来就会发出的信息——HTTP 请求头、网络层特征、IP 地址。网站什么都不用运行,用户也看不到这个过程。
- 主动指纹:运行 JavaScript(早年还有插件)去查询属性、或让浏览器做一次计算,然后记录结果。
这个划分有两层实际意义。第一,被动信号关掉脚本也挡不住;第二,被动信号来自浏览器配置之外——来自操作系统的网络协议栈、TLS 库、代理。主动信号信息量更大,但每一项都是一次 API 调用,浏览器厂商可以限制、加噪或统一它。
主动式技术:页面向浏览器「问」了什么
属性探测
最基础的做法是直接读浏览器暴露的属性:User-Agent、平台、语言列表、时区、屏幕分辨率与色深、设备像素比、逻辑 CPU 核数、上报的设备内存、最大触点数。
Chromium 系浏览器已经精简了默认 User-Agent,把细节挪进 User-Agent Client Hints。低熵字段(品牌、主版本号、是否移动端、平台)默认发送;完整版本号、系统版本、CPU 架构、设备型号等高熵字段需要网站主动请求——而指纹脚本恰恰会去请求。
这些值单看都很普通,价值在于组合,以及它们彼此之间是否对得上。
Canvas 指纹
脚本在离屏画布上绘制文字、emoji 和图形,再把像素读回来算哈希。字体栅格化、抗锯齿、次像素渲染和 GPU 合成在不同操作系统、显卡驱动和硬件上存在细微差异,所以这个哈希能代表一类机器。学术上最早系统描述它的是 Mowery 与 Shacham 2012 年的论文《Pixel Perfect: Fingerprinting Canvas in HTML5》;Englehardt 与 Narayanan 2016 年对一百万个网站的测量研究,则在真实网站上发现了部署中的 Canvas 指纹脚本。
同一台机器上 Canvas 输出非常稳定,也很难伪造得像样——一个可信的值必须像真实硬件算出来的。
WebGL 参数与渲染
WebGL 从两处泄露信息。一是渲染器与厂商字符串(常通过调试渲染器扩展取得),直接写出显卡型号和驱动路径;二是几十个数值型能力上限(最大纹理尺寸、支持的扩展、着色器精度),脚本还可能渲染一个 3D 场景再取哈希,思路同 Canvas。
渲染器字符串是追踪方最好用的一致性校验之一:User-Agent 声称的操作系统上根本不存在的显卡,就是直接矛盾。
音频处理指纹
脚本创建一个 AudioContext(一般是离线版本,不会真的发声),生成一段波形,经过压缩器等处理节点,再对输出采样算哈希。音频栈在浮点实现上的细节差异,会产生微小但因机器而异的结果。Englehardt 与 Narayanan 在同一项 2016 年研究里也记录了这种技术的实际使用。
字体探测
大多数浏览器不允许脚本直接列出已安装字体,于是改用测量:用候选字体加一个回退字体渲染一段文字,宽高和只用回退字体时不同,就说明该字体已安装。对几百个候选字体重复这个过程,就得到一份字体清单。每个操作系统有自己特征性的默认字体集,装过的软件还会再添一些,所以这份清单既暴露系统,也透露这台机器的使用痕迹。
功能与 API 探测
除了具名属性,脚本还会测试「哪些 API 存在、行为如何」:支持哪些编解码器、报告了几个音视频输入输出设备、各项权限状态、有没有某个厂商特有对象、某些数学函数的精度、可用的计时精度。单项信号很弱,合起来能区分浏览器内核与版本——包括识别出一个自称 A 内核、行为却像 B 内核的浏览器。
WebRTC 地址发现
WebRTC 建连时会收集候选网络地址。视浏览器设置不同,它可能暴露局域网地址,或一个与 HTTP 流量来源不同的公网地址。严格说这属于「泄露」而非「指纹」,但指纹脚本几乎都会顺手采集;一旦它和 HTTP 来源地址不一致,其他各层做得再好也没意义。
被动式技术:连接本身暴露了什么
HTTP 请求头的取值与顺序
每个请求都带着请求头——User-Agent、Accept、Accept-Language、Accept-Encoding、Client Hints。除了取值,请求头出现的顺序、大小写和格式也带有浏览器内核与版本的特征。请求头内容声称是某个浏览器、排列顺序却像另一个客户端,服务端一眼就能看出来。
TLS 握手签名
在任何 HTTP 数据之前,客户端的 TLS ClientHello 会按特定顺序列出支持的协议版本、密码套件、扩展和椭圆曲线。对这份列表取哈希,就得到 TLS 实现的签名。JA3 由 Salesforce 的工程师在 2017 年开源,让这种方法普及开来;FoxIO 在 2023 年发布的 JA4 做了改进,以应对如今会随机打乱扩展顺序的浏览器。这个签名来自 TLS 库而不是页面脚本,所以在浏览器配置里改不了——它反映的是真正在建立连接的那个内核。
HTTP/2 设置
HTTP/2 客户端建连时会发送 SETTINGS 参数、窗口更新行为、流优先级和伪头部顺序。Akamai 的研究人员 2017 年在 Black Hat Europe 上介绍了 HTTP/2 客户端的被动指纹识别,说明这些值在不同浏览器和程序库之间有稳定差异。
TCP/IP 协议栈特征
再往下一层,连接最初几个数据包里的初始 TTL、TCP 窗口大小和选项顺序因操作系统而异。p0f 这类被动系统识别工具用这个方法已有多年。流量如果经过代理,这些特征描述的就是代理那台机器而不是你的——当它和浏览器声称的操作系统对不上时,本身就是一个信号。
由 IP 推出的属性
IP 地址能给出地理位置、ASN,以及该网段属于住宅宽带、移动运营商还是数据中心。这些不是浏览器属性,但指纹系统通常都会拿它们去和浏览器的时区、语言交叉比对。这一层可以参考我们的静态住宅 IP 指南和住宅代理与 VPN 的区别。
行为信号:和指纹并列,而不是指纹的一部分
打字节奏、鼠标轨迹、滚动方式、填表速度,通常被归入另一门学问——行为分析或机器人识别——而不算严格意义上的指纹。之所以要提,是因为风控系统会把它们和指纹放在一起评估:设备指纹再自洽,也解决不了看起来像脚本的操作行为。
这些信号是怎么被组合起来的
|
技术 |
类别 |
差异来源 |
稳定性 |
典型的不一致 |
|---|---|---|---|---|
|
属性与 Client Hints |
主动 |
浏览器、系统、设备设置 |
随更新变化 |
时区或语言与 IP 所在国家不符 |
|
Canvas |
主动 |
字体、栅格化、GPU、驱动 |
很高 |
同一会话内刷新后哈希变了 |
|
WebGL |
主动 |
GPU、驱动、系统 |
很高 |
声称的系统上不存在该显卡 |
|
音频 |
主动 |
音频栈实现 |
很高 |
每次加载值都不同 |
|
字体 |
主动 |
系统默认字体加已装软件 |
高 |
缺少所声称系统的默认字体 |
|
API 探测 |
主动 |
内核与版本 |
随更新变化 |
顶着 A 的 User-Agent、表现却是 B 内核 |
|
请求头与顺序 |
被动 |
内核与版本 |
随更新变化 |
顺序像另一个客户端 |
|
TLS 签名 |
被动 |
TLS 库 |
随更新变化 |
签名是 A 内核、User-Agent 是 B |
|
HTTP/2 设置 |
被动 |
HTTP/2 实现 |
随更新变化 |
参数像非浏览器客户端 |
|
TCP/IP 特征 |
被动 |
系统网络栈(或代理的) |
高 |
系统特征与声称的系统不符 |
从这张表能读出两点。
稳定性比唯一性更受重视。 想认出回访浏览器的追踪方,看重的是跨访问不变的值;随浏览器更新就会变的值权重更低,匹配也往往是模糊的,改了一项属性不至于认不出来。EFF 的 Peter Eckersley 在 2010 年的研究《How Unique Is Your Web Browser?》里两面都展示了:样本中大多数浏览器是唯一的,指纹也经常变化,但一个简单的启发式方法仍能把不少变化后的指纹关联回原来那个。
一致性会跨类别校验。 风控系统不只问「以前见过这台设备吗」,还会问主动层和被动层描述的是不是同一台机器。Canvas 和 WebGL 说是一个平台、TLS 和 HTTP/2 签名说是另一个内核、时区又和 IP 对不上——这种配置谈不上「罕见」,而是自相矛盾,比唯一性强得多的信号。
浏览器厂商怎么应对
浏览器厂商对抗指纹大致有三种策略,各有代价:
- 统一化——让所有用户看起来一样。Tor Browser 走的是这条路,统一窗口尺寸、字体和大量 API 返回值。前提是足够多的人使用完全相同的配置,任何自定义都会让人重新变得显眼。
- 随机化——给 Canvas、音频这类高熵输出加入微小噪声,使其无法作为跨站点的稳定标识。Brave 在其指纹防护说明中记录了这种做法。代价是噪声必须在同一会话、同一站点内保持稳定,否则噪声本身就成了信号。
- 限制——移除或粗化 API。Firefox 的指纹防护和 Safari 的高级指纹防护(Advanced Fingerprinting Protection)会限制或泛化脚本能读到的内容,Chromium 的 User-Agent 精简也把细节藏到了显式请求之后。
这三种策略都碰不到被动层。TLS、HTTP/2、TCP/IP 特征由实际发起连接的软件和网络决定,页面里改不了。
对广告运营环境意味着什么
如果你同时管理多个广告账户或客户环境,实操上的结论是「自洽」,而不是「隐藏」:
- 设置跟着来源走。 时区和语言应当由出口 IP 所在地区推导,而不是每个环境手工改。
- 声称的平台要如实。 环境声称的操作系统和浏览器内核如果不是实际运行的那个,WebGL、字体、TLS、HTTP/2 各层都会出现矛盾,没有哪个单项设置能补上。
- 稳定优先于变化。 每次启动都变的值,比永远不变的值更不像一台真机。
- 记住指纹管不到的层。 付款方式、手机号、找回联系人和操作行为,在浏览器看不到的层面把账户连在一起——见广告账户防关联:平台是怎么把账户连起来的。
以上都不改变广告平台政策允许什么。隔离且自洽的环境,是为了把本来就应当分开的账户、客户和团队成员分开,而不是用来绕过平台规则。工具层面,指纹浏览器与防关联浏览器一文讲清了这个品类能解决和不能解决什么,跨境投放环境搭建则讲各层的搭建顺序。
常见问题
最常见的浏览器指纹技术是哪种?
属性探测——读取 User-Agent、屏幕、时区和语言——最常见,因为成本低、不依赖特殊 API。叠加在它之上最常见的高熵技术是 Canvas、WebGL 和字体探测。
无痕模式能阻止浏览器指纹吗?
不能。无痕模式只是在关闭窗口时清掉 Cookie 和本地存储,设备的渲染、字体、硬件和网络特征都没变,指纹基本不受影响。
用 VPN 或代理能防止指纹识别吗?
它只改变由 IP 推出的那部分属性。主动式技术读到的仍是同一个浏览器和设备;而且时区、语言与新 IP 对不上时,浏览器反而更显眼。
哪些指纹技术在浏览器配置里改不了?
被动的网络层签名——TLS 握手、HTTP/2 设置和 TCP/IP 特征——由实际发起连接的软件与网络栈产生,浏览器配置里的设置改变不了它们。