Saltar al contenido principal
es/blog/obscura/research/audio-fingerprinting/

obscura/research/audio-fingerprinting

2 min de lectura

Resumen

El fingerprinting de audio usa la Web Audio API (AudioContext) para generar un identificador único basado en cómo el hardware y software de audio del dispositivo procesan una señal generada.

Mecanismo

  1. Crear un AudioContext
  2. Generar una señal de oscilador (onda sinusoidal a una frecuencia específica)
  3. Procesar mediante DynamicsCompressorNode
  4. Extraer la señal procesada mediante getChannelData()
  5. Hashear el array de punto flotante resultante
const ctx = new AudioContext()
const osc = ctx.createOscillator()
const compressor = ctx.createDynamicsCompressor()
osc.connect(compressor)
compressor.connect(ctx.destination)

// Configuración del compresor
compressor.threshold.value = -50
compressor.knee.value = 40
compressor.ratio.value = 12
compressor.reduction.value = -20
osc.frequency.value = 1000
osc.type = 'sawtooth'

// Procesar y extraer
const analyser = ctx.createAnalyser()
const buffer = new Float32Array(analyser.fftSize)
analyser.getFloatFrequencyData(buffer)
const hash = md5(buffer) // único por pila de audio

Fuentes de Entropía

Fuente Variabilidad
Controlador de audio y hardware Alta
Soporte de frecuencia de muestreo Media
Implementación del procesamiento de dinámicas Media
Pila de audio del SO (PulseAudio, ALSA, CoreAudio, WASAPI) Alta
Número de canales de audio Baja

Mitigación

En el proxy

AudioContext se ejecuta enteramente en el navegador — el proxy no puede modificar su salida.

Mediante JS inyectado

Anular AudioContext.prototype.getChannelData o AnalyserNode.prototype.getFloatFrequencyData para devolver datos genéricos/planos.

// Anulación inyectada
const originalGetFloatFrequencyData = AnalyserNode.prototype.getFloatFrequencyData
AnalyserNode.prototype.getFloatFrequencyData = function(array) {
  originalGetFloatFrequencyData.call(this, array)
  // Aplanar/ruido en la salida
  for (let i = 0; i < array.length; i++) {
    array[i] = -100 // señal plana
  }
}

Problema: El sitio puede detectar la manipulación verificando si la salida es demasiado uniforme en comparación con la salida de hardware real.

Conclusiones

  • El fingerprinting de audio es específico de CPU/SO/hardware
  • No puede falsificarse a nivel de proxy
  • La inyección JS puede mitigarlo pero no completamente
  • Mejor enfoque: anulación + ruido consistente mediante JS inyectado