跳到正文
身份 · 编译进引擎

浏览器指纹控制,在引擎层面实现

浏览器指纹由几十个值组成,它们必须彼此说得通。Clearcote 从一个种子派生出这些值,并通过 Chromium 自身的代码路径提供,因此页面读取 GPU、屏幕和字体时,得到的答案都属于同一台合理的机器,语言和时区也与之匹配——主框架、iframe 和 worker 中都是如此。

种子身份画像和按站点噪声在所有套餐中都可用,包括开源版构建。

一个种子,一个身份

import { launch } from "clearcote";

// the same seed returns the same identity; a new seed is a new one
const browser = await launch({
  fingerprint: "account-42",
  timezone: "America/New_York",
  acceptLanguage: "en-US,en",
});

亮点

一个种子,一台机器

--fingerprint 会派生出一个相互关联的身份画像:CPU 与内存档位、屏幕、色深、GPU、语音、编解码器和媒体设备,彼此匹配。

按站点,而非全局

Canvas 和 WebGL 噪声按站点派生,借鉴了 Brave 的 farbling 模型,因此这些哈希在不同站点之间各不相同;而身份画像上报的硬件在所有站点都保持一致,就像一台真实的机器。

每个 realm 中都是原生实现

这些值来自 C++ getter,因此无论是 toString、属性描述符,还是新建的 iframe 或 worker,看到的都是原生代码和同一个结果。

一块前后自洽的 GPU

WebGL 的 vendor 和 renderer 在整个会话期间保持不变,getParameter 限制值在本机能够支撑的范围内跟随该 GPU,WebGPU 描述的也是同一个适配器。

导入一台真实机器

加载一份从真实 Chrome 采集的配置,或者从公开的配置库中选一份,它的值会取代合成值。

在要紧处调低力度

lightStealth 只改变安全的元数据。fingerprintNoise: false 保留身份,但在噪声本身会被计分的场合去掉 canvas 和 WebGL 噪声。

为什么一致性胜过巧妙的数值

检测很少取决于某一个不寻常的值,它找的是矛盾:像素对不上的 GPU 字符串、与 IP 不符的时区、上报的硬件与页面不同的 worker。所以 Clearcote 要回答的问题不是伪造哪些值,而是如何让所有值彼此一致,并与底层机器保持一致。

种子是确定性的。同一个种子每次启动都生成同一个身份,就像一位回访的访客;换一个新种子,就生成一个全新的身份。Canvas 2D 和 WebGL 回读会带有一个按种子、按站点的小扰动,因为真实机器之间的回读结果本来就有差异。渲染出的音频和 client rects 则刻意保持精确:扰动它们会产生任何真实浏览器都不会输出的值,这比两个配置共用同一个哈希更显眼。指纹文档逐一介绍了每个检测面。

有些声明是主机无法支撑的,文档对此直言不讳。与真实窗口不符的屏幕尺寸,或者本机实际上渲染不了的 GPU,一拿主机来验证就会露馅。正因如此,lightStealth 保留真实屏幕,屏幕覆盖需要主动开启;也正因如此,才有了 canvas 桥接,推荐的起步配置也是变化更少,而不是更多。

覆盖范围

检测面Clearcote 的做法
Canvas 2D 与 WebGL 回读按种子、按站点的噪声,控制在真实机器之间的自然差异范围内
WebGL renderer 与限制值会话内恒定的 GPU,在本机能够支撑的范围内使用该 GPU 的参数限制
WebGPU与 WebGL 使用同一个适配器,因此默认情况下两个 API 报出的是同一块 GPU
音频AudioContext 的采样率和延迟跟随身份画像;渲染出的采样保持精确
字体与语音身份画像的字体集和语音集
硬件与屏幕hardwareConcurrency、deviceMemory、像素比、色深、触控点数,以及身份画像的屏幕和工作区(lightStealth 保留真实屏幕)
区域设置与时间Accept-Language、navigator.language、Intl 与时区彼此一致
User agent 与 client hints品牌、版本、平台、位数和型号,均来自引擎
TLSClientHello 跟随身份画像声明的 Chrome 版本
自动化痕迹navigator.webdriver 以及各种无头模式特征

完整的开关列表及各自的作用,见指纹参数参考。

典型用途

隐私

原版浏览器上报的是你自己机器的那组值。身份画像上报的则是一台合理、一致、但不属于你的机器。

隔离身份

给每个账号分配各自的种子,让账号之间不共享渲染指纹。

测试依赖指纹的代码

观察你自己的反欺诈、分析或个性化代码,在不同硬件、GPU 和区域设置下会如何反应。

指纹识别研究

用可控、可重复的输入,复现测试页面测量到的结果。

Clearcote 专为隐私保护、测试、研究和合法自动化而打造。你须对自己的使用方式负责,并遵守所访问网站的条款。

哪些套餐包含此功能

种子身份画像、按站点噪声、元数据覆盖和 TLS 匹配在所有套餐中都可用,包括开源版构建。授权版构建(GitHub 免费版即可使用)额外提供一些更精细的开关、行为真实感,并率先支持新的 Chromium 大版本;Pro 并不会解锁任何 GitHub 免费版所没有的伪装功能。

对比套餐

常见问题

什么是浏览器指纹伪装?

修改网站用来识别浏览器的那些值:GPU、屏幕、字体、硬件、语言等等。大多数工具靠覆盖 JavaScript 属性来实现,Clearcote 则在 Chromium 引擎中实现,因此这些值来自原生代码,并且彼此一致。

为什么不用 JavaScript 指纹伪装工具?

被覆盖的函数会暴露自己:toString 返回的是覆盖代码的源码,而不是 [native code];属性描述符会变;新建的 iframe 或 worker 还会拿回原始值。Clearcote 没有这样一层可供发现。参见检测原理。

同一个种子每次都会得到相同的指纹吗?

是的。种子会确定性地派生出身份画像和按站点噪声,所以同一个种子每次启动都是同一个身份,换一个种子就是一个新身份。

同一台机器上的两个账号,能有不同的 canvas 指纹吗?

可以,只要种子不同:canvas 和 WebGL 的回读结果因种子而异。导入的设备配置只改变上报的值,不改变渲染,所以要做渲染隔离,请为每个账号使用单独的种子。渲染出的音频和 client rects 来自底层机器,同一台机器上的所有身份都一样。

这能让自动化无法被检测吗?

没有任何工具能做出这种承诺,我们也不会。Clearcote 消除的是伪装浏览器通常带有的那些矛盾,而行为、IP 信誉以及你的使用方式依然很重要。指纹检测会告诉你自己的配置看起来是什么样子。

在文档中深入了解

相关功能

试用 Clearcote

可直接接入 Playwright 与 Puppeteer,一直到 TLS 握手都保持一致,并提供开源构建作为起点。

通过 GitHub 可免费使用一个浏览器。无需信用卡。