我们已经强调过很多次比特币仅仅是一个化名系统,所以你所有的交易记录或者交易地址很有可能被关联在一起。让我们再进一步讨论这种关联是怎么发生的。
图6.1展示了维基解密的捐款页面上的一个片段(包括本章开头的时候就引用的一段),请注意那个在比特币地址旁边的刷新按钮。可能你会期望通过点击这个刷新按钮,就会把接收捐款的地址换成一个全新生成的地址。类似地,如果你刷新页面或者关闭这个页面,重新再打开的时候,这个地址也会重新生成,而且是之前没有出现过的。这是因为,维基解密需要保证每接收一笔新的捐款,都会对应一个新创设的仅用于此笔捐款的公钥。维基解密这么做就是最大限度地利用了可以创建新化名功能的作用。这事实上就是比特币钱包实现匿名性的最好途径。
图6.1 维基解密的捐款页面的一个片段
注:请注意那个在比特币地址旁边的刷新按钮。维基解密遵循了为每一笔捐款生成一个新接收地址的比特币匿名化的最佳实践。
你可能觉得这些不同的地址一定是无法关联的,维基解密收到的不同的捐款是完全分开的,并且推测它们可以分开使用每一笔捐款,但事实并非如此。
关联性(linking)
假设爱丽丝想要去买一个茶壶,价格是8个比特币(可能根据2015年的比特币价格,实际情况应该是8分比特币,1个=100分)。进一步假设,她的比特币分在三个不同的地址里面,分别有3、5和6个比特币。实际上,爱丽丝没有一个比特币地址有足够的8个比特币,她必须要把两个输出合并成一个单体输入,以支付给店铺。
隐形地址
假设鲍勃要通过他的网站还有广告牌来宣传他的捐赠地址。现在还没有任何方式可以将一个不同的地址显示给每个用户,必然地,接收现场捐款的这个地址会很容易连接到鲍勃的站点。
能够利索地解决这个问题的办法,是利用隐形地址(stealth addresses)。它允许收件人鲍勃发布一个静态“永久”的地址,任何发件人(比如爱丽丝)由此可以派生出新的地址,该地址的私钥只有鲍勃知道。
这是如何做到的呢?回忆一下椭圆曲线数字签名算法(ECDSA)中的公钥的函数形式是gx,其中的x是私钥,地址函数是H(gx)。为了启用隐形地址,鲍勃需要广告公钥本身,而不是长度更短的哈希值。然后,爱丽丝可以选取一个随机数值r, 计算 (gx)r=gxr,并且将钱汇给这个公钥。如果爱丽丝能够单独将数值r发送给鲍勃,鲍勃就可以计算出正确的私钥xr,将汇到公钥gxr的钱花掉。
这种方法并不完美,因为爱丽丝需要将数值r发送给鲍勃,而且还假定即使鲍勃不在线,比特币交易照样运行。为了解决这个问题,还有更复杂的协议,让爱丽丝能够有效地将数值r嵌入比特币交易本身。随后,鲍勃可以扫描区块链,检测针对他的交易,并恢复私钥。黑暗钱包中使用了这种方法,该钱包设计时旨在增强隐私,并且类似的想法在加密签名(CryptoNote)这种另类币中有所使用。
那么问题来了,这笔交易会在区块链网络里有一个永久的记录,任何看到这个记录的人都可以推断,这两个输入型交易很有可能是由同一个用户控制的。换句话说,共享型消费,成为不同输入地址联合控制的证据。当然也可能存在例外,有可能爱丽丝和鲍勃是同寝室的朋友,决定一起联合购买这个茶壶,并且分开付款。但是,大体来说,共同输入基本上意味着共同控制。
图6.2 多地址输入交易
注:为了支付购买茶壶的钱,爱丽丝从两个不同的比特币地址创建了一个单一交易。这样爱丽丝就暴露了一个事实,即一个个体控制了两个不同的地址。
还不仅仅如此,攻击者可以重复上述过程,从而一步一步将这个个体所进行的所有交易关联起来。如果另外一个地址也关联到了爱丽丝用于交易的两个地址之一,那我们就知道所有三个地址都属于同一个个体,我们可以因此建立一个地址簇(clustering of addresses)。一般来说,如果一个新地址的输出,和该地址簇中的任何一个已知地址被一起花费,那么这个新的地址也将会被加到该地址簇中去。
在本章6.4节,我们将会探讨一种叫合币(CoinJoin)的匿名技术,该技术的工作原理打破了上述设想。但是到目前为止,对没有使用特别匿名技术的普通比特币钱包用户,这种簇技术还是非常有效的。接下来,我们很快将会讨论如何把这种地址簇关联到现实世界的身份。
零钱地址(change address)的随机化
早期版本的比特币类库[Bitcoin-Qt library,现在又称为比特币中心(Bitcoin Core)]存在一个缺陷,对有两个输出地址的交易,它总把存放零钱的输出地址放在第一个,这意味着很容易分辨出很多交易中的零钱地址。这个缺陷在2012年得到了修复,但是重点在于:钱包软件在保护匿名性中扮演着非常重要的角色,如果你正在开发钱包软件,你需要格外注意很多陷阱,尤其是你需要保证零钱地址的位置应该永远是随机的,以避免为攻击者留下太多信息。
再回头看一下我们的例子。假设这个茶壶的价格从8个比特币上涨到了8.5个比特币,爱丽丝发现,未用完的支出账号里无法再组合生成恰好可以支付这个茶壶所需要的金额了。取而代之的方案是,爱丽丝利用交易可以有多重支出的特性,如图6.3所示,支出的其中之一就是茶壶店铺的接收地址,而另外一个则是爱丽丝自己的“找零”地址。
现在从其他人的视角来看这笔交易,他们可以推断出这两个输入地址都属于同一个用户,他们甚至可能怀疑其中一个支出地址也属于这个用户,但是无法知道具体是哪一个。事实上0.5个比特币虽然比其他的支出小,但是并不意味着这是一个零钱地址,爱丽丝可能有10 000个比特币参与了交易,其中她支付了8.5个比特币用于购买茶壶,而把剩余的9 991.5个比特币找零退回给了自己。在这样的场景中,更大的输出才是实际上的找零地址。
图6.3 零钱地址
注:为了支付购买茶壶的钱,爱丽丝创建了一个交易,这个交易中的一部分比特币去了商家的钱包,而剩余的部分作为零钱退回给了她自己。
另外一种更好的解释是,如果茶壶只需要花费0.5个比特币,由于不管是3个比特币还是6个比特币的输入地址,都足够用来支付了,爱丽丝根本不需要创建两个不同输入组成的交易。但是,选择哪种交易方式完全取决于通常使用的钱包软件的特性,即使不是非常有必要,钱包(或者是用户)还是可以随意组合不同交易地址中的比特币来完成支付的。
惯用法则
这种类型的实施细节被称为“惯用法则”(idioms of use)。2013年,一组研究人员发现了大多数钱包软件都在使用的惯用法则,并推导出一种用来鉴定零钱地址的强大方法。具体而言,钱包在有需要的时候都会生成一个全新的地址,因为这种惯用法则的使用,这些新的地址通常都是从来没有在区块链网络出现过的。换句话说,非零钱地址通常都不是新地址,而是已经在区块链网络里出现过的,那么其他人就可以利用这个特性去分辨零钱地址,并把它和输入地址相关联。
依赖惯用法则来推测零钱地址可能会出错。事实上,零钱地址是新地址这一特性不过恰巧是钱包软件的一个特性。在2013年研究者测试的时候发现确实是这样,现在可能还是,但也有可能不再如此了。用户可以选择覆盖掉原来的默认设定,最重要的是,当对手了解了这种技术的时候就可以很容易回避,即使是在2013年,研究者也发现这种特征也会经常产生误报,按照这种规则可以归到一个簇的地址,不一定是属于同一个个体的。研究者声称,他们需要大量的人工监督和干预才能去除这些误报。
关联真实世界的身份到地址簇
在图6.4中,我们可以看到,米克尔·约翰(Meikle John)等人是如何利用惯用法则这样的启发式算法来聚类比特币地址的,但是这种簇没有标签——也就是说,我们还没有关联一个真实的身份到这个簇。
图6.4 地址簇
注:摘自2013年的一篇论文“一把比特币:寻找支付特征”。在一组没有姓名的用户中,研究者将联合支付的地址和全新的零钱地址归类到一个比特币地址簇。图中,圆形的大小表示流入这些地址簇里的货币数量,每一条线则代表一个交易。
我们可以根据所了解的比特币经济情况来做一个合理的推测。回到2013年,门头沟公司曾经是最大的比特币交易所,所以我们可以猜测图中较大的圆圈代表的就是该交易所控制的地址,我们可能也注意到,图中左侧的深色的圆圈代表了很小的比特币总量,但同时又有非常大的交易量,这个特性很符合叫作中本聪之骰(Satoshi Dice)的在线比特币博彩游戏,这个游戏中,你可以发送微小量的比特币作为赌注。总的来说,这并不是一个很好的方法来辨识地址簇,这需要很多背景知识和推测,可能仅仅对特征比较显著的案例有效。
利用交易进行标记
如果仅仅是通过访问交易所或者商家的网站,以查询其公布的接收比特币的地址,会怎么样呢?这其实没有实际意义。因为大多数服务提供商都会针对每一个交易公布一个新的地址,而这个新地址还没有公布在区块链网络上,等待这些地址发生交易没有意义,因为这些地址通常不会再显示给其他人。
唯一可靠的推断地址的方法,是通过和这些服务提供商发生一个实际的交易,交存比特币或者购买一个商品等。当你发送或者接收比特币的时候,你将会知道它们所拥有的地址之一,而且很快这个地址就会在区块链网络上公示(并且是在其中一个簇中的)。于是你可以为这个簇打上该服务商的身份标识标签。
这就是当时“一把比特币”的研究者(以及自那之后的其他人)追踪地址的做法,他们购买了不同的东西,加入了矿池,使用比特币交易所、钱包服务、博彩网站,以及其他一些和这些服务提供商产生比特币交易的行为,总计进行了344笔交易。
在图6.5中,我们又一次看到了图6.4的簇,只不过这一次贴上了附加的标签,我们有关门头沟公司和中本聪之骰的猜测是准确的,这些研究者同时辨识出一批其他的服务提供商,而如果不用交易的方式是很难标识它们的。
辨识个人
下一个问题是:我们是否可以对个人做同样的动作?也就是说,我们是否可以关联一些小的簇以辨识个人在真实生活中的身份?
直接交易。任何人和某个个人进行比特币交易的时候——不管是线上还是线下的商家、交易所,或者一个用比特币来分担晚餐账单的朋友——都可以通过这种直接交易,了解到他们的有效地址(至少一个)。
图6.5 标签簇
注:通过和不同的比特币服务提供商进行交易,米克尔·约翰等人得以辨识并且标记这些簇在真实世界中的身份。
通过服务提供商。在使用比特币几个月甚至几年的时间里,大多数用户都会跟交易所或者其他中心化的服务提供商有一些交集,这些服务提供商都会直接询问用户的真实身份——通常法律要求它们必须这样做。这个话题我们将会在下一个章节讨论。如果执法部门想要去辨识某一个个人,就可以直接去找这些服务提供商,要求它们提供数据。
疏忽。人们通常都会在公共论坛里公示自己的比特币地址,一个通常的原因都是通过这种办法请求捐助。当有人这么做的时候,其实已经创建了一个他们自己的身份和他们某一个地址的关联,如果他们不使用我们将要探讨的匿名服务,所有的交易都将会面临被暴露的风险。
随着时间的推移,针对隐私的攻击会变得越来越有效率。历史记录表明,当越来越多的研究者去研究并开发出新的去匿名化的技术时,越来越多的数据会被公开,去匿名化的算法也由此随着时间的推移而不断得到改进。除此之外,会有越来越多的辅助信息可以帮助攻击者去识别这些地址簇,如果你非常关心隐私,那么这个问题就值得去担忧。
目前,我们探讨的去匿名化技术,都是基于对区块链网络上交易图谱进行的分析,这些方法被归纳为交易图谱分析(transaction graph analysis)。
网络层的去匿名化
用户被去匿名化,有很多种不依赖于交易图谱的方法。为了在区块链网络中公示一个交易,一种典型的方法就是广播这个交易到比特币点对点的网络中,在这个网络中,消息会被相应地发送,但不一定要在区块链网络里做永久记录。
在计算机网络术语中,区块链被归为应用层,而点对点的网络则是网络层。2011年,丹·卡明斯基(Dan Kaminsky)在黑帽技术大会(Black Hat)上首次提出了网络层去匿名化的概念。他注意到,当某个节点创建一个交易时,该节点就会和其他很多节点建立链接并且广播该笔交易。如果网络上足够多的节点串通起来(或者是被同一个攻击者所控制的),他们就能分辨出第一个广播交易的节点,并且可以因此推断,这个节点就是被创建这个交易的用户所拥有的。攻击者因此可以把这个交易关联到这个节点的IP地址,而IP地址已经非常接近于真实世界的个人身份了——有很多办法可以发现某个IP地址背后的用户身份。因此,网络层去匿名化就是隐私保护的一个非常严重的问题(参见图6.6)。
图6.6 网络层去匿名化
注:正如丹·卡明斯基在2011年黑帽技术大会上的演讲中指出的,“第一个通知交易的节点很有可能就是交易源头”。当有多个节点配合并且对同一个交易源头进行识别的时候,这种方法的实际效果会更加明显。
幸运的是,这是一个通信匿名性的问题,已经有很多研究在探索这个课题。正如我们前面在6.1节中已经看到的,Tor这个使用很广泛的系统就是用来实现通信匿名性的。
在使用Tor系统为比特币实现网络层匿名化的解决方案的时候,有几个注意事项。首先,在Tor的协议和任何基于此协议的上层协议之间,可能会有一些复杂的交互,由此可能会导致新的破坏匿名化的方法。事实上,研究者已经发现,在使用Tor协议之上的比特币时,存在一些潜在的安全问题,使用这个方案的时候一定要非常小心。其次,可能有其他一些匿名通信的技术,会更适合比特币的使用。Tor的定位是针对那些低延迟的活动,比如网页浏览。在网页浏览的时候,你也不想坐在那里等半天,因此要取得低延迟,在匿名化方面可能要做出某些牺牲。相反,比特币则是一个高延迟的系统,因为比特币交易需要花时间来获得区块链上的确认。因此,至少在理论上我们可能更希望使用另外一种替代方案来实现匿名性,比如混币网络(Mix Net,参见本章6.3节)。但就目前来说,作为一个实际在运行的并且有广大用户基础的系统,Tor还是有一些优势的,而且这些用户的安全问题已经被集中地研究过。
到目前为止,我们已经看到,通过交易图谱分析的方法,不同的地址有可能被关联在一起,甚至有可能进一步被关联到真实世界的身份。我们也看到,基于点对点网络,交易或者地址可能会被关联到一个IP地址。对后一个问题,虽然我们现在还不能说可以完全解决,但至少解决起来相对容易。前一个问题就要麻烦很多,我们将在本章的后续部分,继续探讨如何去解决它。