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
- Crear un
AudioContext - Generar una señal de oscilador (onda sinusoidal a una frecuencia específica)
- Procesar mediante
DynamicsCompressorNode - Extraer la señal procesada mediante
getChannelData() - 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