浏览器指纹控制,在引擎层面实现
浏览器指纹由几十个值组成,它们必须彼此说得通。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 | 品牌、版本、平台、位数和型号,均来自引擎 |
| TLS | ClientHello 跟随身份画像声明的 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 可免费使用一个浏览器。无需信用卡。