设备指纹是基于设备的一些因素生成的一个签名,用于区分和识别不同的设备。设想一下如果你的网站或Web应用没有登陆机制却又想识别不同的设备,那么设备指纹是个不错的选择。
如何生成设备指纹?
在网页端可以通过JavaScript暴露出来的接口访问一些系统的信息,以及当前浏览器支持的功能。在获得了这些信息之后,然后使用一个散列函数生成一个字符串,即可作为设备指纹使用。
Fingerprint2
Fingerprint2是一个开源的设备指纹库,目前有11K的Start,目前比较成熟。
Fingerprint2会检测的设备信息
*获取不到值时返回:notavailable#获取不到值时返回:error
userAgent:navigator.userAgentlanguage:语言colorDepth:返回目标设备或缓冲器上的调色板的比特深度*deviceMemory:以千兆字节为单位返回设备内存量。该值是通过舍入到最接近的2的幂并将该数除以而给出的近似值。*pixelRatio:像素比*hardwareConcurrency:返回可用于运行在用户的计算机上的线程的逻辑处理器的数量*screenResolution:检测屏幕宽高,并根据屏幕方向矫正返回值[width,height]availableScreenResolution:返回屏幕分辨率[width,height],无头浏览器无法获取。*timezoneOffset:返回从当前区域设置(主机系统设置)到UTC的时区差异(以分钟为单位)timezone:时区*sessionStorage:是否支持sessionStorage,不支持时返回错误#localStorage:是否支持localStorage#indexedDb:是否支持indexedDb#addBehavior:此时可能未定义body或以编程方式删除openDatabase:返回是否支持cpuClass:返回浏览器系统的CPU等级,一般无法获取*platform:返回表示浏览器平台的字符串,该规范允许浏览器始终返回空字符串,因此不要依赖此属性来获得可靠的答案.*doNotTrack:返回用户的“不跟踪”设置。如果用户请求不被网站,内容或广告跟踪,则为“1”。一般结果为*。plugins:返回浏览器安装的插件列表。*canvas:如果浏览器支持canvas则返回生成baes64数据。*webgl:返回浏览器对webgl绘图协议的支持情况汇总*webglVendorAndRenderer:返会显卡型号相关信息*adBlock:返回是否安装去广告插件。hasLiedLanguages:返回用户是否改变了首选语言hasLiedResolution:返回用户是否改变了分辨率hasLiedOs:返回用户是否改变了操作系统hasLiedBrowser:返回用户是否改变了浏览器touchSupport:返回最大触摸点数,是否支持touch,是否支持ontouchstart事件]fonts:返回从64种字体种筛选出的可用字体fontsFlash:Flash字体枚举,如果没有swfobject,不会触发。audio:返回音频指纹enumerateDevices:请求可用媒体输入和输出设备的列表,例如麦克风,相机,耳机等
设备指纹的局限性
使用JavaScript计算得到设备指纹可以做到跨域识别用户,不过有一定的局限性:
在一个设备上使用不同的浏览器访问同一个网站,可能会生成不同的设备指纹,这是由于它并不是真正的设备指纹,更准确的说是浏览器指纹。如果其中的一个检测项发生了变化,则设备指纹也随之变化,例如升级了浏览器,安装了某些保护隐私的浏览器插件等。在不同设备上生成的设备指纹可能存在重复,特别是在移动设备上,这是由于用户通常不会修改手机的配置,同一型号的手机可能会生成重复的指纹。解决指纹重复问题
可以通过追加外部检测项的方式来减少重复的概率,例如再外加当前用户的IP