区块链安全思考
一、安全事件分类
区块链相关的安全事件被分为三类,分别是OPSEC、智能合约、共识协议。
OPSEC
,是指入侵组织和个人控制的信息来访问商业资产;智能合约
(Smart Contracts),是指由于不适当地运用和执行智能合约导致的事件;共识协议
(Consensus Protocol Incentives),是指恶意利用共识协议导致的事件。
1.智能合约安全
智能合约是一套以数字形式定义的承诺,承诺控制着数字资产并包含了合约参与者约定的权利和义务,由计算机系统自动执行。智能合约的实现是基于区块链平台的,而区块链平台是基于分布式的共识协议的。
目前,像Ethereum这样主流的智能合约平台,都遵循复制执行的模式。在该模型中,智能合约的代码、对智能合约方法的调用,都不可逆地加入区块链中。每个参与区块链协议的节点都可以看到代码并从区块链中调用、实例化、执行系统的调用,得到相同的结果,维护相同的状态。
从安全的角度考虑:
首先,智能合约的开发生命周期与传统软件开发生命周期不同,尤其是测试、集成和维护是可重复的。因为智能合约的代码加入区块链以后就不能修改了,所以开发者如果想修改,就需要把代码绑定到变量中。因此,智能合约的开发生命周期就与标准软件不同。
其次,节点上的错误或使用智能合约中发现的错误是不可逆的,而且成本很高。事实上,黑客会经常寻找应用的智能合约中的漏洞,并报告给漏洞悬赏计划(项目)。而且这类攻击很难预防,因为应用的代码不能回顾去打补丁。当检测到漏洞后,必须应用新的智能合约来修复它。虽然这对开发者来说很难,但对社区来说,这或许是一种积极的方式。比如,开发者在修复已经应用的智能合约时,这样的修复可能会带来一些附带的损害,因为其他的智能合约可能是依赖修改的合约。 而且开发者认为是漏洞的智能合约可能对依赖智能合约的开发者来说只是一个特性。从这个意义上说,智能合约与立法相似(Code is Law),因此,代码应该保持稳定,在应用前也应该仔细检查。
2.验证和测试
验证和测试对智能合约的开发来说是非常重要的,应当继承到分析和设计的过程中。
安全测试的目的就是确定程序中是否存在攻击者可利用的漏洞。智能合约也是一种程序,所以可能含有漏洞。智能合约一般比较短,但是同时存在的和永久的,所以与普通程序相比,更难变得正确。
智能合约漏洞除了含有一些通用(经典)漏洞外,还含有一些特定漏洞。
3.安全智能合约分发
因为智能合约平台大多都与加密货币相关联,因此也是诈骗的传播媒介。在传统软件分发时,有许多的模型来处理这些问题。比如,许多的开源项目背后都有社区对漏洞进行修复,提高工程(项目)的质量。而中心化的软件一般都有公司在背后运营。
相比之下,智能合约的分布不遵循以上的模式。开发者提交了智能合约后,智能合约就会被矿工加入区块链中。智能合约平台的不可逆性和共识抵抗性不允许任何人移除加入到智能合约,所以提出这样的安全架构是非常复杂的。
当前智能合约平台的矿工的激励具有冲突性:
- 矿工愿意增加每个提交的智能合约到区块链上,因为可以得到奖励;
- 矿工也需要确保生态的安全性,否则平台的热度过低也会影响得到的奖励。
所以一个安全的智能合约发布架构需要增加所有提交的智能合约到区块链上,同时要测试平台的安全性。
二、加密经济协议
以太坊社区开发者VladZamfir认为:“这是一门独立的学科,旨在研究去中心化数字经济学中的协议,这些协议被用于管理商品及服务的生产、分配和消费。它也是一门实用科学,重点研究对这些协议的设计和界定方法。” 加密经济学是利用激励和密码学来设计的新型的系统,应用程序和网络。加密经济学专门关于构建事物,并且与机制设计非常接近(一种关于数学和经济的理论)。
加密经济学目前属于多学科的交叉领域,包含了金融学、加密学、治理、法制、博弈论、行为经济学等众多的学科。通过密码学,网络理论,计算机科学和经济激励的巧妙结合,我们可以构建新技术。这些新的密码经济学系统可以完成这些学科自己无法实现的事情。区块链只是这种新的实用科学的一个产物。
以比特币、以太坊等为代表的加密货币,创造了一种全新的经济模型。该模型有效的将不同角色的人的利益实现了统一,并通过简单的运行规则,实现交易网络的不断壮大。 以比特币为例,比特币网络之所以能发展壮大,得到全球越来越多用户的支持,这和比特币的经济模型是分不开的。
比特币的创新之处在于它允许许多彼此不熟悉的各方可以可靠地就比特币区块链的状态达成共识。这是通过使用经济激励和基本加密工具的组合来实现的。
比特币的设计依赖于经济激励和惩罚。经济报酬被用来招募矿工来支持这个网络。矿工们贡献自己的硬件和电力,因为如果他们生产新的矿块,他们会获得大量的比特币奖励。
其次,经济成本或惩罚是比特币安全模型的一部分。攻击比特币区块链最显而易见的方式是控制大部分网络算力 - 所谓的51%攻击 - 这会让攻击者可靠地审查交易,甚至改变区块链的过去状态。
但是,获得算力的控制要花钱,这些花费通过硬件和电力的形式体现。比特币协议有意使得挖矿变得困难,这意味着获得对大部分网络的控制是非常昂贵的 - 足以使得从攻击中很难获利。截至2017年11月16日,51%的比特币攻击成本约为31.4亿美元硬件成本和每天560万美元的电力成本。
如果没有这些经过精心设计的经济激励措施,比特币系统将无法运行。如果采矿没有高成本,那么发动51%的攻击就会很容易。如果没有采矿奖励,那么没有人会购买硬件并支付电费来为网络做贡献。
比特币也依赖于加密协议。公私钥加密技术被用来为个人保护财产提供安全的,独一无二的方式。哈希函数用于“链接”比特币区块链中的每个区块,证明事件的顺序和过去数据的完整性。
这些加密协议为我们提供了构建像比特币这样可靠,安全的系统所需的基本工具。如果没有像公私密钥基础设施这样的设计,我们将没有办法保证自己对比特币拥有唯一控制权。没有哈希函数之类的设计,节点将无法保证比特币区块链中包含的比特币交易历史的完整性。
如果没有哈希函数或公私密钥加密等密码协议的硬性执行,我们将没有可靠的方式来奖励矿工 - 人们也将无法信任系统中记录的过去的帐户是真实的。如果没有一套经过认真校准的激励机制来奖励矿工行业,那么这个账户单位就没有市场价值,因为无法支撑用户对该体系未来的信心。
通过比特币的例子我们看到,通过技术和经济手段,我们创造了一种全新的经济模型和协作方式。该模型建立了陌生人之间的大规模p2p环境下的高可靠交易网络。目前比特币的算力网络是全球最大的计算网络,超过全球所有超级计算机的算力总和。这是人类历史上的奇迹。
比特币的加密经济学属性
- 它是基于区块链技术而产生的货币。其中,每个区块都包含前一个区块的哈希值,从而形成一条连续链。
- 每个区块都包含多笔交易。
- 新产生的交易会使所有区块的特定状态得以更新。例如,如果A有50个比特币,且想把其中的20个比特币发送给B,那么在新的状态下就会显示:A只剩下30个比特币,而B拥有20个新的比特币。
- 区块链必须是不可变的。只可能新增区块,而不可篡改旧的区块。
- 仅允许有效交易。
- 区块链应当是可下载的,任何人在任何地点都可以轻松接入并查询某笔特定的交易。
- 如果支付了足够高的交易费用,则交易可以被快速添加至区块链上。
参考文章: 区块链安全思考
三、比特币的半匿名性
比特币的虽然使用的是非对称加密算法,但是在实际交易中,如果被人找到了一个“身份标识点”,那么很有可能会暴露身份信息。
参考文章:比特币匿名性其实有迹可循 找到“身份标示点”可轻易锁定目标
比特币也没有地址隐私性,因为根据目标地址可以在交易浏览器上查到该地址所有的交易。
同时,可以看出比特币其实是半匿名性
的。
提出的改进方案如下:
1.CoinJoin方案
CoinJoin的原理是把不同用户的多个交易合并为一个交易。
CoinJoin不需要改变比特币的协议,实施起来相对容易。目前为止,已经投入使用的方案较多是采用中间服务器(大的比特交易区则为中间服务器),需要CoinJoin用户在服务器上进行登记,由服务器聚合多个用户请求生成大的交易,经过各个用户进行签名后发布到比特币网络中来。然而事情并不是十全十美的,虽然我们使用这种方法可以达到混淆的目的,但是中间服务器可以掌握所有用户的输入输出地址,对于该服务器来说用户的隐私则一览无余。倘若中间服务器被攻破,那么我们所有的信息则就都被公开了。
CoinJoin落地的具体协议算法——Coin Shuffle。
混币(Coin Shuffle)是一个去中心化的隐私功能,它可以让用户快速高效地与其他用户的资金进行混合,在现有的用户账户和混币后的新账户之间创建随机的映射关系,从而实现完全匿名。
2.Zcash中的匿名性
-
Zcash是一个去中心化的开源密码学货币项目,通过使用先进的密码学技术提供交易隐私和可选择的透明性。
-
Zcash支付被发布在一个公有区块链上,但是交易发送者、接收者和交易数额是保密的。
-
Zcash交易的元数据是加密的,而不是公开地展示交易参与方和交易数额,zk-SNARK被用来证明没有人进行欺骗或者偷窃。
除此之外,Zcash除了对隐私有极大追求的匿名功能外,也可以进行公开透明的交易,其操作类似于比特币,而与比特币最大的不同是Zcash给客户同时提供了透明地址和隐私地址以供选择,当你需要隐藏账户的资金时,则可以选择向隐私地址发送Zcash,如果你不需要将交易的资金隐藏起来,你也可以选择使用向透明地址发送Zcash的方式完成交易。
Zcash中所涉及的密码学知识以及协议内容:snarks的文档:解释SNARKs第一部分:同态隐藏 - 电币公司 (electriccoin.co)
1. 零知识证明
在比特币的协议中,当A准备向B进行交易一张“支票”。那么B将生成一份新的同等金额的“支票”,而A中的支票进行销毁处理。而这个过程会被矿工进行记账处理,并发布给所有节点。
而Zcash为了增强匿名性,它拥有两种地址:z-地址与t-地址。其中t地址是公开地址(如同比特币中地址)而z地址是秘密地址。此时如果A要转账支票给B,要经过如下的过程:
- 1 ,A用自己的私钥对支票进行签名,并得到一串新的字符串r。此时我们用Z1代表A的支票。
- 2 ,而与比特币一样,B也需要新建一张支票(Z2),而Z2与Z1的代号并不相同。
- 3,当交易产生时,我们需要销毁原A的支票。但是与比特币不同的是,我们不是直接销毁Z1,而是引入了 “作废文件列表” 的概念。从下图可以看出,原先的A持有的支票仍旧存在,并没有消失,只是这张支票已经被记入“作废列表”。在确定资产所有权时要同时读取两个列表的信息,能确定Bob拥有资产所有权的判断方法是:作废列表中不存在B所持“支票”的代号。
简单来说,发票列表里的值是不会被删除的。当发票不能使用后直接记录在作废列表里即可。
而在具体的交易过程中,我们可以进行如下操作:
首先我们定义每个用户的私钥为PK1、PK2....PKn。
之后我们定义n个支票Note1=(PK1 , r1)、Note2=(PK2 , r2)........Noten=(PKn , rn)
为了达到匿名的效果,我们使用哈希函数对其压缩,使其不可逆。H1=HASH(Note1)、 H2=HASH(Note2).......Hn=HASH(Noten)
之后引入废弃集合的概念:
发票列表 | 废弃列表 |
---|---|
H1=HASH(Note1) | HASH(Z1) |
H2=HASH(Note2) | |
H3=HASH(Note3) |
上面的列表中代表我共产生了n个支票,Z1为支票标识,废弃列表中的Z1表示我第一张发票是作废无用的
当用户2要给用户4转移一张支票时,用户2会选择随机数r4并生成新的支票Note4 = (PK4 , r4)
并将其密码传递给用户4。之后用户2将HASH(Z2)
与HASH(Note4)
发送给系统中所有的节点。并得到如下表格:
发票列表 | 废弃列表 |
---|---|
H1=HASH(Note1) | HASH(Z1) |
H2=HASH(Note2) | HASH(Z2) |
H3=HASH(Note3) | |
H4=HASH(Note4) |
这些过程均由矿工进行记账。因为资产只能有一份,所有矿工手里还有一个作废列表。Alice要同时广播自己的“发票代号”,录入作废列表中。发票代号也是加密的。所以矿工们能看到的信息其实是这样的。其中Alice的支票是原先存在的,Alice的支票代号r1和Bob的支票是在交易过程中被Alice广播的。
矿工们能获取的信息相当有限,但是这并不影响对矿工对交易有效性的判断。
判断的逻辑相当简单:矿工拿到A给的支票代号Z1,去作废列表中检索,假如作废列表中已经存在Z1,则证明Z1所对应的的支票早已失效;若作废列表中并不存在Z1,则证明Z1对应的支票仍旧有效,此时矿工把Z1录入作废列表中,把新生成的支票录入支票列表中。所以记账的过程就是对原有支票登记失效,并存入现有支票票的过程。
在这个过程中,我们不难发现,每笔交易矿工能接收到的东西只有一个发票代号,和一张新的发票,而且这两样东西都是被加密的。所以矿工并不知道转账双方是谁,也不知道转账金额是多少。
3.门罗币
门罗币的匿名性主要是由其环形签名技术实现的。在十七世纪的时候,法国群臣向国王进谏时,为了不让国王追查到是由谁带头签名上书的,于是他们发明出了一种环形签名的方式,所有人的姓名按环形排列,自然的隐藏了签名顺序,从而做到无法追查源头。
对于匿名性来说,我们要做到以下两点才算合格:1,接收方不可追踪、2,发送方不可追踪
。而对于门罗币来说,以下三点是满足他匿名性的关键。
- 环签名 - 发送方,不可追踪
- 混淆地址 - 接收方,不可链接
- 环机密 - 交易金额的隐匿
1 环签名
大家联名上书提意见的时候,怎样让外界难以猜测发起人是谁?上书人的名字可以写成一个环形,环中各个名字的地位看上去彼此相等,因此难以猜测发起人是谁。假设,Alice 发送 5XMR(XMR 即门罗币) 给 Bob,设定混淆交易数量为5。网络在转账时会自动生成5笔5XMR的转账交易,除了Alice发送给Bob的这笔,另外的4笔都是用来瞒骗外界观测者的“诱骗交易”,这样达到隐匿发送方的目的。
2 地址混淆
混淆地址是为了打破输入输出地址之间的关联,以此隐匿转账的来去关系。每当发送者要发起一笔转账的时候,这笔资金不会直接打到接收方的地址,而是打到一个系统临时生成的地址。
Alice向Bob转账时,发送者Alice用接受者Bob的公钥私钥加上一些随机数,生成一个独一无二的、一次性的地址,系统给这个临时地址添加5XMR。观测者,包括Alice、Bob自己都能看到这个临时地址,但都不知道地址里的钱属于谁。那么Bob怎么知道有人给自己转账,怎么收到这笔钱呢?Bob的钱包会用私钥进行搜索功能,查看区块链上的临时地址是否有属于自己的钱。当Bob的私钥(仅有接收方Bob自己的私钥能够)识别出自己有权认领的临时地址,就能使用这笔钱。
3 环机密
Alice怎么告诉区块链网络转账金额是5XMR呢?在 RingCT 的交易中, Alice 不会直接公开给网络5XMR,而是提供一个数字rct,作为交易金额输出。rct= 随机数 + 5(真正的交易金额)。 随机数是用来为真实金额遮盖的,由钱包自动产生。网络可使用这个rct值去验证交易输入是否等于交易输出的金额,以确认没有额外的 门罗币被伪造产生。 然而,对于一个外部的观察者而言,无从得知实际交易金额。