← 返回博客

AudioContext 指纹是什么?音频指纹如何识别浏览器环境

核心结论:音频指纹不碰麦克风、不放声音,而是让浏览器在内存里静默渲染一段固定音频,把计算结果中的微小浮点差异当成设备签名。它和 Canvas、WebGL 同属渲染结果类指纹:IP 换不掉、清缓存清不掉,取值由设备与浏览器引擎决定。对多账号运营来说判断标准就两条:同一环境里这个值要长期稳定,不同环境之间要互不相同,MostMate 的 AudioContext 设置提供真实与随机两档,按这两条选即可。

「把音箱关掉、拒绝麦克风权限,网站的音频环节就拿我没办法了」——这是音频指纹最常见的一个误区。事实恰好相反:这套检测从头到尾没有任何声音进出。2016 年普林斯顿大学的研究团队在百万站点测量中把它纳入正式记录,之后它成了主流检测脚本的标配项,零权限、毫秒级完成、无痕模式下照常运行。MostMate 是一款指纹浏览器,为每个账号准备一套独立的浏览器环境,而音频指纹正是这类产品要处理的指纹参数之一。本文按四个问题把它讲透:网站看到了什么、这个数为什么稳定、它和其他参数怎么对齐、在指纹浏览器里该怎么配。

网站看到什么:一段从未播放的音频,换回一个数字

网站拿到的最终结果是一个浮点数:没有声音,也没有设备型号。主流检测脚本(以 FingerprintJS 的实现为代表,被大量开源库沿用)的流程固定五步:

  • 建一个离线音频上下文(OfflineAudioContext,MDN 文档):单通道、44100 Hz 采样率、约 5000 个采样点,折算约 113 毫秒音频,全程不经过扬声器。
  • 用振荡器生成一个固定 10000 Hz 的三角波,作为完全相同的输入信号。
  • 把信号送进动态压缩器(DynamicsCompressorNode),参数设得相当激进(阈值 -50 dB、拐点 40、压缩比 12),刻意把运算推到非线性区间,放大设备间的细微差别。
  • 调用 startRendering 在内存里静默渲染,这一步不产生任何可听见的声音。
  • 取输出缓冲区末段约 500 个采样点,求绝对值之和,得到 124.0434 这样一个数值。

这个数字就是音频指纹。计算发生在播放之前,所以系统静音、没接音箱都不影响结果;它也不访问录音设备,自然谈不上麦克风授权。浏览器指纹总览里这类参数通常一句话带过,值得单独写一篇的原因在于它的取值来源很特殊:值来自计算误差,而误差恰好稳定,这就是下一节的内容。

Iphey 检测结果页的音频指纹

检测站展示的通常是对这个原始值哈希后的十六进制串,长度各站不一;对照时看「同环境是否稳定、跨环境是否不同」即可,不必纠结串本身的格式。

为什么一个数字能当指纹:误差恰好是稳定的

关键机制在于:音频运算在不同设备上不逐位一致,而且这个不一致是可复现的。Web Audio 规范只定义了处理流程,并未要求所有实现算出逐位相同的结果;不同 CPU 的浮点精度、不同浏览器引擎对音频栈的实现,在取整和运算顺序上略有差别。单次运算的差异小到可以忽略,但信号要经过压缩器反复做非线性处理,再对数百个采样点累加,细微差别被逐步放大成可区分的数值。

普林斯顿那项研究给过实测规模:一万八千余台设备里,音频指纹收敛出七百多个不同取值,折合约 5.4 bits 的区分度——样本有限,这只是下限。对关联检测来说这个量级已经够用,因为真正的价值不在「值有多独特」,而在「值有多稳定」:同一台设备刷新一百次,结果纹丝不动;换一台机器、换一个浏览器引擎,值立刻不同。一个不需要权限、不可清除、刷新不变的信号,正是平台构建设备画像最喜欢的原料。

和其他参数怎么对齐:三条一致性原则

音频指纹和 IP 没有任何关系,它是纯设备侧信号;和 Canvas、WebGL 同属渲染结果类参数——网站把一道固定的计算题交给浏览器,等真实设备当场算出一个结果。判断一套环境配得合不合理,按三条校验:

  • 单环境稳定:同一环境每次渲染结果一致,是「这是一台正常设备」的前提。值忽变只说明参数被人动过,反而可疑。
  • 环境间互异:十个环境报出同一个音频值,等于在关联图谱上自己画圈。反过来说,「每个参数都调到满分」也是错误方向,随机化的风险在指纹随机化为什么不安全那篇里专门拆过。
  • 与浏览器引擎匹配:音频栈由浏览器引擎实现,取值随引擎和版本变化。环境声称的 UA、系统与实际引擎要对得上,浏览器大版本升级后取值自然更新,不需要人工干预。

三条原则合起来是一句话:音频指纹要的是「像一台真实设备该有的样子」,而不是「最好」。MostMate 把这套逻辑固化成四个设计原则,四个设计原则那篇讲过全貌,本文只落到音频这一项上。

怎么查自己的音频指纹:两次对比看穿问题

检测环节不需要任何插件,一个检测站加两次刷新就够。

第 1 步:任选一个检测站,找到音频指纹一项。BrowserScan 和 Iphey 都会把它单独列出,Iphey 的信任分怎么读,实战篇里有完整动线,可以配合Iphey 检测实战那篇一起用。

第 2 步:同一环境刷新两三次,盯住数值。值稳定不变是及格线;如果每次刷新都变,说明该环境的音频参数被设成了每次重算的模式,等于向平台广播「这台设备被人操纵过」。

第 3 步:换一个环境再测,对比两个值。两个环境的音频值应当不同;如果完全相同,回头查是不是复用了同一套指纹模板,模板复用是多账号关联最隐蔽的来源。

不同环境的检测结果对比

MostMate 里怎么配:真实与随机两档的取舍

MostMate 的创建环境表单把 AudioContext 单列在指纹设置区,提供真实与随机两档,右侧的指纹预览面板会实时显示当前取值,配完不用提交就能确认。两档的适用判断很直接:日常主力环境用真实——取值来自本机计算结果,天然稳定,和「单环境稳定」原则严丝合缝;批量新建一组环境时用随机——每个环境各自得到一个不同且内部稳定的值,满足「环境间互异」。

音频参数没有提供自定义档,这个设计本身值得注意:音频指纹的价值在于稳定,手工拼一个固定值反而丢了它的意义。选择真实还是随机时,真正要考虑的是这批环境的生成方式,而不是逐项去调参数;同族的 Canvas、WebGL 图像、ClientRects 用同一套思路判断,整套机制的分工在MostMate 是什么那页有完整说明。

MostMate指纹浏览器指纹设置区

常见问题

音频指纹需要麦克风或音箱权限吗?

不需要。整段音频在内存里离线渲染,不经过扬声器也不访问录音设备,静音状态、无音频设备的机器都能被照常采集。

清除 Cookie 或开无痕模式能躲开音频指纹吗?

不能。Cookie 存在本地可以清除,音频指纹由设备实时计算产生,两者是两套完全不同的机制,清缓存对它没有任何影响。

把 AudioContext 禁掉或固定成一个值,不是更安全?

方向反了。绝大多数正常浏览器都能跑音频运算,「禁用」和「人人相同的固定值」本身就成了突出特征,比一个普通值更容易被挑出来。

音频指纹什么时候会变?

换设备、换浏览器引擎、浏览器大版本升级时取值会变,这属于真实设备自然会发生的演进;同一环境日常使用中它应当长期稳定,频繁变化反而是异常信号。

结语

音频指纹的逻辑可以收成一句话:网站不放声音也能测设备,靠的是每台机器算数时稳定又细微的差别。理解了这一点,很多常见做法就讲得通了——为什么静音挡不住它,为什么满分参数反而危险,为什么批量环境的值必须互不相同。MostMate 把这类参数收敛成真实与随机两档,配合指纹预览面板,配完当场能看结果。如果你想亲手测一遍自己环境的音频指纹,可以下载 MostMate,用免费版建两个环境对比一下取值,多数认知盲区一次就能扫清。

MOSTMATE

让多账号安全管理更简单

从第一个账号开始,用 MostMate 建立更安全、更智能、更高效的多账号运营方式。

  • 环境彼此独立,身份逻辑一致。
  • AI 自动化 · 账号健康 · 团队运营
下载 MostMate