比特币中不要求用真名,可以用公钥产生的地址,从这一点上来说,有一定的匿名性,可以产生任意多的地址,然后用不同的地址干不同的事情,也不是完全没有名字,用的是化名,所以有人认为这个叫做pseudonymity。就好像作家写作的时候有笔名,有人在网上发帖子用各种各样的网名,这是一样的。
匿名性有多好呢,能给我们提供怎样的隐私保护呢
比如说跟法币,美元相比,其实匿名性没有现金好,比如100元大钞,这个是完全匿名的,上面没有任何关于这个人的信息,假名都没有,所以很多非法交易用大额现金,用现金的问题在于不是很容易保管和运输。
跟银行存款相比呢,在银行账户的话,是实名制,要提交一些身份信息,然后才能注册一个银行账户,而比特币的话,不需要。其实国内的银行以前不是要求实名制的,可以用化名,如果跟这个版本的银行账户,还是比特币的隐私性,匿名性要好一些,因为比特币是在网上交易的,银行的话,就算是化名,取钱的时候,还得人去取。这里也牵扯到一个很重要的问题——比特币要把钱给取出来要怎么办?
在网上做交易没有问题,但是网上那些交易最终是要跟实体世界发生联系的,比如说在网上买东西,商家得把东西发给你,要用比特币换成法币,换成美元,还是得用东西把钱取出来,从某种意义上说,如果银行允许用化名的话,他的匿名性比特币要好,因为比特币这个区块链的账本是公开的,所有人都能查,而银行的账本是受控制的,银行里面工作人员可以差的到,然后有些司法手段可以调取银行的信息,但是普通老百姓查别人的账户是查不到的,这方面银行要比比特币要好。比特币是完全公开的,每个人都可以上区块链,把整个信息都下载下来。
比特币中什么情况下有可能破坏匿名性?
从表面上看,第一次接触比特币的人都觉得比特币的匿名性非常好,需要用到一个账户,生成一个公私钥对,然后下次在需要一个账户,再这么干一次,有人推荐每次收款的时候都用一个新的地址,这样的话,你有各种不同的地址,谁也不知道哪些是属于你的,这好像匿名性很强,但是实际上,在很多情况下,你创造的这些不同的地址是可以被关联在一起的,比如网上购物,比特币交易允许多个输入和多个输出,比如你想去买东西,这个交易的inputs由两个账户,一个是第一个地址来的,然后第二个地址来的,ouputs也可以由两个,第三个地址,第四个地址
假设这个交易发布到了区块链上,addr1和addr2很有可能是同一个人的,因为这个人同时控制这个账户的私钥,出现多个输入的是因为要买的东西一般很难恰好是你某一个账户的全部的值,所以会有多个输入,也会有多个输出,这两个地址中有一个很可能是个找零钱的地址,就你网上买东西,那个东西花的钱,剩下的那部分钱转到一个你的新地址,这种交易一般都是钱包软件生成的,每次钱包软件交易的时候会自动生成一个找零的地址,也是为了隐私保护,那有没有可能把输入地址和输出地址也关联起来,刚才讲的是输入的地址有n个,可以认为都是属于同一个人的,是由同一个人控制的,输出地址当中一般也有一个找零钱的地址,有没有可能把这个找零钱的地址也找到,有点难度,因为由两个地址,不知道哪个是找零钱的,就比特币生成这个交易的时候并没有规定找零钱的地址在output里的位置,就是说他不一定一定要在第一个输出,或者最后一个输出,但是其实有些情况下是可以分析出来的,比如看个具体的例子,比如第一个地址账户上有四个比特币,第二个地址账户上有五个比特币,产生了两个输出,第一个输出转入了六个比特币,第二个输出转入了三个比特币,那么这个时候哪个是零的地址?应该是第二个输入转入三个比特币的那个地址,因为如果第二个输出是商家的地址,干嘛要用两个Input,实际上一个就够了,通过这种方法,也可以把输入地址跟输出地址也关联起来。从理论上说,如果想要更强的隐私保护,可以人为的产生一些没必要的输出,就为了迷惑敌人,但是这些交易基本上是由钱包软件产生的,很少有人手工生成这些比特币的转账交易,常用的比特币钱包就那么几种,所以如果把这个常用的比特币钱包生成的交易方式搞清楚,那么区块链上很大一部分转账交易都可以分析出来,常用的钱包一般没有生成这种不必要的输出地址的,这是我们讲的有可能破坏比特币匿名性的第一个方面,就是这个人可以生成很多个地址账户,但是这些地址账户是有可能被关联起来的。
第二个方面,这个地址账户跟你在社会现实世界中的真实身份也可能产生关联,什么情况下别人会知道这个账户对应现实生活中的某个人呢
比特币系统中的虚拟货币跟实体世界发生联系的时候,都有可能泄露身份,就光是在区块链内部玩,从来不跟实体世界发生任何联系,这是没有问题的,一旦跟实体世界发生联系,就可能泄露你的真实身份,这里面其中一个最明显的就是资金的转入转出,大家平时是没有比特币的,你怎么得到你的比特币,假如是用钱去买,那就有资金转入的过程。你可以去交易所买,然后你要登记注册,一般是要有你的身份信息的,也可以有场外交易(两个人私下交易),比如说,A同学有比特币,B同学想买A同学的比特币,B同学把钱给A同学,A同学把比特币给B同学,但是场外交易也会泄露你的身份。过去的经验表明,很多国家有反洗钱法,那怎么防范用比特币洗钱的违法行为,盯住这个资金的转入转出链其实是一个常用的手段,就如果你有特别大的资金,像有些黑社会洗钱的,你要转入比特币里面,或者你有很多的比特币,你要转回成法币,这个想要不引起司法部门的注意,实际是很难的,这个也是比特币隐私有可能被破坏的一个很重要的时机,就资金的转入转出。实体世界中用比特币做支付的时候,比如说国外有些商家是接受比特币支付的,去咖啡店买咖啡可以用比特币支付,去餐馆吃饭可以用比特币支付,个人觉得这是一个bad idea,第一延迟很大,要等六个确认的话要等六个小时,第二交易费也很贵,交易费可能和咖啡本身差不多贵了,但是国外确实有收比特币的,收比特币的时候就会引起隐私泄露,就是你用户支付的账户跟你的真实身份是建立联系的,而这个账户可能跟比特币的其他账户也是有联系的,合在一起,就很容易把这个人的很多情况摸清楚了,这个不光是接收你支付的商家会知道,其他人其实也会知道,有一个例子,有一个信用卡的公司,为了支持学术界的科研,把他收到的交易记录给公开了,公开的时候做一些隐私保护,就是信用卡的号码都是取过哈希值的,你没有办法反推出信用卡号码是什么,然后个人信息,像姓名,性别,年龄都给抹掉,信用卡号码不能完全抹掉,因为科研中要研究各种不同的社会群体的消费习惯,或者是根据这个人的过去的消费行为推测他将来的消费,所以要有办法让研究人员把同一个人的不同刷卡记录要关联在一起,所以信用卡号码不能完全抹掉,取一个哈希,就是你知道哪些交易时同一个做的,但是你不知道这个人具体的信息是什么,真的有人做这个科研,但是是为了研究怎么通过这些公开的数据推测出这个人是谁,他证明这种方法是不行的 。比如说我想知道你是谁,我是你的邻居,然后在街区旁边的一个商店买菜的时候,你排在我前面,我看到你刷卡,但是我不可能看到你的信用卡号码,我也不知道他的哈希值是多少,但是我知道在今天的这个时候你在这个商店买了东西,有一个消费记录,在那个公开的那么多的消费记录可以过滤掉很多,只留下在这个时刻,在那个商店买东西的消费记录,然后过一段时间,我们去领医生开的处方药的时候,也是要交钱的,然后我再查一下,有哪些交易在这段时间去过这个地方,然后再像这样过滤几次,那个研究人员就发现,用不了多少次,很快就精准的对应出哪个哈希值是你,这个研究结果告诉我们,信用卡记录不能公开,但是比特币的交易记录不是保密的,他都是公开的,所以你去咖啡店,你去喝咖啡这个操作,你把你的比特币账户告诉了对方的营业员,不光是他知道你这个账户了,你周围有其他人是认识你的,就会意识到你在这个时候,这个地点有一笔消费,然后去查,区块链中有哪些账户在这个时候,在这个咖啡店进行了消费,然后可以推算出哪些账户有可能是你的,这么干一两次之后,你下次再去买披萨,又用比特币去买,很快就能知道哪个账户是你的了,这也是破坏你明星的一种方法。
所以比特币中的匿名性并不是绝对的,没有想象中那么好,那么实际当中怎么样呢。实际当中那些用比特币的人,他们的匿名性保持的有多好,所有用比特币的人中,匿名性保护得最好的人是中本聪,因为他根本就没有花钱,中本聪得比特币到现在都没有花出去,因为一旦要花出去,就要跟现实世界发生联系,就会暴露他的真实身份,这是中本聪不愿做的事情,他宁愿这些比特币一个都不花,也不愿意暴露自己的真实身份,所以他发明比特币可能不是为了钱,可能是为了某种信念,某种事业。曾经有一个叫做Silk road的网站,这是一个非法的网站,有人管他叫做eBay for illegal drugs,就他像eBay一样有一个网上交易平台,而且他也像eBay一样有一个reputation system,就你在网上进行交易的时候,这个商家的诚信怎么样可以打分,他都有一整套的,只不过他卖的是违禁品,有各种各样的非法的物品,为了逃避司法制裁,他的支付手段就是比特币,然后底下那个网络层用的是洋葱路由(TOR),然后在美国还用这种匿名的邮寄服务,最后运行了两三年,就被政府给查封了,他的幕后老板在旧金山被抓起来了,更重要的一点是这个人靠经营这个网站赚了很多比特币,他被抓的时候,美国政府没收了十几万个比特币,这个在当时大概价值几千万美元,这个人是很有钱的,但是只是在纸面上很有钱,他在旧金山过的是非常简朴的生活,就住在一个一室一厅的公寓里面,根本看不出有钱,赚的这些比特币一个都没有花,因为一花就暴露身份了,所以一个也不敢花,即使这样,最后还是被抓起来了,具体怎么抓的细节没有公开,据说是这个人有几次不小心用同一台电脑登录过他在真实世界的某个账号和他在非法网站上的某个账号,这个网站被查封之后,过了一段时间,有人又开了第二版的丝路,叫Silk road 2,也是运行没几年,也被查封了,还有一些类似的网上黑店,最后下场都不好。这个告诉我们比特币的匿名性没有想象中的好,尤其是如果你想用它来干坏事,过去的经验表明,凡是比特币从事违法活动的最后都能被抓起来,中本聪能够那么长期的保持匿名性,实际上是属于个例,并不是一个常态,而且他没有干坏事,还有很重要的一点,比特币这个项目走上正轨的时候,他就消失了,他就功成身退了,这也是他现在也没有 泄露身份的原因,他干这个事情不但不是为了钱,而且也不是为了名。
如果你就是个普通老百姓,你不想让你周围的同事,亲戚朋友知道你有多少比特币,就这是我的隐私,我挣了多少钱不想让周围的人知道,这个是容易实现的,就比特币现有的机制,在这种程度上保护你的隐私是比较容易的。
假如你是一个比特币用户,能采取什么方法尽量提高你的匿名性
前面说过比特币协议实际是运行在应用层的,底层是一个P2P Overlay Network,所以要提高匿名性要从两个方面入手。
在区块链出现之前,去网吧,在网上发布一个帖子,别人有没有办法知道你是谁,因为去网吧要有身份证,他会登记,查一下你的ip地址,就知道是谁做的,ip地址和现实生活中的身份是很有关联性的,所以比特币要实现匿名性,就要实现在网络层的匿名性,比特币交易发布到这个网络上的时候,如果不保证网络上的匿名性,如果很多节点都发现这个交易是从同一个节点发出来的,那么从这个节点的ip地址就可以推断出在现实生活中,他的真实身份是谁,好在网络上的匿名性是比较好解决的,在以前的研究当中,有很多的方法,区块链是个新生事物,但是网络层的匿名性,学术界已经有了很好的解决方案,那么比较普遍的就是一种多路径转发的方法,像我们前面讲得那个洋葱路由,就这个TOR,怎么才让大家不知道这个消息是谁发出来的呢,这个消息不是由sender直接发给receiver,而是中间要经过很多跳,很多次转发,中间的每一个节点只知道他的上一个节点,中间这一些节点当中有可能是坏的,但是只要这个路径上有一个节点是诚实的,就能把最初发件人的身份给隐藏起来,这是洋葱路由的一个基本思想
破坏匿名性的原因是同一个人的各个比特币账户之间会被关联起来,因为区块链是个公开的账本,你花的每一个币都可以追溯到他的源头,从这个币,最早是由哪个铸币交易中产生的,然后这个币参加的每一个交易都可以追溯过来,所以要起到匿名保护的作用,一种不同的人的做法就是把各个不同人的币混在一起,叫做coin mixing,有一些专门做coin mixing的网站,它提供这种服务,收取一定服务费,所有想做coin mixing的人把这些币发给这些网站,然后网站再把这些币重组,然后这些人再把处理过的这些币取回来,现在没有信誉度非常高的coin mixing服务,很多coin mixing的服务很多也是要匿名的,如果你投进去的币被这些人卷款跑路了,其实你一点办法也没有。在线钱包是很多人都把钱都存在这个钱包里,然后就有可能把这些人的币给混起来,可能你现在取回来的币不是当初存进去的币了,在线钱包本身就带有coin mixing的效果,但是在线钱包并不保证要履行coin mixing的功能。加密货币的交易所一般具有天然的coin mixing的性质,比如说我有一些比特币,我把它上传到一个交易所存在里面,过一段时间,我觉得比特币价格会下跌,我就把他卖出去,换成美元,又过一段时间我又买入以太币,然后我有可能把它换成莱特币,折腾几次之后,可能又买回比特币,然后提一笔提出来,存在我的本地,一般来说,我现在存在本地的比特币就不是我当初存进去的比特币了,前提是交易所不会泄露相关的记录,就选相关的提币存币转换的记录,否则的话,这整个记录暴露出去也是不行的。
保护隐私性难度大的本质原因是区块链是公开的,而且是不可篡改的
零知识证明是指一方(证明者)像另一方(验证者)证明一个陈述是正确的,而无须透漏除该陈述是正确的外的任何信息。
例子
比如说,我说某一个比特币账户是我的,我要证明这一点,要怎么证明?
如果这个比特币账户是我的,说明我应该知道他的私钥,实际上是要证明我知道他的私钥,但是我不能把私钥告诉你,那怎么办,但是我可以产生一个用这个私钥进行的签名,假设你是知道这个账户的公钥的,你可以验证一下这个签名的正确性。
这个例子当中:
证明者:我
验证者:你
证明的陈述:我知道这个账户的私钥
其实这个作为零知识证明的一个例子还是有争议的,虽然没有泄露私钥,但是泄露了用私钥产生的签名。
如果x,y不同,那么它们的加密函数值E(x)和E(y)也不相同。
加密函数值E不会出现碰撞,反过来说明,如果两个加密函数值是相等的,那么说明原来地输入也是相等的
给定E(x)的值,很难反推出x的值。
说明加密函数是不可逆的
给定E(x)和E(y)的值,我们可以很容易地计算出某些关于x,y地加密函数值。
说明对这些加密函数值进行代数运算,等价于对这些输入直接进行代数运算,然后再加密
—同态加法:通过E(x)和E(y)计算出E(x+y)地值
—同态乘法:通过E(x)和E(y)计算出E(xy)地值
—扩展到多项式
例子
Alice想要向Bob证明她知道一组数x和y使得x+y=7,同时不让Bob知道x和y的具体数值.
在这个例子当中
证明者:Alice
验证者:Bob
证明的陈述:Alice知道一组数x和y使得x+y=7
需要隐藏的:x和y的具体数值.
简单的版本
这个简单的版本有一个缺陷: Bob可以用蛮力算法,一个一个试而计算出x和y的值,因此Alice要对x和y的值做一些随机化处理,保证x和y加起来还是不变的。
不考虑去中心化的前提下,前面在讲double spending时讲过,要对每一个数字货币进行编号就能防止double spending。回到这节课讲的隐私保护问题,央行是什么都知道的,那么有没有什么办法让央行做中心化的记账检测double spending,又不让它知道呢?即虚拟货币的编号不能是央行产生的,改成自己产生的,又不会被篡改掉。
这里就要用到盲签方法。
用户A提供SerialNum,银行在不知道SerialNum的情况下返回签名Token,减少A的存款.
说明:用户A提供序号,银行进行签名但此时看不到序号的内容,A要取钱所以银行要减少A的存款。
用户A把SerialNum和Token交给B完成交易
说明:A给B转账交易的时候把序号和签名给B,这个时候序号是明文,B是可以看到序号的具体内容的。
用户B拿SerialNum和Token给银行验证银行验证通过,增加B的存款
说明:B把序号和签名给银行验证,这个时候序号也是明文,这一步验证的目的是检测double spending。
银行无法把A和B联系起来
中心化
这样设计的好处是:银行不知道B的币是从哪来的。
比特币在很大程度上提供了匿名性,但它不能完全消除关联性,那么我们能不能设计一种新的加密货币,这个货币从一开始的结构设计上就用了密码学的原理保证了匿名性,所以就有了零币和零钞。
这是专门为匿名性设计的加密货币。
零币中存在基础币(比如比特币)和零币。用的时候要证明本来是有一个基础币,让基础币变得不能花费(unspendable),然后换取一个零币,零币在花的时候只需要用零知识证明你花掉的币是系统中存在的某一个合法的币就行了,但是不用透露你花的具体是系统中的哪一个币。这是跟比特币的一个本质区别,比特币是每一笔转账交易都要说明币的来源。这样才能证明花的币的真实性不是凭空捏造出来的。但零币和零钞不是这样,零币和零钞是说证明的时候可以从数据上保证你花的币是以前区块链上某个合法存在的币,但不知道具体是哪个。这样的话就把关联性破坏掉了,也没法追溯了。
零钞没有基础币,是完全的零币。
零钞和零币也不是100%匿名安全的,在影响匿名安全的因素中依然有一个因素无法解决,就是与实体发生交互的时候。比如有人想拿这些币干坏事,把很大的金额转换成这种加密货币的时候,或者是把这些加密货币转换成现金的时候,仍然要暴露身份。这些加密货币数学上设计的再好,只是说对已经在区块链当中的转账有匿名性,跟外界交互的匿名性仍然是一个弱点。所以它依然无法提供100%的匿名。