指纹浏览器

指纹浏览器:指纹在内核里改,不是靠注入 JavaScript

任何浏览器都会把自己所在这台机器的几百条小事交给网站:屏幕尺寸、字体列表、显卡、音频部分。这些凑在一起,足以把那台机器认出来,以至于从这台机器登录的第二个账号也会被当成同一个人。指纹浏览器存在的意义,就是让每个环境看起来像另一台机器。具体怎么做到的,才是各家产品之间的全部差别,而这恰恰是多数产品页跳过的部分。

免费开始
不同类型的工具把指纹写在哪一层 页面脚本跑在这个栈的最上层,所以注入在那里的值可能在被覆盖之前就已经被读走,而它下面的层根本碰不到。SigoLogin 写在下面那两层,页面脚本伸不到那里。 页面脚本 Web API:navigator、canvas、WebGL 浏览器内核(C++) 网络:请求头、Client Hints、握手 注入的 JavaScript 写在这里 SigoLogin 写在这里
页面脚本跑在这个栈的最上层,所以注入在那里的值可能在被覆盖之前就已经被读走,而它下面的层根本碰不到。SigoLogin 写在下面那两层,页面脚本伸不到那里。

你拿到的是什么

在内核里改

值在页面脚本运行之前就用 C++ 写好,不是事后往 Chrome 上注入。

字体三条路一起过滤

量宽度、按名字查、本地字体 API,三条路都从同一份列表作答,所以互相对得上。

每个环境一个代理

带认证的 HTTP 和 SOCKS5,旁边不漏 DNS,时区取自代理所在的国家。

每个环境一台真机

屏幕、核心数、内存和显卡都来自同一台量过的机器,绝不拼凑。

跨会话不变

同一个环境每次打开都画出同一个 canvas。会漂移的指纹比没有还糟。

量出来的,不是嘴上说的

在同一台机器上和真实 Chrome 对着量出来的,不是从设计上推出来的。

指纹浏览器是什么

指纹浏览器在一台电脑上跑很多个浏览器环境,并给每个环境一份自己的身份:自己的指纹、自己的 Cookie、自己的代理、磁盘上自己的文件夹。彼此之间什么都不共用,所以看到环境 A 的网站没有办法把它和环境 B 连起来。

浏览器指纹到底是什么

指纹不是一个值。它是浏览器对任何页面都能提的那些问题给出的一整套回答:User-Agent 怎么写、屏幕多大、报了几个 CPU 核心、哪些字体查得到、显卡驱动返回什么字符串、canvas 画出来的每一个像素是什么样。SigoLogin 为每个环境写十五个这样的表面,正是识别时最吃重的那几个。

危险不在某一条回答,而在组合。一台机器在 User-Agent 里说自己是 macOS,WebGL 渲染器报的却是 Direct3D 驱动,这是一台根本不存在的机器;而一台不存在的机器,比一台普通机器要好认得多。

为什么光有代理还不够

代理换的是请求从哪个地址过来。浏览器里面它什么都不换。走两个不同代理的两个账号,报的仍然是同一块屏幕、同一份字体列表、同一张显卡、同一批 canvas 像素,这些就足够把它们串到一起。

反过来也一样。一个环境报的是雅加达时区,地址却在美国,这在任何人读到指纹之前就已经自相矛盾了。SigoLogin 的时区和语言直接取自代理所在的国家,两者没法对不上。

两种做法,以及这为什么要紧

大多数指纹浏览器就是普通 Chrome,往每个页面注入 JavaScript 去覆盖 navigator、canvas 和 WebGL。这样做便宜,也能过掉简单的检测。它同样会留下痕迹。

注入 JavaScript 的工具

  • 被覆盖的函数不再像原生的:对打过补丁的方法调用 toString,返回的文本和真的不一样。
  • 注入发生在页面开始加载之后。脚本在第一行就读值,读到的是真实值。
  • JavaScript 之外的东西原封不动:请求头、Client Hints 的顺序、每次请求带上的语言。
  • 把一个字体从 JavaScript 里藏起来,并不能改变这个字体实际把文字画多宽。
  • 每多一个表面就要多一段注入脚本,而每一段脚本都是多一处可被察觉的地方。

SigoLogin

  • 值在页面脚本运行之前就已经用 C++ 写好,没有打过补丁的函数可供查找。
  • 从第一行起,内核回的就是这个环境的值。
  • Client Hints、请求头和 locale 在网络层设置,与页面能读到的 User-Agent 对得上。
  • 字体查找在字体引擎里就被过滤,所以量出来的宽度和声明的列表一致。
  • 十九个补丁编译进同一个 Chromium 152 版本,在浏览器启动之前就已生效。

我们这条路的代价值得直说:我们编译的是整个浏览器,所以跟上一个新的 Chrome 版本要花几天而不是几分钟,内核下载量大约 2 GB,而不是几兆。

对比

SigoLogin 逐个表面改了什么

每个环境的指纹都由一个种子生成,所以同一个环境每次打开都完全一样。指纹在两次会话之间漂移,比完全不伪装还可疑。所有值都取自同一个真实机型,字段绝不会在不同机器之间拼凑。

身份

  • platform
  • browser
  • locale

加了噪声

  • canvas
  • webgl
  • webgpu
  • audio
  • clientRects

机器

  • screen
  • hardware
  • battery

系统环境

  • fonts
  • mediaDevices
  • webrtc
  • network
每个环境都会写的十五个表面。它们全都取自同一个真实机型,所以各个回答彼此对得上;把不同机器的字段拼到一起,才是造出一台没人拥有的电脑的原因。

字体

已安装字体列表是页面能读到的最强信号之一,页面会从三条路去数它:量文字画出来有多宽、按名字要一个字体、通过本地字体 API。三条路都在内核里过滤,所以三个回答互相一致。

Windows 环境声明大约 300 个字体,是在真机上量的,不是从哪份列表抄来的。macOS 的字体集用同样办法量下来大约 1,185 个。这里有一条硬限制,我们宁可说出来也不藏着:内核能藏起一个字体,造不出一个字体。把操作系统一定会装的字体藏掉,就等于编出一台没人拥有的机器,所以这份列表是量出来的而不是猜出来的。

平台

Canvas、WebGL 和 WebGPU

canvas、音频和文字矩形的读数都会加上由环境种子推出来的确定性噪声:同一个环境每次画出的像素都一样,换一颗种子画出来的就不一样。WebGL 和 WebGPU 报的是同一张卡,因为页面可以两边都问一遍再对比。这项检查是我们撞见一个版本之后加的:那个版本里 WebGL 报的是 GeForce RTX 3060,WebGPU 适配器报的却是开发机上的 Intel 芯片。

屏幕、硬件和设备

屏幕尺寸、可用高度、像素比、CPU 核心数、报出来的内存、触摸点数,还有麦克风、扬声器和摄像头的名称,全都取自同一个机型。定成败的是小细节。在 macOS 上,Chrome 报的是物理核心数而不是线程数,报出来的内存上限在不同 Chrome 版本之间变过。这两处只要错一处,描述出来的就是一台没人卖的电脑。

WebRTC、时区和语言

WebRTC 是那个经典的泄漏口:即使走了代理,它也能把真实的本地地址报出去。有代理的环境上那条路是关掉的,真实地址没有地方出来,我们是把泄漏口堵上,而不是给它套一件代理的外衣。没有代理的环境如实作答,而不是装样子,因为关掉 WebRTC 的真机极少,关掉本身就是一个标签。时区和接受语言跟着代理所在的国家走,而不是跟着机器的设置。

代理与 DNS

TLS 与 HTTP/2 握手 即将推出

握手发生在 HTML 的第一个字节到达之前,页面脚本够不着它,正因如此它值得改,也正因如此靠注入 JavaScript 的工具碰不到它。这一块正在做,当前版本里还没有。我们宁可在这里写明它没做完,也不愿让你以为已经做好了。

我们怎么知道它管用

我们不想让你只凭设计就相信。每个表面都在同一台机器上和真实 Chrome 对着量,环境也拿去跑公开的检测站点。

对不上的地方,要么改掉,要么写下来,不抹平。这页上你不会看到的是分数:那些站点报的数字在两次访问之间会变,彼此也对不上,在这里印一个数就等于替别人的算法许诺。它们真正管用的地方,是帮我们找出自己的缺陷。

量也是抓我们自己错误的办法。字体过滤第一次发布时,一个检测站点翻了脸:本来读作可信的环境开始读作可疑。原因是过滤器把 Windows 11 自带的十一个字体也藏掉了,于是这个环境描述出一台不可能存在的 Windows 机器。把列表改对就没事了。这件事光靠推理找不出来,只有真的跑一遍才会露出来。

我们自己一个缺陷之前、期间和之后,一个检测站点的判定 一个检测站点对一个环境下的判定,在我们自己一个缺陷之前、期间和之后。字体过滤带着十一个 Windows 11 一定会装的字体一起藏掉就发布了,这等于描述出一台不可能存在的机器,判定就翻了过去。把列表改对,判定就回来了。这件事推理推不出来;跑一遍才跑出来。 字体过滤之前 出错期间 修好之后 可信 可疑 可信
一个检测站点对一个环境下的判定,在我们自己一个缺陷之前、期间和之后。字体过滤带着十一个 Windows 11 一定会装的字体一起藏掉就发布了,这等于描述出一台不可能存在的机器,判定就翻了过去。把列表改对,判定就回来了。这件事推理推不出来;跑一遍才跑出来。

指纹浏览器做不到什么

指纹只是众多信号中的一个,把其余的说清楚,比给一个我们守不住的承诺更值钱。

常问的问题

用指纹浏览器合法吗?

这个软件是一个浏览器,在自己的电脑上跑多个浏览器环境,这件事本身不违法。有规矩管的是你拿它做什么:你所在地的法律,以及你访问的网站的条款。我们不协助欺诈或冒充他人,我们的条款里写明了这一点。

Chrome 算指纹浏览器吗?

不算。Chrome 的环境会分开 Cookie 和历史记录,最明显的那条关联是去掉了,但每个环境报的仍然是同一块屏幕、同一批字体、同一张显卡、同一批 canvas 像素,因为它们都跑在同一台机器上。存储分开不等于身份分开。

这和 VPN 或代理有什么不一样?

代理或 VPN 换的是请求从哪个地址过来,仅此而已;浏览器描述的还是同一台电脑。两者是互相补充,不是互相替代。SigoLogin 要求每个环境配一个代理,并从那个代理所在的国家取时区和语言,让它们不会和地址相矛盾。

有免费套餐吗?

3 个环境免费,用的是和付费套餐同一套指纹引擎。免费套餐限的是环境数量,不是保护程度。付费套餐提高环境数量,也提高可激活的设备台数。

我的数据会上你们的服务器吗?

环境是你自己磁盘上的文件夹,里面的 Cookie、保存的登录信息和历史记录都留在那里。应用会上传一小组管理用的字段,好让你在这个站点上看到自己的环境,另外还有一份错误日志。把环境共享给队友是唯一的例外,因为对方坐在另一台机器前。隐私页把每一个字段都列了出来。

它能在哪些操作系统上运行?

Windows 10 和 11,以及 macOS 13 及以上,64 位。Intel 和 Apple silicon 都有对应版本。Linux 还没开始做。平台页写明了哪些已经有、哪些还没有。

继续读

这一页提出的问题,都有更长的答案。

不确定这是不是合适的工具?

问一个在答案里没有利害关系的助手。

怎么用

  1. 1

    安装并关联

    在 Windows 上安装,打开应用,按下把它登录到这里的那个按钮。内核只下载一次。

  2. 2

    建一个环境

    起个名字,挂上一个代理。指纹由一颗种子生成,从那以后就固定不变。

  3. 3

    打开它,然后一直打开

    每次打开都用同一个身份。把环境共享出去,队友在自己机器上打开的就是同一台设备。

3 个环境免费,引擎和付费套餐同一套

Windows 10 和 11,或 macOS 13 及以上,64 位。开始不用卡。

继续读