区块链——作为公开账本,解决了各方如何建立信任的问题,却也同时带来了一个新的问题:隐私如何得到保护?当用户的所有交易信息都暴露在大众面前,如果这些交易信息被恶意挖掘及利用,将给用户隐私带来严重的威胁。本文将就区块链技术中的隐私问题以及最前沿的解决方案给大家做一个形象的介绍和分析。
区块链的隐私问题
也许大家首先会有一个疑惑:比特币等区块链技术不是“匿名”的吗,为什么会有隐私问题?要回答这个问题,我们首先要区分“化名”和“匿名”这两个概念。化名很好理解,就是我们在网络中使用的一个与真实身份无关的身份。例如在比特币系统的交易中,使用者无需使用真名,而是采用公钥哈希值作为交易标识。在这个例子中,公钥哈希值就可以代表使用者的身份,与真名无关,因此比特币是具备化名性的。
但匿名跟化名是不同的。在计算机科学中,匿名指的是具备无关联性(unlinkability)的化名[1]。所谓无关联性,就是指站在攻击者的角度,无法将用户与系统之间的任意两次交互进行关联。在比特币中,由于用户反复使用公钥哈希值作为交易标识,交易之间显然能建立关联。因此比特币并不具备匿名性。
若单个地址进行交易并不能确保匿名性,那么多个地址又如何?答案依然是否定的:如图1所示,用户X利用多个账户在一定时间内向用户Y进行转账,攻击者可以很大概率猜测这几个地址属于同一个用户,而将这多个地址都归为一个地址簇。
图1: 多账户与单一账户交易会被关联
除了上述情况,零钱地址也会暴露用户地址的关联性。如图2所示,用户X向用户Y转账40,总计付款50,因此零钱返回10。攻击者会很大概率推测账户D是零钱地址,从而将账户D和E进行关联。早期的比特币类库(Bitcoin-Qt library)就存在过零钱地址总出现在输出地址第一个而带来的隐私问题(已在2012年修复)。
图2:零钱账户与其他账户会被关联
在将用户多个地址归并为地址簇后,再结合现实中直接发生交易来给地址簇加上标签,就可以画出如图3的标签簇图。图中的连线表示一次交易,圆的面积大小代表交易量。虽然图中只列出了服务提供商、交易所、矿池的标签,需要说明的是,也可以利用类似的手段来获取个人用户现实生活中的身份信息。因此再结合服务提供商的地址信息及公开账本,个人用户的所有消费记录将显露无遗。这将带来严重的用户隐私问题。
图3:通过实际交易及地址簇构建标签簇[2]
如何在保障隐私(隐藏交易内容)的情况下实现区块链的特性(交易可验证,历史可查等)呢?下面我们介绍三种最典型的匿名化方案:达世币(Dash),门罗币(Monero),零钞(Zcash)。
达氏币(Dash)
达氏币使用了一种称之为合币(CoinJoin)的关键技术。简单地说,所谓合币技术就是通过一些主节点(master node)来将多个用户(至少3个)的多笔交易进行混合、形成单一交易的技术。在合币中,每个用户都会提供一个输入输出地址,然后将其送到主节点进行混合(即任意交换输入输出地址)。交易只能以规定面额(0.1, 1, 10, 100)为单位来进行,这样就增加了攻击者从数额的角度来猜测交易关联度的难度。同时,主节点要保证乱序输出。如图4所示,不同的颜色代表此金额来自不同用户,DASH是达氏币的货币标识。通过混合,黄色用户完成了对绿色用户进行转账10 DASH。而外界很难从混淆后的交易中发现这笔交易。
图4:合币技术可以将多个用户的多笔交易进行混合[3]
合币中一个关键的保护隐私的角色就是主节点,因为主节点依然存在被攻击者控制的可能性。为了解决这个问题,达氏币中引入了链式混合(chaining)以及盲化(blinding)技术。所谓链式混合,就是指用户的交易会随机选择多个主节点,并在这些主节点中依次进行混合,最后输出;所谓盲化技术,就是指用户不直接将输入输出地址发送到交易池,而是随机选择一个主节点,让它将输入输出传递到一个指定的主节点,这样后一个主节点就很难获取用户的真实身份。通过这两个技术,除非攻击者控制了很多的主节点,否则几乎不可能对指定交易进行关联。
除了防范交易数额以及输入输出地址的关联攻击,达氏币还防范了交易时间上的关联攻击。每个用户往往都会具备自己的交易习惯,例如每天的交易时间段以及短时间内进行多笔交易等等。这些时间信息也会一定程度暴露用户身份。为了解决这个问题,达氏币提出了被动(passive)匿名化的方案,保证用户客户端以固定的时间间隔发起交易请求,来参与主节点的混合。
自从2014年市场化以来,达氏币就颇受市场追捧,截至2016年12月2日,其市值已超过6000万美元,在所有加密货币中排名第7;货币单价为8.85美元,在所有加密货币中排名第4[4]。
门罗币(Monero)
在达氏币中,依然存在主节点被控制以及参与混币有恶意用户的风险,这在一定程度上会导致用户隐私的泄露。为了解决这个问题,门罗币提出了一种不依赖于中心节点的加密混合方案。门罗币的关键技术有两个,一个叫做隐蔽地址(stealth address),另一个叫做环签名(ring signature)[5]。
隐蔽地址是为了解决输入输出地址关联性的问题。每当发送者要给接收者发送一笔金额的时候,他会首先通过接收者的地址(每次都重新生成),利用椭圆曲线加密算出一个一次性的公钥。然后发送者将这个公钥连同一个附加信息发送到区块链上,接收方可以根据自己的私钥来检测每个交易块,从而确定发送方是否已经发送了这笔金额。当接收方要使用这笔金额时,可以根据自己的私钥以及交易信息计算出来一个签名私钥,用这个私钥对交易进行签名即可。
隐蔽地址虽然能保证接收者地址每次都变化,从而让外部攻击者看不出地址关联性,但并不能保证发送者与接收者之间的匿名性。因此门罗币提出了一个环签名的方案——事实上,在古代就已经有类似的思想了:如图5所示,联名上书的时候,上书人的名字可以写成一个环形,由于环中各个名字的地位看上去彼此相等,因此外界很难猜测发起人是谁。
图5:古代联名上书时利用环状签名来保护发起人信息[6]
那在门罗币中环签名又是如何实现的呢?如图6所示,每当发送者要建立一笔交易的时候,他会使用自己的私钥加上从其他用户的公钥中随机选出的若干公钥来对交易进行签名。验证签名的时候,也需要使用其他人的公钥 以及签名中的参数。同时,发送者签名的同时还要提供钥匙映像(key image)来提供身份的证明。私钥和钥匙映像都是一次一密的,来保证不可追踪性(untracability)。
图6:环状签名可以隐藏交易发起人的信息
除了交易地址,交易金额也会暴露部分隐私。门罗币还提供了一种叫做环状保密交易(RingCT)的技术来同时隐藏交易地址以及交易金额。这项技术正在逐步部署来达到真正的匿名。这项技术采用了多层连接自发匿名组签名(Multi-layered Linkable Spontaneous Anonymous Group signature)的协议。限于篇幅,感兴趣的读者可以参考原论文[7]。
门罗币目前的市值超过一亿美元,排名第5;单价为8.21美元,排名第6。
零钞(Zcash)
门罗币的方案看似已经接近完美,但依然存在一个可能的问题:环签名中依旧需要与其他用户的公钥进行混合,因此可能会遭遇恶意用户从而暴露隐私。零钞利用零知识证明避免了这个问题,让用户只是通过和加密货币本身进行交互来隐藏交易信息,做到了“所有货币生来平等”[8]。
首先给大家简要介绍一下什么是零知识证明(zero knowledge proof)。如图7的左图所示,北分支和南分支中间有一扇门,老王宣称自己能打开这扇门,如何在不给大家看开门细节的情况下让大家相信这件事呢?假设我们采用交互式的零知识证明,那么老王可以自己选择一个分支进入,如图中蓝色点(哪个分支可以不让验证者知道)。然后验证者(图中红色点)随机指定老王从哪个分支出来。如果老王打不开门,那么老王只有二分之一的概率达到要求。N次重复这个过程,如果老王不能打开门,那么老王N次都能从指定分支出来的概率为 (1/2) ^N。因此足够次数下,如果老王都能完成任务,可以认为老王能打开门。这样带来的一个问题就是交互成本太高。一个改进的方案是图7的右图,假设这儿有100条路,如果验证者随机指定100条路中的一条,老王能从该分支出现,那么老王不能开门的概率为1/100。这显著提高了交互的效率。
图7:零知识证明的一个简单例子。左图代表交互式证明,右图代表非交互式证明
在零钞的设计中,就采用了一种叫做zk-SNARK的非交互式的零知识证明。在这里我们并不深入zk-SNARK的细节,只是大致描述一下零钞中是如何使用这项技术的。首先我们看一个最简单的情形,假设零钞中的币值都是确定的,例如1BTC。那么铸币过程相当于是用户向某个托管池(escrow pool)注入1BTC,然后向一个列表中写入一个承诺(commitment) 。其中承诺必须由一个序列号以及用户私钥才能计算得到,并且是单向的。当用户想要花这个币的时候,需要做两件事:(1)给出序列号,以及 (2)利用zk-SNARK证明自己知道生成这个承诺的用户私钥。这样,用户就可以在完全不暴露身份的情况下,花出这个币。并且序列号的唯一性可以保证没有双花的情况。
以上的简单情形有三个问题:(1)币值固定很不方便, (2)发送方可以通过序列号来判断接收方正在花钱,(3)接收方必须马上花掉得到的币否则可能被发送方提取。为了解决这三个问题,零钞中提出了一种浇铸(pour)的操作来花销钱币。简单地讲,浇铸操作就是通过一系列零知识证明,将一个币铸造成多个币,且输入输出的总和相等。每个新币都有自己的密钥、数额、序列号等等,从而解决了以上三个问题。与此同时,零钞还采用了一系列的优化措施来提高整个运行系统的性能。
零钞在现目前所有的密码学货币中是匿名性最好的,因此受到过市场狂热的追捧,在2016年10月底发行前后,单币价格估值曾高达几千个比特币。现目前币值稳定后,零钞的市值大约为800万美元。单币价格为62美元,仅次于比特币。
小结
区块链技术中的隐私问题一直以来都是饱受诟病的,一方面普通用户在区块链上的交易隐私应该得到保护,另一方面又应该防止恶意用户将其用作非法交易的平台。现目前的匿名化技术也还不能完美地保证匿名,比如像零钞,也必须依赖于初始化时的一些秘密参数(掌握在几个人手中)。这也会给用户带来交易与隐私上的风险。除了交易隐私,诸如以太坊等区块链技术中的智能合约隐私也是一个很值得关注的问题,目前也已经有一些工作开展起来。希望在不久的将来,区块链能做到在保证隐私的同时,为数字世界提供一个公开可信的技术支撑。
作者:张宪 闫莺 陈洋