浏览器指纹检测:免费在线检测 Canvas、WebGL、AudioContext 及设备独特性

深度指纹与环境评估

浏览器指纹检测

浏览器指纹是通过收集设备的硬件、字体与图形渲染等特征生成的唯一识别 ID。

SHA-256 Hash 检测中...
篡改检测
检测中...
Bot 识别
检测中...
WebRTC 泄露
检测中...
唯一性评分
检测中...

硬件与基础环境

检测中...

                            

图形渲染

检测中...

                            

浏览器与安全

检测中...

                            

高级指纹

检测中...

                            

网络与 WebRTC

检测中...

                            

能力探针与环境

检测中...

                            

指纹综合研判与暴露面摘要

检测中...
检测中...
跨层网络协议栈指纹分析

结合浏览器端 Canvas/WebGL 唯一性与服务端底层 TCP/TLS/QUIC 报文指纹,全景评估防关联与追踪风险。

检测网络协议栈指纹 →

浏览器指纹与隐私追踪常见问题

深入了解浏览器指纹的生成原理、跨层矛盾识别、防关联浏览器伪装局限及无痕模式真相。

仅修改 User-Agent 字符串不仅无法实现有效伪装,反而极易产生致命的「跨层指纹矛盾」,被高级风控系统判定为主动伪造:一是应用层与传输层协议栈矛盾,若在 Windows 电脑上将 UA 改为 iPhone Safari,应用层声称是 Apple 移动端,但底层 TCP 握手包依然是 Windows 内核(无 TS 选项且选项排列为 MSS, NOP, WS, NOP, NOP, SACK_PERM),与 Apple 专属的 8 项选项序列完全相悖;二是 HTTP/3 与 HTTP/2 协议实现差异,Chromium、WebKit 和 Gecko 内核在 HTTP/3 单向流映射(Chromium 为 2:control,10:encoder,WebKit 为 2:control,6:encoder)以及 HTTP/2 伪头顺序(Chromium 严格为 m,a,s,p,非 Chromium 为 m,s,a,p)上存在硬编码差异。修改 UA 仅变更了一个请求头,却与底层传输层和协议层形成无法调和的冲突。

💡 详情可参考 代理匿名度检测 中的跨层协议栈推断分析。

防关联/指纹浏览器通常通过定制 Chromium 内核或注入 JavaScript Hook 脚本,重写 navigator 属性、向 Canvas/WebGL 图像注入细微随机噪点,并伪造屏幕分辨率与音频上下文来生成独立指纹。但高级风控依然能从深层捕获破绽:一是原型链与原生函数篡改痕迹,JS Hook 容易破坏 Function.prototype.toString、属性描述符(getOwnPropertyDescriptor)及原型链继承结构;二是着色器与底层硬件规律,注入的噪点虽改变了 Canvas 哈希,但物理 GPU 的浮点运算精度与着色算法规律依然存在,非自然的人工噪点反而形成了高区分度的「加噪特征」;三是底层网络协议栈未同步模拟,绝大多数指纹浏览器无法伪造宿主机的操作系统 TCP/TLS 握手特征。

不能。无痕模式(Incognito Mode)的设计初衷是防止「本地设备留下浏览痕迹」,而不是防御「远端服务器的特征识别」:无痕模式在关闭窗口后会自动清除当次会话的 Cookie、LocalStorage、浏览历史与表单缓存;但指纹追踪是通过 JavaScript 采集你设备的物理硬件与运行环境特征(如显卡型号、Canvas 渲染像素差异、WebGL 着色器参数、系统已安装字体、音频采样衰减、CPU 核心数与屏幕色彩深度等)。在无痕模式下,你的物理硬件、显卡驱动和浏览器内核未发生任何变化,远端服务器计算出的硬件指纹哈希与正常模式完全一致。

这不是误判,而是 iOS 平台的底层运行机制使然:一是 Apple App Store 政策约束,苹果应用商店审核指南明确规定,所有运行在 iOS/iPadOS 上的第三方浏览器(包括 Chrome、Edge、Firefox 等),其底层渲染引擎与网络层必须强制使用 Apple 提供的 WebKit / WKWebView 框架,禁止内置 Chromium Blink 或 Gecko 引擎;二是协议层实测验证,iOS 上的 Chrome(CriOS)在 HTTP/3 单向流映射中严格输出 WebKit 专属特征(2:control,6:encoder),与桌面及 Android 平台的 Chromium 特征(2:control,10:encoder)完全不同。因此 iOS 版 Chrome 本质上是基于 WebKit 封装的浏览器,识别为 WebKit 内核是完全准确的技术事实。

能,但有明确的条件和上限,而且这跟「身份认证」完全不是一回事。本站的身份恢复按四层加权:一是硬件锚定层(GPU 型号串、声卡基准延迟、媒体设备数量);二是系统高熵层(已安装字体列表、语音合成包列表);三是浏览器可变层(Canvas 渲染哈希、AudioContext 运算哈希);四是显示环境层(屏幕分辨率、时区)。四层累加之后,必须同时满足两个条件才允许认领一个既有身份:总分过线,并且至少命中一项高熵核心特征(字体列表、语音包、Canvas、Audio 四者之一)。第二个条件是刻意加的——GPU 型号、时区、屏幕分辨率这类公开低熵属性在同一批设备里大量重复,无论怎么组合都不允许单独构成身份;早期版本没有这道门时,仅凭这三项就足以把一台陌生设备错认成他人。此外硬件锚定层是一票否决:CPU 逻辑核心数不同、内存相差超过 4GB、声卡基准延迟相差超过 0.005 秒、最大触控点数不同,任一条成立即判为不同机器,根本不进入打分。

⚠ 这套机制的目标是让同一台设备的多次观测能稳定对齐,不是证明你是谁——它不构成身份认证,也不应被当作认证使用。

两者都属于「系统高熵特征」,共同点是不需要任何权限、页面上也看不到动静。AudioContext 指纹:在 OfflineAudioContext 里把一个振荡器(Oscillator)接进动态压缩器(DynamicsCompressor)离线渲染一段波形,读回浮点采样值再取哈希。同一张音频图在不同浏览器实现、不同数学库与浮点后端上会产生末位差异,全程静音、不播放声音。与它相邻但相互独立的是 AudioContext.baseLatency:这个值反映声卡输出缓冲区大小,由音频驱动与硬件决定,本站把它当作硬件锚定使用(双方差值超过 0.005 秒即判为不同机器),而不是当作身份哈希——两者来源不同,不要混为一谈。字体枚举指纹:逐个测量候选字体列表里每种字体渲染同一串文字的宽高,与回退字体不一致即说明该字体已安装。装了哪些字体高度依赖你装过什么软件(Office、Adobe 套件、开发工具、输入法各自会带一批字体),所以字体列表通常是全套特征里区分度最高的单项。

💡 稳定性上的差别在于变化的诱因:Canvas 与 Audio 哈希会随浏览器版本升级而改变(渲染栈和数学库一直在动),而字体列表只在你装卸软件时才变——这就是它权重最高的原因。

MSS(Maximum Segment Size)是 TCP 握手时通告的单包最大载荷,本站直接从你的 SYN 包里读到,不需要你安装或配置任何东西。把它加回 IP 与 TCP 头开销就还原出这条链路的 MTU:IPv4 加 40 字节,IPv6 加 60 字节。常见取值有明确含义:1500 是标准以太网/云主机裸链路;1492 是 PPPoE 拨号(DSL / FTTH 家庭宽带),PPPoE 头正好占掉 8 字节;小于等于 1420 说明流量被再封装了一层,典型来源是 WireGuard / Tailscale 一类的 VPN 隧道,或者经过 CDN 回源。

⚠ 关键在于:MSS 描述的是链路,不是设备。它只能告诉你「这条路径上存在封装」,单独并不能证明你在用代理——家庭宽带的 PPPoE 同样不是 1500。真正有意义的是矛盾:应用层声称的位置与链路特征长期对不上(比如声称本地直连、MSS 却稳定落在隧道区间),那才构成信号。详见 代理匿名度检测。

这是我们最在意的一类错误(误合并),防线有三道,任何一道拦下都不会认领。一是分桶硬隔离:候选身份先按操作系统平台与浏览器内核分桶,跨桶绝不比较——所以同一台机器上的两个不同内核浏览器,哪怕硬件参数完全一致,也永远不会被合并成同一个身份。二是硬件锚定一票否决:CPU 逻辑核心数、内存容量(容差 4GB)、声卡基准延迟(容差 0.005 秒)、最大触控点数,任一项在双方都测到且冲突,直接排除,不进入打分环节。三是核心特征准入:即便分数很高,只要没有命中任何一项高熵核心特征(字体、语音包、Canvas、Audio),也不允许认领——这道门专门用来挡「一堆公开低熵属性凑出高分」的情况。

⚠ 诚实说明:我们目前没有基于自然流量的误合并率实测值可以公布。这个指标要靠长期真实访问量才统计得出来,样本量足够之前给出任何数字都是不诚实的。