本文结构
1. 匿名的基础知识
匿名简单的理解就是:拥有匿名集的就叫匿名,如果 只是对应另外一个名字的就叫化名。
1.1 为什么需要匿名化
交易记录存在公共账本上,这些在区块链上面完全是公开透明的,所以你需要对应该匿名的进行匿名的操作。但是我们并不需要对所以进行匿名操作,所以有相应的匿名等级:
1.达到传统银行→2.进一步,任何人不能轻松跟踪参与者
并且存在以下的分析和攻击方法,只有经过匿名化之后才能进一步保证数据安全、身份安全。
1.1.1 污点分析
如果有频繁的接收方与发送方对应,那么我们就称之为污点操作(也可以叫做交易——网络用语????),这种方法一定程度能够分析出关联性,但是并不准确,所以只能通过这种在前期利用它寻找可能性,存在很大的概率问题。
1.1.2 旁路攻击
定义:即使没有发生直接的关联,因为侧面渠道或者一些间接的信息泄露,你的匿名身份也可能会被暴露
实际例子:某个人看过一个匿名的比特币交易记录,并且注意到了这个比特币交易的活跃时间,那么他就可以将这个时间信息与其他公开可获得的信息关联到一起。或者某个时间段的时间几个账号同时上线就说明他们在一定很大概率是有关联的
1.2 如何做到无关联性
- 不同地址
- 不同交易
- 交易双方无关联性——这是一个伪命题,因为当你付款的时候另一方肯定会进行接收,即使你通过了很多迂回的手段,只不过在时间与空间上的关联性没那么强而已,始终有一定的联系。
1.3 匿名集
1.4 道德问题
工资:由于工资每次都是一次发下来,比平时的收入都更大,所以这就相当于一个函数的峰值,很容易被恶意攻击者察觉
洗钱:比特币与其他币种的接口不能进行匿名,而现实中也确实没有进行匿名
大卫乔姆提出了盲签名的概念,用于防止追踪+防止双重支付的机制
Tor是一种可以让不同的政客至今进行自由言论而不受别人迫害,因为他在网络层进行了IP的匿名,但是这又容易被不法分子利用进行非法传播一些东西,使得别人也无法利用查到它
2. 如何去匿名化
2.1 隐形地址:
-
利用一个固定静态不变的地址,我们也叫它是隐形地址,通过 它派生出很多其他看似随机的地址。这里我们通过椭圆曲线算法可以将其进行实现
公钥→随机数→结果与前面的是否相同(随机数就使它所派生的,只要一个公钥地址就能够派生出很多随机数,只是这个随机数随机化的方法得选择好)
2.1.1 方案实现
公钥还是作为地址,
- 公钥是:
- 地址:
鲍勃需要知道公钥而不是它的hash值,然后爱丽丝选择一个随机数,计算下面的式子:
这里爱丽丝能够计算的是左边这一部分,而鲍勃如果得到了就能够计算出右边的结果,如果最终一致,那么鲍勃就拥有使用钱的资格
然后将钱打给这个公钥,实际上最终就是给鲍勃使用,使用方式就是通过下面的方式:
- 爱丽丝能够在一个私密的通道下给鲍勃,那么鲍勃自然就可以计算出正确的私钥,最终就可以花掉公钥对应的钱
2.1.2 缺陷:
- 爱丽丝需要将数值r发送给鲍勃;
- 需要假定即使鲍勃不在线,比特币交易照样运行。
- 可能的解决方案:更复杂的协议,让爱丽丝能够有效地将数值嵌入比特币交易本身。随后,鲍勃可以扫描区块链,检测针对他的交易,并恢复私钥
2.2 多地址输入交易形成的地址簇(小于的时候需要组合)
两个输入型交易很有可能是由同一个用户控制的。
共享型消费(输入对象是共同,但是是不同的人对其进行输入的),成为不同地址身份(控制人)联合控制的证据。当然也可能存在例外,有可能爱丽丝和鲍勃是同寝室的朋友,决定一起联合购买这个茶壶,并且分开付款。但是,大体来说,
共同输入基本上意味着共同控制。
上图注:为了支付购买茶壶的钱,爱丽丝从两个不同的比特币地址创建了一个单一交易。这样爱丽丝就暴露了一个事实,即一个个体控制了两个不同的地址。
攻击者可以通过对上面类似的交易进行检测,不断地建立一个地址簇,最终爱丽丝的地址就会纷纷被攻击者所记录。
2.3 零钱地址的随机化(多于的时候需要找零)
早期的比特币对于几个不同的输出的地址习惯性地将常用的零钱地址放在第一位,这样方便我们进行管理,并且更加容易调用,不过我们这里更多考虑的是安全性,。这样也使得更加容易地暴露给攻击者看到。所以需对输出地址进行随机化
爱丽丝可以有多个输出,最终达到组合(支付组合)的多样性:
- 支出的其中之一就是茶壶店铺的接收地址,
- 另外一个则是爱丽丝自己的“找零”地址。
通过这种方式使得随机性增加,使得攻击者更加难攻破
2.4 尽量去防止惯用法则鉴别地址
一组研究人员发现了大多数钱包软件都在使用的惯用法则,并推导出一种用来鉴定零钱地址的强大方法。——本质就是人们认为找到了钱包软件的一种规律:比如一般零钱地址就是一个新的地址,那么得出的结论就是新的是零地址,旧的就不是,这是这样一种规律不一定正确,但是一定程度上可以提高效率,所以要去除某一些误差就需要大量的人工干预,并且如果这样一种规律普遍地进行流传就会导致一些高级会玩的用户就能够将这一特性进行修改,那么攻击者所得到的信息就是错误的
2.4.1 关联真实世界的身份到地址簇
我们可以使用大数据统计的方法,进行相应的聚类,那么最终的结果就是将发往同一地址的进行聚类,最终就能够得到一个所对应的地址簇,同时还可以对这个聚类因素加入更多的相关变量最终使得它更加的准确,也就是他需要更多的背景知识做基础(其实从最开始的大数据统计我们就应该知道的✌️)
2.4.2 利用交易进行标记、
如果仅仅是通过访问交易所或者商家的网站,以查询其公布的接收比特币的地址,会怎么样呢?
- 没有什么意义,因为最终的结果就新生成的地址没有公布到区块链中,那么之后还是有可能使用这一地址的,而且你没有与该网站进行交易,那么你就没有真实的发送地址,没有发送地址那么标签就是形同虚设;
所以可靠的方法就是:与服务提供商进行有一个实际的交易,获得他拥有的真实,最终形成越来越覆盖面广的地址簇,于是最终我们就大概能够对这些服务商进行标识了。交易次数越多也就越准确
2.5 避免泄露个人信息最后被辨识个人
这些对区块链网络上交易图谱进行的分析,这些方法被归纳为交易图谱分析(transaction graph analysis)
- 直接交易
- 通过服务提供商
- 疏忽——在论坛中链接自己的地址
2.6 网络层的去匿名化
这是一种不依赖于交易图谱的方法,这个是隐私保护的一个非常严重的问题,因为它的影响范围非常广泛。
当某个节点创建一个交易时,该节点就会和其他很多节点建立链接并且广播该笔交易。如果网络上足够多的节点串通起来(或者是被同一个攻击者所控制的),他们就能分辨出第一个广播交易的节点,并且可以因此推断,这个节点就是被创建这个交易的用户所拥有的。
- 主要思想:第一个交易节点很有可能就是交易源头
2.6.1 使用IP匿名化的系统——tor
用户只是一些普通人,想保护他们在网络上不被跟踪,也就是网络IP是匿名的,所以这是一种比较适合解决别人想要寻找交易源头的一种比较好的方案,当然可能有更合适的方案(因为这个方案还是有一定限制的,比如低延时,但是比特币是一个高延时,所以这里就有一点点冲突,其中混币网络是可能替代的方案)
在使用Tor系统为比特币实现网络层匿名化的解决方案的时候,有几个注意事项。首先,在Tor的协议和任何基于此协议的上层协议之间,可能会有一些复杂的交互,由此可能会导致新的破坏匿名化的方法。事实上,研究者已经发现,在使用Tor协议之上的比特币时,存在一些潜在的安全问题,使用这个方案的时候一定要非常小心。其次,可能有其他一些匿名通信的技术,会更适合比特币的使用。Tor的定位是针对那些低延迟的活动,比如网页浏览。在网页浏览的时候,你也不想坐在那里等半天,因此要取得低延迟,在匿名化方面可能要做出某些牺牲。相反,比特币则是一个高延迟的系统,因为比特币交易需要花时间来获得区块链上的确认。因此,至少在理论上我们可能更希望使用另外一种替代方案来实现匿名性,比如混币网络(Mix Net,参见本章6.3节)。但就目前来说,作为一个实际在运行的并且有广大用户基础的系统,Tor还是有一些优势的,而且这些用户的安全问题已经被集中地研究过。
3混币网路
混币的一个重要特性就是使得交易图谱变得不那么有效,
户发送比特币给一个中介媒体,并通过其他的用户回收比特币。这就使得在区块链上追踪一个用户的比特币,变得更加困难。
3.1 混币准则:
-
一致性交易(uniform transactions)
- 初始进入和从混币过程中出来的比特币数量必须要一致
- 最小化关联方面的一致性:混币中的交易价值能够服从平均分布,使用一个固定的混币输入值,就可以增强所有通过混币服务的交易匿名性,但同样这里块的大小选择很重要,比如大了的话就处理少量比特币的用户不方便而且比较浪费资源;块小的话就需要处理大量比特币的进行分割多个小的;
-
客户端自动化
- 功能应该是自动化的,并且是隐私保护比较好的钱包内置功能
-
手续费应该是要么全有要么全无
- 从每笔交易里去进行分成,那么很容易就泄露这笔交易的某些相关信息;所以策略就是采取要么全有要么全无,也就是所有交易对外面节点来看都是一样,这样一种混淆视听的感觉。
- 实际的实现就是:混币服务提供商应该要么在很小的概率情况下获得所有的交易金额,要么完全不收费。举例来说,如果混币服务商想要按照0.1%收费,那么应该是每1 000次交易中有一次服务提供商获得整个交易金额,而其他的999次则不收任何费用
3.2 不同的混币运作方案
-
有一组研究者,包括本书5个作者中的4个,研究了混币模式,不仅仅是从增强匿名性的角度,而且还从安全信任等级方面,提出了一系列改进混币运作的方案:
-
混币在线钱包
- 其实用已经 有的在线钱包去实现混币模式,因为在线钱包和混币之间其实是有很大的一个交集的,比如他们都是作为一个中介来进行不同的双方之间的支付的,但是混币多的一个功能就是需要把双方的交易变得混乱,不是那么一对一的,所以单纯的在线钱包还是有一定的缺陷,并且在线钱包还会保存一些记录:用来匹配你的存入和提取,一旦这些记录被人盗取或者分析出来就会有比较大的威胁了;
-
专项混币服务
- 不同于在线钱包,专门的混币服务既可以保证不留记录,又不需要你的身份验证。你甚至不需要一个用户名或者其他化名来使用这项服务,只需要发送比特币到混币服务提供的地址,并且告诉交易服务提供商你发送的比特币所需要达到的地址,混币服务提供商就会帮你转过去相同数量的比特币(不是你发送的比特币)。
- 本质上,这是一种互换。
- 还有一个区别就是专项混币并不支持存储比特币,那么就需要你信任它,相信他会把比特币转给你而不是转给其他人;
- 其实这还有一个很黑的名词,那就是洗钱,你可以想象一下洗钱的 过程是不是就和这个一模一样
-
多重混币的使用
-
只要这一系列中的任何一个混币服务提供者信守承诺并删除了记录,你就有理由相信,没有任何人能够将你的原始输入关联到你最终接收到的输出。
-
-
3.3 实践中的混币
- 糟糕的是,许多混币服务提供商被报告有盗币行为,或许“自举”这样一个生态系统太难,正是混币系统从来没有良好运行过的一个原因
- 基于混币服务提供商狡猾的名声,并没有多少人想要使用它们的服务,这也导致了较低的交易量,进而导致了不好的匿名保护,使用的人数直接就导致了匿名性不是太好
4. 分布式混币
定义:不同于一般的混币交易,指的是用一种用户之间的点对点模式实现混币交易的协议。
具有的优势:
- 没有自举的问题,用户不需要等待一个有公信力的集中式混币提供商出现。
- 盗币行为在分布式混币模式下几乎不太可能发生,这种协议可以保证你可以收回你在进行混币交易时等值的比特币
- 在某些方式中,分布式混币模式可以提供更好的匿名性。
4.1 实施方案——合币:
核心思想:不同的用户共同创建一个单一的比特币交易,该交易包含所有的用户输入。主要是虽然合并成了一个单一交易,但是合并之间的双方签名是相互独立的。
由于输入和输出地址的顺序是随机的,因此攻击者无法建立输入和输出的匹配关系
确认输出信息在交易中无误,而且输入以及输出的比特币大小是相匹配的,一旦确认之后就会对其进行签名
通过不不同组之间进行了交易的时候固定单位比特币交易的大小,这样就能够有效地避免交易信息的泄露。
- 实施步骤:
- 找到想要混币的交易对手,作为节点。
- 交换输入/输出地址。
- 建立交易。
- 发送这个交易给其他人,每一个节点在确认他们的输出地址之后,进行签名。
- 广播这个交易。
节点遵循上面的步骤的话就会导致多个节点按照正常按照程序走公布交易很简单,但是由于需要交易里面节点的全部签名,所以导致最终的交易不被确认也是很简单的(这是因为只要有一个恶意节点不想让你交易成功,它只需要不进行签名,并且只要系统考虑双重支付的问题,只要它先在另外的交易进行签名了,那么只要另外的交易先被确认了,它所想要破坏的交易肯定会如他所愿)
4.2 高风险交易流(high-level flows)
旁路攻击是通过多余的信息去分析关联性,其实如果我们反过来想它本身如果不是作为攻击而是作为一种防止别人攻击的角度(俗话说知道怎么攻击才能知道怎么防御),是不是就像你发完工资每个月需要保存一些家庭基金,正常情况下你发完工资为了方便就会马上保存进另外的一个专用银行卡里面(这种具有很大关联性的行为就是高风险交易流)——这样的行为之间无论从时间以及账户上面都是很有关联性的,所以如何消去这个关联性的问题就很是关键:
-
合并规避:用户会尽可能地组合所拥有的比特币,以便有足够多的数额可以支付到单一接收地址来完成交易。——也就是拆分而不是一个去转给多个地址,因为那样的话就说明了他们之间是有关联,尽量增加他们的独立性;
- 下面示意图是指:需要购买一个茶壶,价格是8块,但是手里没有完整的8块,所以我们尽可能组合起来,但是分多次支付,这样在外界看来就是几个不同的交易,他们之间就没有关联性。
- 可以规避的事情:如果某一个交易流水被拆分成许多互相无法关联的小额流水,攻击者可能就不会辨别这个交易;可以使依赖于识别单一交易中共时花费的多个比特币的地址簇技术失效。
5. 零币和零钞
之前的匿名加强技术,都是在原来的核心技术协议之上加载匿名化处理,零币和零钞则是在协议层就融合了匿名化处理。
5.1 零币
在系统里,基础币是你需要进行交易的货币,零币只是提供了一种交易基础币的机制,这种机制可以确保新币和旧币之间毫无关联。
用一个比喻来说,就好比你去赌场用现金换了一些扑克筹码,这些筹码就是一种证明,证明你存了多少现金,等你离开赌场时,就可以拿着这些证明去换相同数量的但并不一样的现金。当然,不像扑克筹码,除了你可以稍后用来赎回一个基础币,你并不能拿零币做任何事情。
核心思想:这种证明机制并不会显示你所拥有的是哪一个零币,而仅仅是证明你确实拥有一个零币。
5.1.1 零知识证明
定义:是零币和零钞所主要采用的证明方案,可以证明一个声明(数学上的)是正确的,而不需要展示可推导该声明正确性的任何其他信息。
正如上面的式子,你可以展示上述公式里的值来证明你做到了,但是零知识验证可以让你向别人证明你做到了这一点,同时不需要透露的值,即便在看过你的证明之后,所以这里关键的部分就在于——这个证明既没有展示x值是什么,也没有证明集合里面到底哪一个元素等于。
5.1.2 铸造零币
零币去创造价值的方式:只有把零币放到区块链网络上,并且通过消耗一个基础币的方式,它才能具备价值。
注意:零币只是用来提供一个证明然后消费基础币的,与现实中那种货币以及比特币的消费方式和作用都是不一样的
铸造零币的过程分为三步:
-
生成一个***和一个随机**。
-
计算一个函数,这是***的承诺。
-
如下图所示,在区块链上发布该承诺,这需要消耗一个基础币,此币不可再被花费,进而创建了一个零币。此时并和仍然是保密的。
为了消耗一个零币并赎回新的基础币,你需要证明你之前已经铸造了一个零币,公开去承诺和的值就会导致旧基础币和新基础币的关联,所以我们这里采用的方式——零知识证明
5.1.3 消耗零币赎回基础币
消耗一个具有***S的零币以赎回一个新基础币的步骤:
- 创建一个特殊的“花费”交易,这个交易包含***S和一个具备零知识验证的声明:“我知道在承诺对象中的r在以下的集合里:”;
- 矿工将会验证你的零知识验证,这将给予一个零币承诺的能力,而你并不需要真的打开它;
- 矿工也会查询***S,确认这个零币没有在之前的花费交易中被使用过(为了防止双重消费);
- 你的花费交易的输出将形成一个新的零币,你应使用你所拥有的一个地址来作为输出地址。
一旦你花费了一个零币那么相对应的序号就公开了,之后就需要使用其他的序号,所以也就是一个零币对应一个序号
5.1.4 相关特性实现
- 匿名性
- 一直是保持隐匿状态,不管是铸币交易还是花费交易都没有展示过,这意味着没有人知道哪一个***对应哪一个具体的零币,这就是零币匿名性背后的核心概念;
- 在区块链上,生成***的铸币交易和稍后公示S以赎回一个零币的花费交易之间,并没有关联性。——这就是通过零知识证明奇妙的方案。
- 效率
- 证明:“我知道在承诺对象中的在以下的集合里:;n代表的就是曾经被创建过的零币的数量,那么n会线性增大,因为需要验证生成的这个是不是在已知的集合里面,所以一般情况下复杂度就是n,但是在区块链优化结构之后可以做到n的对数(其实就是优化数组的保存)
- 所以效率还是不错滴,但是比起比特币还是差了一点,增加了相当大的额外开销,大概。
5.1.5 建立信任
零币从建立信任→铸造→消耗零币以赎回基础币的主要过程
用于搭建零币的工具之一(****累加器)需要进行一次性信任设置。那就是说在铸造零币之前就需要建立信任。所谓建立信任其实就是在这样一个场景下:
通过累加器,产生相对应的公钥以及私钥,我们知道的公私钥都是通过来产生的,那么当将公钥信息发送给其他所有节点之后就需要对、进行销毁,销毁完成之后这个节点我们就称它为被信任的节点
那么最后那个销毁的过程就是我们建立信任的关键步骤,只要销毁成功了这个节点就被信任,反之则不被信任
所以如何实现这个问题就是一个有趣的社会学问题,现在有很多种方案,比如:
- 阀值加密”技术,该技术可使用多个代理协同计算出N,而只要其中一个代理将自己的秘密输入销毁,这个系统就可以被认为是安全的。
- 不同的加密构造来避免设置这样一个被信任方
- 有实践表明,随机生成一个大数就具有很高的安全性,因为这样一个数字很有可能不能被完全分解。但遗憾的是,这样做会带来很大的效率冲击,因此这种方法并不实用,只是理论上可行而已。
5.2 零钞
5.2.1 相关背景知识
建立在零币的概念之上,但将加密技术提高到了更高的层次。零钞使用的是一种被称为的密码学技术,这种技术关键的部分就是使得整个网络可以不需要依赖一种基础币而运行,所有的交易都可以以零知识验证的方式进行,使整个系统变得更加的简洁。
零币也支持那些本不需要无关联性的普通交易,只不过在其上做了计算量昂贵的混币交易进行补充。这种混币交易由固定面值的数字币组成,交易价值的拆分与合并只能在基础币系统里实现。零钞系统做了优化就不需要有这种差异化的工作。
- 交易金额的大小被封装在一个承诺中,在区块链上不再可见,密码学证据确保了拆分与合并的正确性,用户并不能凭空创造出零钞
就匿名性和隐私性来说,零钞这种完全不可追踪的交易系统自成门派。因为公开账本并不包含交易金额,零钞对针对混币服务的旁路攻击是免疫的
5.2.2 建立零钞系统
之所以能做到上面所说的,是因为零钞也需要一个“公开参数”来设置这个零知识验证系统。零钞需要的是一个很大的公开参数集——其大小超过字节。比零币系统建立信任的时候产生的存储大小大的多。
零钞需要一组随机并且秘密的输入。如果任何人知道了这些秘密输入,就会产生无法监测的双重消费问题,从而危及整个系统的安全性
但是截至2015年,我们并不知道如何在实际操作中以足够稳妥的方式建立这个系统。迄今为止,zk-SNARK还没有被实际运用。只是理论上特别美好。
6. 匿名技术对比
参考文章:
1.解读区块链全套六册.第三册.第六章