Aperçu
L'empreinte audio utilise l'API Web Audio (AudioContext) pour générer un identifiant unique basé sur la façon dont le matériel et le logiciel audio de l'appareil traitent un signal généré.
Mécanisme
- Créer un
AudioContext - Générer un signal d'oscillateur (onde sinusoïdale à une fréquence spécifique)
- Traiter via
DynamicsCompressorNode - Extraire le signal traité via
getChannelData() - Hacher le tableau de nombres à virgule flottante résultant
const ctx = new AudioContext()
const osc = ctx.createOscillator()
const compressor = ctx.createDynamicsCompressor()
osc.connect(compressor)
compressor.connect(ctx.destination)
// Paramètres du compresseur
compressor.threshold.value = -50
compressor.knee.value = 40
compressor.ratio.value = 12
compressor.reduction.value = -20
osc.frequency.value = 1000
osc.type = 'sawtooth'
// Traiter et extraire
const analyser = ctx.createAnalyser()
const buffer = new Float32Array(analyser.fftSize)
analyser.getFloatFrequencyData(buffer)
const hash = md5(buffer) // unique par pile audio
Sources d'Entropie
| Source | Variabilité |
|---|---|
| Pilote audio et matériel | Élevée |
| Support du taux d'échantillonnage | Moyenne |
| Implémentation du traitement dynamique | Moyenne |
| Pile audio OS (PulseAudio, ALSA, CoreAudio, WASAPI) | Élevée |
| Nombre de canaux audio | Faible |
Atténuation
Au niveau du proxy
L'AudioContext s'exécute entièrement dans le navigateur — le proxy ne peut pas modifier sa sortie.
Via JS injecté
Surcharger AudioContext.prototype.getChannelData ou AnalyserNode.prototype.getFloatFrequencyData pour retourner des données génériques/plates.
// Surcharge injectée
const originalGetFloatFrequencyData = AnalyserNode.prototype.getFloatFrequencyData
AnalyserNode.prototype.getFloatFrequencyData = function(array) {
originalGetFloatFrequencyData.call(this, array)
// Aplatir/bruiter la sortie
for (let i = 0; i < array.length; i++) {
array[i] = -100 // signal plat
}
}
Problème : Le site peut détecter la manipulation en vérifiant si la sortie est trop uniforme par rapport à une sortie matérielle réelle.
Conclusions
- L'empreinte audio est spécifique au CPU/OS/matériel
- Ne peut pas être usurpée au niveau proxy
- L'injection JS peut l'émousser mais pas complètement
- Meilleure approche : surcharge + bruit cohérent via JS injecté