AudioContext 指纹识别:鲜有人提及的浏览器追踪器

发布: (2026年3月19日 GMT+8 12:59)
6 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本内容(除代码块和 URL 之外),我将把它翻译成简体中文并保持原有的 Markdown 格式。谢谢!

概述

当我们谈论浏览器指纹识别时,Canvas 和 WebGL 通常是焦点所在。然而,Web Audio API(AudioContext)是另一种确定性的来源,且在不破坏现代网页应用的前提下,几乎无法伪造。

Web Audio API 允许网页应用在浏览器中直接合成和处理音频。它最初是为基于浏览器的游戏、合成器和音频工作站而设计的。由于不同的硬件配置(声卡、CPU、操作系统音频栈)在处理数学音频信号时会有细微差别,这个 API 可以用来生成独特的硬件签名。

Source:

AudioContext 指纹识别工作原理

该技术出奇地简单。跟踪器 不需要 访问你的麦克风——它会合成自己的声音并测量你的硬件如何处理该声音。

  1. 创建一个 OfflineAudioContext(或为兼容性使用 webkitOfflineAudioContext)。
  2. 生成一个确定性的音频信号(例如,10 kHz 的三角波)。
  3. 使用固定参数将信号通过动态压缩器。
  4. 离线渲染音频,提取生成的缓冲区中的一段,并计算一个简单的哈希值(例如,绝对样本值的总和)。

由于渲染是由底层音频栈以数学方式执行的,得到的哈希具有以下特性:

  • 确定性 – 在同一台机器上重复运行代码会得到相同的数值。
  • 硬件绑定 – 使用相同音频栈的不同浏览器(例如 Chrome 和 Edge)通常会产生相同的哈希,而不同的物理机器则会得到不同的值。
  • 静默OfflineAudioContext 在渲染时不播放声音,用户永远听不到任何声音。

示例代码

async function getAudioFingerprint() {
  const ctx = new (window.OfflineAudioContext ||
    window.webkitOfflineAudioContext)(1, 44100, 44100);

  // Oscillator
  const oscillator = ctx.createOscillator();
  oscillator.type = "triangle";
  oscillator.frequency.setValueAtTime(10000, ctx.currentTime);

  // Compressor
  const compressor = ctx.createDynamicsCompressor();
  compressor.threshold.setValueAtTime(-50, ctx.currentTime);
  compressor.knee.setValueAtTime(40, ctx.currentTime);
  compressor.ratio.setValueAtTime(12, ctx.currentTime);
  compressor.reduction.setValueAtTime(-20, ctx.currentTime);
  compressor.attack.setValueAtTime(0, ctx.currentTime);
  compressor.release.setValueAtTime(0.25, ctx.currentTime);

  // Connect nodes
  oscillator.connect(compressor);
  compressor.connect(ctx.destination);

  // Render
  oscillator.start(0);
  const buffer = await ctx.startRendering();

  // Simple hash
  let result = 0;
  const data = buffer.getChannelData(0);
  for (let i = 4500; i < 5000; i++) {
    result += Math.abs(data[i]);
  }

  return result.toString(); // Unique AudioContext hash
}

为什么这对反欺诈系统很重要

许多打击欺诈或滥用的平台都会进行 AudioContext 检查。如果两个账户的 AudioHash 相同,但 IP 地址不同,系统可以推断这些账户来自同一台物理机器:

Account A: IP 104.22.x.x | AudioHash 124.04183...
Account B: IP 192.42.x.x | AudioHash 124.04183...

匹配的哈希会立即触发标记。

缓解尝试

  • 阻止 Web Audio API – 完全禁用该 API 的扩展会使用户显得与众不同,因为几乎所有普通用户都会允许它。
  • 添加随机噪声 – 一些隐私工具会向渲染的缓冲区注入噪声,从而破坏确定性。高级脚本(例如 CreepJS)可以检测到噪声注入本身,进而将其转化为另一种指纹识别信号。

两种方法都会增加唯一性,而不是降低唯一性。

更稳健的方法

一个稳健的解决方案必须确保每个浏览器配置文件生成一个 稳定且独特 的 AudioContext 哈希:

  • 在单个配置文件内保持一致(表现得像普通电脑)。
  • 在不同配置文件之间保持不同,即使在同一台实体机器上也是如此。

实现此目标需要在浏览器引擎层面进行修改,对每个配置文件的音频栈进行隔离。

Solution: FireKey

FireKey 是一个基于 Chromium 的防检测浏览器,在引擎层面为每个配置文件隔离 AudioContext、Canvas、WebGL 以及超过 50 项其他参数。它目前以免费公开测试版形式提供,您可以使用它对抗诸如 browserleaks.com 等工具来测试您的隔离设置。

0 浏览
Back to Blog

相关文章

阅读更多 »