浏览器指纹识别技术

最近接到一名用户的投诉:某网站不能安全退出。类似于这种问题是P0级的,公司大领导第一时间响应,要求快速解决。

在不确定用户投诉的问题原因之前,作为开发者来说,首先是需要重现和定位该问题,于是我们按照客户提供的浏览器版本IE10的某个小版本号,找到该版本的机器,最终没有重现问题。

后来,我们怀疑是否是用户电脑里安装了什么流氓插件导致的,于是我们就模拟用户电脑对浏览器设置各种设置,甚至修改了userAgent,也没用找到问题的原因。检查了前端代码也没有问题,找不出问题发生的原因。

代码查遍了,定位不到问题,头疼啊!难道是要把这块的代码重构一遍?那也不一定能解决到问题。

于是呢,期望联系到客户,期望进行远程协助。客户考虑到安全问题,残忍拒绝。

那么遇到这样的情况,有没有办法通过技术的方式追踪用户的信息呢?当然是有的,下面就介绍这种跟踪方法。

不过这种隐私不能滥用,特别是对于互联网金融行业对安全特别重视的产品,一旦泄露的用户的隐私后果可想而知。有必要多了解下,防患于未然。

###什么是浏览器指纹?

我的理解是,浏览器指纹是识别用户身份的唯一标识。

在平常,我们是怎样识别用户的呢?大家知道有一种前端技术叫cookie,通过cookie可以跟踪用户的行为,可以在客户端生成一长串证明唯一ID的信息返回给服务器。但是,cookie是可以被禁用被删除的和修改的,如果这样那么服务器就无法追踪到用户的一些信息和行为了。cookie不是一种很靠谱的方法,

浏览器指纹识别技术就是为解决这样的问题而发明的。

浏览器指纹并不是个什么新的技术,它是利用收集用户浏览器的各种差别信息,利用最终的算法来定位用户身份。信息量最大的是userAgent。

###浏览器指纹包括哪些信息?

打开这个链接https://panopticlick.eff.org ,点击圆形的红色按钮TEST ME,就可以获得到自己的浏览器指纹信息了。里面包括了User Agent、所有浏览器插件(Browser Plugin Details)、Time Zone、浏览器分辨率和颜色深度(Screen Size and Color Depth)、系统字体、是否禁用cookie、Limited supercookie test 等等信息。

每个用户的信息都不尽相同,每个信息组合在一起就可以区别一个用户,这样可以建立用户的唯一身份信息。这个信息是存在于用户计算机内的,可以通过网站无服务随意获得。通过一定的算法来识别用户,准确率在94%以上,能收集到的用户信息越多越好。如果结合cookie,准确率就更高了,接近100%。100个用户里,可能只有1%的用户禁用cookie或删除cookie,1-%1*6%就是准且率了。

对于需要登录的网站
假如网站没有采用“指纹追踪”的技术,那么你可以在该网站上注册若干个帐号(马甲)。当你需要切换身份的时候,只需要先注销用户,清空浏览器的 cookie,然后用另一个帐号登录。网站是看不出来的。

一旦网站采用“指纹追踪”的技术,即使你用上述方式伪造马甲,但因为你用的是同一个浏览器,浏览器指纹相同。网站的服务器软件可以猜测出,这两个帐号其实是同一个网民注册的。

###什么是“指纹”的“信息量”?

在 IT 领域有各种各样的特征可以用来充当“指纹”。这时候就需要判断,用哪个特征做指纹,效果更好。为了讨论这个问题,就得扫盲一下“指纹的信息量”。

为了帮助大伙儿理解,先举一个例子:

假设你要在学校中定位某个人,如果你光知道此人的性别,你是比较难定位的(只能排除 1/2 的人);反之如果你不知道性别,但是知道此人的生日,就比较容易定位(可以排除掉大约 364/365 的人,只剩大约 1/365 的人)。为什么?因为“生日”比“性别”更加独特,所以“生日”比“性别”能够提供更多的信息量。

从这个例子可以看出:某个特征越独特,则该特征的信息量越大;反之亦然。信息量越大的特征,就可以把对象定位到越小的范围。

###“指纹”的“信息量”如何度量——关于指纹的比特数?

(本节涉及到中学数学,数学很差的或者对数学有恐惧感的读者,请直接无视)

在 IT 领域中,可以用【比特数】来衡量某个指纹所包含的信息量。为了通俗起见,先以前面提到的“性别”来说事儿。性别只有两种可能性——“男”或者“女”,并且男女的比例是大致平均的。所以,当你知道了某人的性别,就可以把范围缩小到原先的 1/2。用 IT 的术语来讲,就是:“性别”这个特征只包含一个比特的信息量。以此类推:

  • 当我们说:“某特征包含3比特信息量”,意思就是:该特征会有8种大致平均的可能性(8等于2的3次方)。一旦知道该特征,可以把目标定位到八分之一。
  • 当我们说:“某特征包含7比特信息量”,意思就是:该特征会有128种大致平均的可能性(128=2^7)。一旦知道该特征,可以定位到 1/128。

再来说“生日”。(不考虑闰年的情况下)生日有365种可能性(并且也是平均分布的),所以生日包含的比特数大约是 8.51。为什么是 8.51 捏,因为 2 的 8.51 次方 约等于 365。因此,知道了某人的生日就可以把范围缩小到 1/365

通过上述举例,大伙儿对于指纹的信息量,应该有一些粗浅的认识了吧?

###多个指纹的综合定位

如果能同时获取【互不相关】的若干个指纹,就可以大大增加定位的精确性。

比如要在某个公司里面定位某人,如果你知道此人的“生日”和“生肖”,那么就可以达到 1/4380(1/4380 = 1/12 * 1/365) 的定位精度。因为综合定位之后,比例之间是【乘法】的关系,所以范围就被急剧缩小了。

为什么要特别强调“互不相关”呢?假如你同时知道的信息是“生日”和“星座”,那么定位的精度依然是 1/365——因为生日的信息已经包含了星座的信息。所以,只有那些相互独立的特征(所谓的相互独立,数学称为“正交”),在综合定位的时候才可以用【乘法】。