常见的浏览器指纹及其工作原理

万维网的核心技术之一是 JavaScript。JavaScript是一种脚本语言,每个浏览器都有自己的JavaScript 引擎来执行从网站下载的代码。网站可以使用常见的 JavaScript 功能获取大量用户数据。使用 navigator 对象,网站可以获取有关访问者的操作系统、User-Agent、系统语言、CPU 架构、浏览器类型/版本等的信息。

UA

User-Agent 是客户端(通常是 Web 浏览器)在发出 HTTP 请求时发送给服务器的 HTTP headers的重要组成部分。它提供有关客户端的信息,包括软件、操作系统的详细信息,有时还包括设备类型。User-Agent headers 允许服务器根据客户端的特征定制其响应,从而优化特定浏览器或设备的内容交付。

HTTP User_Agent

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36

以上就是 User-Agent 字符串,可以分解如下:

  • Mozilla/5.0:表示兼容性和一般平台信息。
  • (Macintosh; Intel Mac OS X 10_15_7):指定操作系统。
  • AppleWebKit/537.36(KHTML,如Gecko):标识浏览器引擎。
  • Chrome/131.0.0.0 Safari/537.36:详细说明浏览器及其版本。

值得注意的是,包括 Chrome 在内的主流浏览器都朝着减少用户代理字符串中的信息的方向迈出了重要一步。这一变化旨在通过提高根据设备和浏览器详细信息识别和跟踪用户的难度,更好地保护用户隐私。随着隐私保护的提高和详细用户代理信息的减少,从浏览器指纹中获取具体细节(如确切的 Android 版本和设备型号)变得越来越困难,尤其是在较新版本的 Chrome 中。

https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator

https://browserleaks.com/client-hints

Cookie

HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据。浏览器会存储 cookie 并在下次向同一服务器再发起请求时携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器——如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

Cookie 主要用于以下三个方面:

  • 会话状态管理:如用户登录状态、购物车、游戏分数或其他需要记录的信息
  • 个性化设置:如用户自定义设置、主题和其他设置
  • 浏览器行为跟踪:如跟踪分析用户行为等

Cookie 曾一度用于客户端数据的存储,因当时并没有其他合适的存储办法而作为唯一的存储手段,但现在推荐使用现代存储 API。由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器 API 已经允许开发者直接将数据存储到本地,如使用 Web storage API(localStoragesessionStorage)或 IndexedDB 。

Cookie 的生命周期可以通过两种方式定义:

  • 会话期 Cookie 会在当前的会话结束之后删除。浏览器定义了“当前会话”结束的时间,一些浏览器重启时会使用会话恢复。这可能导致会话 cookie 无限延长。
  • 持久性 Cookie 在过期时间(Expires)指定的日期或有效期(Max-Age)指定的一段时间后被删除。

IP 地址

IP 地址有两种类型:IPv4 和 IPv6。两者之间存在一些差异:

IPv4 IPv6
四组1到3位数字组成,如192.168.1.1 八组4个十六进制数,每组之间用冒号:隔开,如:2001:0db8:85a3:0000:0000:8a2e:0370:7334
43亿个地址 7.9x10^28 个地址
地址可以重复使用 每个设备都有唯一的地址

尽管互联网最终将完全使用 IPv6,但 IPv4 仍被广泛使用。本文重点介绍 IPv4。

每个 IP 都由四个用句点分隔的数字组成。这些数字的范围是 0 到 255,因此 IP 地址的总范围是 0.0.0.0 到 255.255.255.255。

还有允许使用私有网络的私有 IP 地址。这些地址通常用于住宅、办公室和企业环境中的局域网 (LAN)。此外,各个国家/地区都有特定的 IP 地址范围。

当您使用计算机浏览互联网时,您需要依靠复杂的服务器网络来使其正常运行。当你在地址栏中输入网站地址(google.com)时,浏览器会进行 DNS 解析,解释该网站并通过 HTTPS 请求将其显示给你。

如果您更换位置或使用不同的 Wi-Fi,您的 IP 地址可能会与之前不同。但是,您的 IP 地址是一个唯一标识符,可用于进一步了解您的兴趣和习惯,这些信息可能会在您不知情的情况下被存储和出售。

IP地址作为浏览器指纹的一部分,它为用户的设备提供了一个全球唯一的标识符。网站可以利用这个信息来定位用户、定制内容,并进行安全检查,比如识别异常登录行为或防止欺诈。IP地址还能帮助网站执行合规性控制,例如某些网站会禁止一些国家的IP访问。

https://browserleaks.com/ip

时区

网站可以通过两种方式检测您的时区:

  1. 您的计算机的时区:网站可以通过运行JavaScript代码来获取用户的本地时间和时区。
  2. 您的 Internet 协议 (IP) 地址定义的时区:通过IP地址可以了解一个网站访客来自于哪个国家、哪个城市,那么用户所在国家的时区、以及当地时间也就可以推算出来。

当用户访问网站时,如果提供的时区信息与其他浏览器指纹信息(如IP地址推断的地理位置)不一致,网站可能会检测到这种不一致。这可能会引起网站的注意,特别是那些有防欺诈系统的网站,它们可能会寻找这类不匹配作为异常行为的指标。

因此,在使用指纹浏览器修改与“时间”相关指纹的时候,要注意与IP地址匹配。

https://browserleaks.com/ip

WebRTC

Web 实时通信 (WebRTC) 是一套用于点对点 Web 通信的开源协议。它使用 HTML5 和其他 Web 标准来促进音频和视频通信、文件共享和屏幕查看。如果您在浏览器中设置了代理,基本上所有流量都会经过它。不幸的是,网站可以使用 WebRTC 技术来请求您的真实私有和真实公共 IP 地址,因此尽管您使用了代理,您的真实 IP 地址仍可能泄露。

您可以在此处查看您的公共和私有 IP 地址:https://browserleaks.com/webrtc

您的公共 IP 应与您的真实(或代理/VPN)IP 地址相匹配。私有 IP 是您内部网络中使用的 IP。在大多数情况下,您从路由器收到的 IP 是 192.168.xx,但如今现代浏览器会自动屏蔽它并显示如下值:09bc1faf-2c6d-4d89-9f9e-8b3b2ba58043.local

地理位置

网站可以使用名为 Geolocation API 的 JavaScript 技术来查明您访问网站时所在的位置。网站一般有两种不同的方式来获取用户的位置:

  • 获取 IP 的位置

网站可以根据 IP 判断位置。这些信息存储在数据库中。Google 地图正在使用这种技术。打开地图后,默认位置将是从 IP 得出的城市。

https://www.iplocation.net/

  • 使用 Geolocation API

您授予网站请求您位置的权限后,网站就可以获得非常准确的位置。如果您允许网站使用 Geolocation API 访问您的位置,并且它与基于 IP 的位置对齐,他们会更加信任您。

如果您访问https://browserleaks.com/geo,该网站可能会要求您获得获取位置信息的权限。如果您阻止它,地图将不会显示您的位置。

语言&界面语言

浏览器语言通常指的是用户在浏览器设置中选择的首选语言,这决定了用户在访问多语言网站时所看到的默认语言版本。这些信息通常通过HTTP请求的“Accept-Language”头部发送给网站的服务器,它可能包含一个或多个语言,通常按照用户偏好的顺序排列。

通常:

language返回一个字符串,表示用户的首选语言,通常是浏览器 UI 的语言。

languages返回一个字符串数组,表示用户的首选语言,按优先级排序。

https://browserleaks.com/javascript

分辨率

每个显示器都有自己的规格,例如屏幕尺寸、刷新率、显示类型、最大分辨率等。网站可以使用 JavaScript 请求这些数据。他们甚至可以检查您的浏览器窗口大小,网站将知道如何根据用户的屏幕尺寸以最佳性能显示其内容。同时网站也可以根据屏幕尺寸推断设备类型。有些设备具有特定的屏幕尺寸,例如不同手机的屏幕

屏幕分辨率不仅包括物理屏幕的实际像素数,还包括浏览器窗口的当前视图大小。例如一块显示器的分辨率为1920*1080,浏览器的可视区域可能并不会占满整个屏幕,分辨率就只有1920*1050。因为浏览器还有工具栏、标签栏等等。因此,物理屏幕分辨率与浏览器的可视区域尺寸也能成为一种浏览器指纹,因为不同的用户采用的显示设备不同,当网站将屏幕分辨率与其他指纹结合在一起的时候,每个用户的指纹就会显得更加独特。

https://browserleaks.com/javascript

字体

字体指纹识别技术依赖于测量填充有文本或单个 Unicode 字形的 HTML 元素的尺寸。然而,网络浏览器中的字体渲染可能受到多种因素的影响,导致这些测量值存在细微差异。

网站会用 CSS 和 JavaScript 技术来确定机器上安装的字体。字体度量测试会强制您的浏览器使用机器上安装的默认字体(通常是 Arial)和另外约 150 种不同的字体绘制特定文本。网站可以通过测量字符串的宽度来检查每个文本占用多少空间。当无法使用网站定义的字体编写文本时(因为您的机器上未安装该字体),它将使用默认字体显示。或使用 FontFaceSet API,列出用户设备上可用的字体。

现代操作系统附带了大量预装的字体,因此,仅检查 150 种字体的测试可能不会显示两台具有两组实际上不同的字体的计算机之间的任何差异,因为现代浏览器无法获取已安装字体的明确完整列表。如果两台计算机具有相同的操作系统,网站很难确定两次访问是否来自同一台计算机。但是,字体指纹识别可用于确定访问浏览器的操作系统。如果您想使用某些指纹浏览器,则需要确保您的字体指纹与网站可以使用其他指纹识别技术读取的操作系统一致。例如,如果你想要一个看起来自然的中文浏览器窗口,那么网站应该会看到你的操作系统上安装了中文字体。

https://browserleaks.com/fonts

Canvas

Canvas 是一种在浏览器中渲染二维图形和动画的的技术。Canvas API 提供了一个通过 JavaScript 和 HTML 的 <canvas> 元素来绘制图形的方式。在一些网站上,JavaScript 引擎会检查用户的系统是否支持 Canvas 渲染;如果支持,则会显示带有自定义 2D 形状或文本的图像。

网站可以通过在Canvas上绘制复杂的图形和文字,然后分析这些内容在您电脑上的具体显示方式,因为每台电脑显示这些图形和文字的细节都有微小的不同,如轮廓、阴影、颜色和像素排列方式的细微差异。这些微小的差异反映了您电脑上的一系列设置和硬件特性,比如屏幕分辨率、使用的字体和图形处理器等。正因为每个人的电脑配置都是独一无二的,因此 Canvas 指纹识别可以生成唯一标识符(哈希码),可用作网站的标识符,从而实现设备跟踪或确定用户的浏览器并检测反检测浏览器。

https://browserleaks.com/canvas

WebGL图像&WebGL元数据

WebGL 是一种在浏览器中渲染三维图形的技术。WebGL API是一种可在任何兼容的 Web 浏览器中无需使用插件即可渲染高性能交互式 3D 和 2D 图形的 JavaScript API。在一些网站上,JavaScript 引擎会检查用户的系统是否支持 WebGL;如果支持,则可以显示具有自定义 3D 形状或动画的图像。

网站可以通过 API 请求 Unmasked Vendor 和 Unmasked Renderer,不同的 GPU 渲染相同的图像时会有细微的差别,即使您为每个浏览窗口设置不同的代理,但如果 WebGL 哈希保持不变,网站将能够检测到您的多个帐户或异常行为——很明显这些浏览器窗口实际上都在同一设备上运行。因此具有 WebGL 指纹识别的网站可以生成唯一标识符(哈希码),可用作网站的标识符,从而实现设备跟踪或确定用户的浏览器并检测反检测浏览器。

https://browserleaks.com/webgl

WebGPU

WebGPU 是 WebGL 的继任者,为现代 GPU 提供更好的兼容、支持更通用的 GPU 计算、更快的操作以及能够访问到更高级的 GPU 特性。WebGPU API 使 web 开发人员能够使用底层系统的 GPU(图形处理器)进行高性能计算并绘制可在浏览器中渲染的复杂图形。WebGPU 还可以收集设备信息,这些信息可用于创建唯一的浏览器指纹。通过比较硬件渲染工件和性能差异,指纹识别脚本可以识别和跟踪整个 Web 上的单个用户。

https://browserleaks.com/webgpu

ClientRects

在您上网浏览网页时,比如阅读文章、在线购物,或者观看视频,浏览器会不断地计算和重新计算页面上各种元素的位置,以确保内容正确显示。这些计算结果可能因为您的设备类型、浏览器、屏幕大小,甚至是当前窗口大小的不同而有所差异。

这些看似普通的布局信息,实际上可以被网站用来生成一个关于您浏览器的独特描述,即ClientRects 指纹。网站通过使用 JavaScript 来执行 Web 浏览器指纹识别getClientRects,计算呈现的 HTML 元素的边界矩形的精确像素位置和大小。

https://browserleaks.com/rects

AudioContext

AudioContext API 是浏览器提供的一个工具,它能处理和生成音频,让网站能播放和修改声音。

音频指纹利用 AudioContext API 的功能通过设备的浏览器和音频堆栈传输和分析细微的音频信号。音频指纹识别的独特之处之一是它不需要传统的音频播放或录制。相反,它专注于分析设备的音频堆栈对传输信号的响应。通过检查 AudioBuffer 值(与缓冲区大小和数据格式相关)和 DynamicsCompressor 设置(例如压缩比和阈值)等参数,音频指纹识别可以根据每个设备独特的音频处理特性为其生成独特的标识符,即“指纹”。

媒体设备

媒体设备指纹是网站利用MediaDevices API收集用户设备上的音频和视频硬件信息,包括设备的类型、标签名称、分辨率(摄像头)、频率响应(麦克风)以及连接类型(如USB或蓝牙)。

因为,这些信息通常相对稳定,用户不太可能频繁更换这些硬件,所以每个用户的指纹就会显得非常独特。因此会被用作浏览器指纹。然而,现代浏览器出于隐私考虑,通常需要用户授权,网站才能获取到这些信息。

SpeechVoices

Speech Voices 指纹是基于您设备上可用的语音合成选项。这些选项由您的操作系统和浏览器提供,并且可能包括不同的语言、口音和发音性别。因为每个人的电脑配置可能不同,所以这些语音选项也各不相同。

网站可以通过Web Speech API获取这些信息,并将其用作一种识别手段,因为不太可能有两台设备具有完全相同的语音合成设置。这就像是一个数字化的声音库,能够反映出用户的设备特征,从而成为用户独特的数字指纹的一部分。

硬件并发数

硬件并发数指的是计算机的处理器核心数量,它是一个表示设备能够同时处理多少计算任务的指标。在浏览器中,这个信息可以通过JavaScript的 navigator.hardwareConcurrency 属性来获取,它返回一个代表用户设备上逻辑处理器的数量的整数。

设备内存

网站可以检测到访问者设备的内存大小。这是通过JavaScript的 navigator.deviceMemory API 实现的,它可以返回设备的大致内存大小。如2的倍数:2,4,6,8。

您可能会疑惑,现在的电脑设备越来越强大了,内存早就超过8GB了,为啥网站只能检测到8呢。这是因为为了减少指纹识别,保护内存非常低或非常高的设备的所有者的隐私,所以该API接口获取到的值最大只有8。

Do Not Track

"Do Not Track"(DNT)是一种由用户设置的浏览器标志,用来告知网站用户不希望被跟踪。尽管DNT设置的初衷是为了增强用户的隐私保护,但它也可以被用作浏览器指纹的一部分。

用户可以在浏览器的隐私设置中启用这个选项,这样每次浏览器向网站发送请求时,都会包含一个DNT头部,值通常为1(表示用户不希望被跟踪)。

当网站收集用户的浏览器信息时,DNT设置可以作为区分用户的一个特征,因为并不是所有用户都会调整这个设置。因此,如果大多数用户没有启用DNT,而某个用户启用了,这个信息就可以与其他浏览器指纹信息组合使用,从而增加了识别该用户的可能性。

https://browserleaks.com/donottrack

端口扫描保护

开启端口扫描保护功能,这将阻止网站探测您打开了哪些端口。该功能将阻止所有端口被扫描。但您也可以将一系列特定的端口列入白名单,供网站扫描。在计算机科学中,端口是通信端点。当应用程序在计算机上运行时,它会打开一个端口,这个端口相当于该应用程序与其他应用进行交互的地址。

例如:

TeamViewer会打开端口:80、443和5938(TCP)

RDP(远程桌面协议)会打开端口:3389(TCP/UDP)

端口号可以是0到65535之间的任何数字。

网站可以通过web sockets扫描本地开放的端口,探测某台电脑打开了哪些端口,从而了解用户正在运行哪些程序。eBay和Amazon都利用了这样的技术手段。

硬件加速

硬件加速是指程序使用计算机硬件来执行某些功能,其效率比软件高。硬件的设计目的是比单独在 CPU 上运行的软件更快地执行某些功能。

在 Chrome 中,硬件加速利用计算机的图形处理单元 (GPU) 来处理图形密集型任务,例如播放视频、玩游戏或任何需要更快数学计算的任务。处理特定任务可让您的 CPU 有机会不知疲倦地处理其他所有任务,而 GPU 则负责处理其设计运行的进程。

虽然在大多数情况下这听起来不错,但有时硬件加速可能会导致 Chrome 滞后、冻结或崩溃——甚至可能导致笔记本电脑的电池消耗得更快。由于每个人的电脑都略有不同,问题可能出在与其相关的 GPU 或驱动程序上。如果您怀疑硬件加速是罪魁祸首,最好的办法是禁用它,看看是否能解决问题。

启动参数

Chrome内核启动参数参考:https://peter.sh/experiments/chromium-command-line-switches/

Firefox启动参数参考:https://wiki.mozilla.org/Firefox/CommandLineOptions

LocalStorage

Web Storage API 提供了浏览器可以存储键/值对的机制,其方式比使用 cookie 更直观。

localStorage 为每一个给定的源(origin)维持一个独立的存储区域,该存储区域在页面会话期间可用(即只要浏览器处于打开状态,包括页面重新加载和恢复),即使浏览器关闭并重新打开也仍然存在。

  • 存储的数据没有过期日期,只能通过 JavaScript、清除浏览器缓存或本地存储的数据来清除。
  • 存储限额是cookiesessionStorage 两者之间的最大值(最大 5MB)。

IndexedDB

IndexedDB API是一种底层 API,用于在客户端存储大量的结构化数据(也包括文件/二进制大型对象(blobs))。该 API 使用索引实现对数据的高性能搜索。虽然 Web Storage 在存储较少量的数据很有用,但对于存储更大量的结构化数据来说力不从心。而 IndexedDB 提供了这种场景的解决方案。

IndexedDB 是一个基于 JavaScript 的面向对象数据库。IndexedDB 允许你存储和检索用索引的对象;可以存储结构化克隆算法支持的任何对象。你只需要指定数据库模式,打开与数据库的连接,然后检索和更新一系列事务