Signal

Media devices

Enumerates attached microphones and cameras to fingerprint the hardware peripheral set — stable across browsers on the same machine.

Tier 2 hardware src/signals/media-devices.ts

What it measures

navigator.mediaDevices.enumerateDevices() returns all audio input, audio output, and video input devices attached to the machine. The signal tallies a count per kind and collects the per-origin opaque device IDs assigned by the browser. No microphone or camera permission prompt is triggered — enumerateDevices() runs silently.

Physical microphones and cameras are the same regardless of which browser queries them, so device counts are cross-browser stable on the same machine. Device IDs are origin-scoped but are also stable per origin across browsers once permission has been granted at least once.

How it is collected

After confirming mediaDevices.enumerateDevices is available, the signal awaits the device list and iterates each entry. Counts are tallied per kind; non-empty device IDs are collected. The hash input is assembled as audioInputCount, then videoInputCount, then each device ID — all joined with the pipe delimiter and passed to xxHash64. The full result value exposes all four counts including audioOutputCount, but that field is intentionally excluded from the hash.

Confidence rules

ConfidenceTrigger
normalmediaDevices.enumerateDevices exists and resolves successfully
absentmediaDevices or enumerateDevices is absent, or any exception is thrown

Why hardware-bound

The physical microphones and cameras attached to the device are the same regardless of which browser queries them. Chrome, Safari, and Firefox on the same machine report the same audioInputCount and videoInputCount. This makes the device count portion of the signal cross-browser stable — the defining criterion for hardware binding. Device IDs are per-origin but are also stable across sessions within an origin, adding entropy without breaking cross-browser consistency when the same origin is used.

Things worth knowing

  • Virtual audio interfaces (BlackHole, VB-Audio Cable) and virtual cameras (OBS Virtual Camera) appear as real devices and increase the counts, making the signal sensitive to installed software.
  • Plugging or unplugging a USB microphone or webcam changes the counts and device IDs — the hash will differ between collections if peripheral state changes.
  • In Firefox and Safari, device IDs may be empty strings until permission is granted; when all IDs are empty, only the device counts contribute to the hash.
  • This is a tier 2 signal — it must be opted into via tiers: [1, 2] in FingerprintOptions.