比特浏览器把设备的浏览器与操作系统里能读到的各种细节,抽成一组“指纹向量”,把数值型、集合型、字符串型特征分别标准化或哈希后,用欧氏距离、余弦相似度、Jaccard 系数、编辑距离等多种度量分别比对,再按权重把这些子相似度合并成一个总体相似度分值;系统还会结合阈值、置信区间、时间序列和机器学习模型来区分正常差异与异常关联,从而判断两个指纹是高度相似、部分相似还是独立环境。与此同时,它会检测不一致性(例如地理、时区与语言互相冲突)以发现伪造或篡改痕迹。

先从最简单的比喻开始:什么是“指纹相似度”
想像两个人的“履历卡”:姓名、身高、兴趣、发色、是否会弹吉他……把这些信息横向放在一张卡上,就是一个“指纹”。把两张卡逐项比对,记下相同或接近的项目,最后汇总成一个相似度百分比,这就是指纹相似度的直观概念。比特浏览器做的事,本质上是把浏览器和设备的各种属性当成“履历卡”的字段,然后用严格的数学方法做比对。
比特浏览器会收集哪些“字段”来构建指纹?
字段种类很多,按类型可以粗略分三类:
- 数值型/标量:屏幕分辨率、设备像素比(DPR)、CPU核心数、内存大小等。
- 集合型/列表:已安装字体、浏览器插件/扩展、支持的音视频编解码器、可用的媒体设备列表等。
- 字符串/结构化文本:User-Agent、Accept-Language、时区、Canvas / WebGL 指纹(转成字符串或哈希)、音频指纹等。
典型字段列表示例
| 字段 | 类型 | 说明 |
| UA(User‑Agent) | 字符串 | 浏览器和系统版本描述 |
| Screen/Viewport | 数值 | 物理分辨率与视口大小 |
| Installed Fonts | 集合 | 字体名列表,集合比对常用Jaccard |
| Canvas / WebGL Hash | 字符串/哈希 | 绘图差异产生的哈希值 |
| Audio Fingerprint | 字符串/数值 | 音频处理差异的特征值 |
从原始字段到可比的“向量”——预处理步骤
不同字段的原始形式差异很大,不能直接相加比较,需要统一处理:
- 标准化/归一化:把数值型字段(例如分辨率、内存)转换到同一尺度(例如归一到0–1),避免某项主导总分。
- 哈希或向量化:对字符串或Canvas/音频指纹用哈希(如SHA类)或将特征拆解成固定维度的向量。
- 集合编码:集合型字段(如字体集合)可转换为布尔向量或倒排索引,便于计算Jaccard或交集大小。
- 缺失值处理:对缺失或被禁止读取的字段,用默认值或专门的缺失标记,同时记入置信度。
- 时间序列与会话上下文:记录字段随时间的变化(如IP、时区、UA的微变),以便建立行为模式。
主要的相似度度量方法(按字段类型选用)
不同字段使用不同的度量比较合理,下面是常见搭配与直观理解:
数值型:欧氏距离与标准化差异
将数值字段取向量 x、y 后计算差的平方和再开方(欧氏距离),或者计算每项的绝对差的加权和。为了解读方便,常把距离转换为相似度(相似度 = 1 / (1 + 距离) 或者 1 – 归一化距离)。
向量角度:余弦相似度
用于那些能看作方向的特征向量(例如一组特征权重),表达两个向量方向的一致性,值在 -1 到 1 之间,越接近 1 越相似。
集合型:Jaccard 系数
集合相似度常用 Jaccard = |A ∩ B| / |A ∪ B|,非常适合字体或插件这样的“有哪些”的比较。
字符串型:编辑距离(Levenshtein)或哈希比较
短字符串(UA、语言标签)可用编辑距离衡量差异;复杂指纹(Canvas/Audio)通常先哈希,再比较哈希是否相等或哈希的海明距离。
把多项子相似度合并成一个“总体相似度”
这一步是关键,也决定误判率与可解释性。常见做法如下:
- 加权求和:给每个字段或字段组设权重(w_i),总体相似度 S = Σ w_i * s_i(s_i 为单项相似度),权重反映字段的稳定性与辨识力。
- 分段策略:把字段分成高权重(如Canvas、字体集合)和低权重(如屏幕尺寸)两类,先检查高权重是否足够相似,再考虑低权重。
- 机器学习融合:训练逻辑回归、随机森林或神经网络,把各子相似度和上下文特征作为输入,输出关联概率或分类(同一人/非同一人/可疑)。
- 置信度与阈值:给最终分数设阈值(例如 >0.85 认为高度相似,0.6–0.85 部分相似,<0.6 认为独立),并关联置信区间以控制误判。
实际流程:一步步把两条指纹比清楚
下面是一个典型的检测流程,读起来像检查清单:
- 采集两次指纹的原始字段与时间戳。
- 预处理:归一化数值、哈希Canvas/音频、编码集合、标记缺失。
- 分别对数值、集合、字符串类型用欧氏/余弦/Jaccard/编辑距离等计算子相似度。
- 根据权重合并子相似度,得到总体相似度分值。
- 结合上下文(IP、地理、会话时间、登录频率)和历史模型输出概率或分类。
- 如果分数在灰色区间,触发人工审查或更深层的行为分析。
举个更具体的例子(伪造的数字示范)
假定我们只用五个字段:UA(权重0.2)、Canvas(0.3)、Fonts(0.25)、屏幕分辨率(0.15)、时区(0.1)。两指纹的子相似度分别为:
- UA: 0.9
- Canvas: 0.95
- Fonts (Jaccard): 0.6
- Screen: 0.8
- Timezone: 1.0
总体 S = 0.2*0.9 + 0.3*0.95 + 0.25*0.6 + 0.15*0.8 + 0.1*1.0 = 0.87(大概),根据设定阈值可以判断为高度相似。
系统如何降低误报与漏报
单纯靠分数会有问题,常用的补救措施包括:
- 动态权重调整:根据字段稳定性与字段被篡改的易感性,动态调整权重。例如Canvas在某些环境易被统一化,权重就降低。
- 行为与时间序列结合:即便指纹相似,也会看登录时间、会话行为是否存在合理连续性。
- 阈值分层与人工回溯:对灰色区域的数据触发进一步验证(如二次验证或RPA记录抓取),减少误判。
- 模型训练作校准:用已知关联/不关联样本训练模型,并持续在线学习,适应新型伪装手段。
如何检测伪造或“冲突”特征
有些伪造会产生内部矛盾,系统会专门查这些矛盾来降低被蒙蔽的风险:
- 逻辑不一致:例如语言是中文,时区显示美东,IP 又来自亚洲——这类冲突会降低置信度。
- 异常分布:某些字段的值在总体人群中非常罕见,如果同一罕见值短时间内出现在多个账户上,可能是伪造或脚本批量生成。
- 指纹抖动检测:检测短时间内指纹项的频繁变动(比如Canvas哈希频繁变化),这往往是人为篡改或浏览器插件干预的痕迹。
机器学习在相似度判断里的角色
基于规则的合成分数方便理解,但机器学习可以提高准确性:
- 把子相似度、上下文特征和历史行为喂给分类器,输出关联概率。
- 用概率校准(例如 Platt scaling)把模型输出映射成可解释的置信度。
- 通过在线学习或周期性重训练应对新的浏览器版本或指纹伪装策略。
误差来源与局限性,现实中要谨慎解读分数
即便方法看起来严谨,也有固有局限:
- 环境变动导致的自然差异:升级系统、安装字体、切换分辨率都会改变指纹,可能把同一设备标成不同。
- 隐私防护工具的影响:脚本或扩展对Canvas、音频等指纹进行统一化或干扰会降低区分度。
- 数据采集失败或缺失:在某些受限环境下,浏览器拒绝暴露字段,会降低比较可靠性。
- 人为伪造的进步:伪装技术不断进化,需要系统不断更新特征与模型。
给用户(和管理员)的一些实用建议
- 如果你想让账号“独立”而不被关联,最可靠的是确保浏览环境在关键字段上有真实差异:IP/时区/字体/Canvas处理等。
- 不要仅靠单一手段(像改UA)来伪装,完整的指纹通常需要多项同步变化才能迷惑检测。
- 管理员在使用相似度判断做风控时,应把阈值与后续验证流程配合,例如二次验证或人工审查。
- 对灰色结果采用分阶段处理:先限制敏感操作,再采集更多行为数据进行二次判断。
常见问答(边问边想)
问:相似度高就一定是同一台机器吗?
答:不一定。高相似度表示高度相似,但要结合IP、行为和时间线才能更准确地判定是否同一物理设备或人为安排的相似环境。
问:哪些字段最有辨识度?
答:普遍认为 Canvas / WebGL、字体集合、插件/扩展组合和某些音频指纹的辨识度较高,但在特定环境下这些也可能被统一化或屏蔽。
好了,就想到这些点,写得有点像在白板上一步步画出来的说明。你要是愿意,我可以把上面的方法拆成更具体的实现细节(比如示例代码伪代码、各字段的典型权重建议、阈值调参策略),或者把风险控制流程写成易读的审查手册,随你挑一个继续往下细化。