如何保护隐私[5]:扫盲“浏览器指纹”

2014-01-17IT IT.信息安全

  去年4季度,俺写了4篇《TrueCrypt 使用经验》,又写了3篇 Linux 方面的扫盲,导致本系列又中断了几个月。经热心读者提醒,现继续补上。
  本系列的前面三篇,咱们聊了浏览器的基本防范。对于“隐私要求不高并且技术水平也不高”的同学,那三篇基本上够了。后面俺要继续聊浏览器方面的问题,面向的是那些“对隐私要求较高,同时也具有一定折腾能力”的同学。今天这篇谈谈浏览器的“指纹”是如何暴露你的隐私,顺便分享一些防范技巧。


★啥是“指纹”?


  看过警匪片或者破案小说的同学,应该都知道“指纹”在刑侦中的作用——警方虽然没有直接看到犯罪现场的作案人员,但可以根据现场留下的指纹来猜测/判断作案人员。
  如果你时常接触信息安全领域的一些资料,也会听到“指纹”这个形象的说法(比如:操作系统指纹、网络协议栈指纹、等等)。IT 领域提到的“指纹”一词,其原理跟“刑侦”是类似的——“当你需要研究某个对象的类型/类别,但这个对象你又无法直接接触到。这时候你可以利用若干技术来获取该对象的某些特征,然后根据这些特征来猜测/判断该对象的类型/类别。”


★啥是“指纹”的“信息量”?


  在 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——因为生日的信息已经包含了星座的信息。所以,只有那些相互独立的特征(所谓的相互独立,数学称为“正交”),在综合定位的时候才可以用【乘法】。


★啥是“浏览器的指纹”?


  前面说的是预备知识,现在开始进入正题。
  当你使用浏览器访问某个网站的时候,浏览器【必定会暴露】某些信息给这个网站。为啥俺强调“必定”捏?因为这些信息中,有些是跟 HTTP 协议相关的(本章节说的 HTTP 协议是广义的,也包括 HTTPS)。只要你基于 HTTP 协议访问网站,浏览器就【必定】会传输这些信息给网站的服务器。
  再罗嗦一下:HTTP 协议是 Web 的基石。只要你通过浏览器访问 Web,必定是基于 HTTP 协议的。因此,Web 网站的服务器必定可以获取到跟你的浏览器相关的某些信息(具体是哪些信息,俺下面会聊)。


★“浏览器指纹”如何暴露隐私?


  “浏览器指纹”的机制跟 cookie 有点相似。关于 cookie 的作用,建议那些健忘的同学先去“前面的博文”复习一下。
  对于“浏览器指纹”导致的隐私问题,俺举2个例子来说明其危害。

◇对于无需登录的网站


  如果你的浏览器允许记录 cookie,当你第一次访问某网站的时候,网站会在你的浏览器端记录一个 cookie,cookie 中包含某个“唯一性的标识信息”。下次你再去访问该网站,网站服务器先从你的浏览器中读取 cookie 信息,然后就可以根据 cookie 中的“唯一标识”判断出,你之前曾经访问过该网站,并且知道你上次访问该网站时,干了些啥。对付这种 cookie 很简单,你只需要在前后两次访问之间,清空浏览器的 cookie,网站就没法用 cookie 的招数来判断你的身份。
  但是“清空 cookie”这招对“浏览器指纹”是无效滴!比如说你的浏览器具有非常独特的指纹,那么当你第一次访问某网站的时候,网站会在服务器端记录下你的浏览器指纹,并且会记录你在该网站的行为;下次你再去访问的时候,网站服务器再次读取浏览器指纹,然后跟之前存储的指纹进行比对,就知道你是否曾经来过,并且知道你上次访问期间干了些啥。

◇对于需要登录的网站


  假如网站没有采用“指纹追踪”的技术,那么你可以在该网站上注册若干个帐号(马甲)。当你需要切换身份的时候,只需要先注销用户,清空浏览器的 cookie,然后用另一个帐号登录。网站是看不出来的。
  一旦网站采用“指纹追踪”的技术,即使你用上述方式伪造马甲,但因为你用的是同一个浏览器,浏览器指纹相同。网站的服务器软件可以猜测出,这两个帐号来自同一个人。


★“浏览器指纹”比“cookie”更隐蔽,更危险


  刚才对比了“浏览器指纹”和“cookie”两种身份追踪技术。两者的原理类似——都是利用某些特殊的信息来定位你的身份。两者的本质差异在于:
1. cookie 需要把信息保存在浏览器端,所以会被用户发现,也会被用户清除。
2. 而“浏览器指纹”无需在客户端保存任何信息,不会被用户发觉,用户也无法清除(换句话说:你甚至无法判断你访问的网站到底有没有收集浏览器指纹)。


★“浏览器指纹”包含哪些信息?


  浏览器暴露给网站的信息有很多种,常见的有如下几种:

◇User Agent


  关于 User Agent 是啥,俺已经在本系列前一篇博文中扫盲过了(请看“这里”),健忘的同学先去复习一下,再继续往下看。

◇屏幕分辨率


  这个比较通俗易懂。俺稍微补充一下:这一项不仅包括屏幕的尺寸,还包括颜色深度(比如你的屏幕是16位色、24位色、还是32位色)。

◇时区


  这个也比较通俗。对于大部分天朝的网友,你的时区应该都是“东8区”

◇浏览器的插件信息


  也就是你的浏览器装了哪些插件。
  再罗嗦一次:浏览器的“插件”和“扩展”是两码事儿,别搞混了。本系列前面的博文扫盲了两者的差异,链接在“这里”。

◇字体信息


  和浏览器相关的一些字体信息。
  如果你的浏览器安装了 Flash 或 Java 插件,有可能会暴露某些字体信息。所以俺在本系列的第2篇就警告了浏览器插件的风险。

◇Canvas 绘图的指纹


  Canvas 是 HTML5 新增的一个功能。该功能可以让 JavaScript 脚本在页面的 canvas 元素中绘图。由于不同的浏览器类型,不同的浏览器版本,不同的操作系统平台,都会导致“Canvas 绘图”在一些细节方面的差异。因此,该功能也会暴露浏览器信息(成为“浏览器指纹”的一部分)。
  要想测试你的浏览器是否暴露“Canvas 绘图指纹”,可以查看“这个链接”。
  如果你用的是 Firefox 浏览器,可以安装“这个扩展”,来禁用 canvas 绘图功能。该扩展可以针对不同的域名配置“黑名单和白名单”。

◇HTTP ACCEPT


  这是 HTTP 协议头中的一个字段。考虑到列位看官大都不是搞 IT 技术的,俺就不深入解释这项。

◇其它


  以上就是常见的浏览器指纹。当然啦,还有其它一些信息也可以成为“浏览器指纹”,考虑到篇幅,俺就不一一列举并解释了。有兴趣的同学,请自行阅读 Mozilla 官网的文档(在“这里”。提醒一下:是洋文)


★如何看自己浏览器的指纹?


  关于浏览器指纹导致的隐私问题,可能是由“电子前哨基金会”(简称 EFF)率先在2010年曝光的。后来 EFF 提供了一个页面,帮助网友看自己浏览器的指纹(请猛击“这个链接”)。
  打开此页面之后,当中有一个大大的,红色的“TEST ME”按钮。点一下此按钮,稍等几秒钟,会显示出一个表格,里面包含你当前的浏览器的指纹信息。
  在这个表格中会列出每一项指纹的“信息量”以及该指纹的“占比”。关于“信息量”的含义,本文前面已经扫盲过,此处不再罗嗦。你只需记住,某项的信息量越大,就说明该项越独特。而越独特的指纹,对隐私的威胁也就越大。

  考虑到篇幅有点长,今天先聊到这里。俺争取明后天发下一篇,聊聊如何防范“浏览器指纹”导致的隐私风险。


回到本系列的目录