I've watched device printing evolve over the last decade, and for the most part, there have been relatively few breakthroughs. For every new technique that moves printing forward, we seem to lose multiples due to privacy concerns. There comes a time when we need to do more than thinking out of the box, in order to break free we must burn the box and dance on its ashes.
Typically in the device fingerprint world, one would query a number of common navigator objects and from that attempt to determine if the device was one used by the account holder in the past. I liken this to attempting to uniquely identify a car, but you are saddled by only querying a few parts of the car. For example, color, number of wheels, number of doors. On the surface, it works until you get two sports cars that are red. A better technique is to take all the data points accessible and log those, not all data points, of course, would be applicable such as tint level of the windows. For cars with no tint, it would be a waste to collect a value of zero, so for those cars, it's simply not logged.
The technique presented is similar to the above idea, instead of collecting only a handful of common elements, collect everything offered. We have been saddled with grabbing a subset of navigator values which limit the amount of entropy we can pick up. This was mostly done to avoid the complexity around rule-based antifraud systems, machine learning techniques don't suffer from the same limitations. My solution to this is to walk the navigator object and retrieve values. This as you will see yields far more entropy than simply querying individual properties.
How It Works
Entropy Estimate: TBD, likely 33+
Unlike other code on the Internet we do everything possible to verify our code for you. In order to minimize problems and maximize compatibility this code has been verified with JSLint and has been extensively tested with over 1100 OS/Browser combinations using BrowserStack.