区块链技术的安全问题研究综述
2018-11-15徐淑珍
顾 欣 徐淑珍
1(工业和信息化部电子第五研究所 广州 510610)2 (天讯瑞达通信技术有限公司 广州 510623)
从2009年比特币诞生到以太坊和开源项目Hyperledger Fabric等等,至今,许多区块链技术架构或区块链平台不断被开发出来,区块链技术也发生着日新月异的变化.区块链技术是多种底层技术的融合[1],主要包括:点对点网络技术、密码学技术、块链式结构和共识算法等等.虽然智能合约并不是区块链系统的必要组成部分,但由于区块链具备不可篡改、规则透明、多方执行等特性[2],使它可以很好地为智能合约提供可信的计算环境.因此,我们首先对4种典型区块链技术框架进行介绍,然后从区块数据结构、密码学、共识机制、智能合约等方面进行对比,分析存在的安全问题.
1 区块链技术架构
1.1 比特币
比特币(BitCoin)是最早也是全球最广泛使用和真正意义的去中心化区块链技术,因此其开源技术体系非常值得参考.
比特币区块链的核心技术框架采用C++语言开发,共识算法采用PoW算法,即常说的挖矿,PoW机制需要争夺记账权,达成共识的效率低、能耗高,容错率为50%,实现全网记账.比特币的交易其实是转账,而转账费用又相当高昂,这就阻止了用交易触发来实现智能合约.
1.2 以太坊
以太坊是一个图灵完备的区块链一站式开发平台,采用多种编程语言实现协议,采用Go语言写的Geth客户端作为默认客户端.基于以太坊平台之上的应用是智能合约,这是以太坊的核心.智能合约配合友好的界面和外加一些额外的小支持,可以让用户基于合约搭建各种千变万化的DAPP应用,这样使得开发人员开发区块链应用的门槛大大降低.
以太坊1.0版本采用的是PoW共识算法,目前以太坊运行的版本是1.5,采用类PoS的Casper算法,以使区块链的确认速度相对于PoW的线性效率达到指数级,大幅降低资源消耗.
在规划的以太坊2.0版本目标是从混合式系统开始,将PoS+PoW混合挖矿作为以太坊2.0升级的开端,预计在2017年底正式切换到PoS协议.
1.3 Hyperledger Fabric
Hyperledger Fabric是一个带有可插入各种功能模块架构的区块链实施方案,其目标是打造成一个由全社会来共同维护的一个超级账本.
作为一个区块链框架,Fabric采用了松耦合的设计,将共识机制、身份验证等组件模块化,使之在应用过程中可以方便地根据应用场景来选择相应的模块.除此之外,Fabric采用了docker技术,将智能合约代码放在docker中运行,从而使得智能合约几乎可以用任意的高级语言来编写.
Fabric0.6版本架构结构简单,采用“应用—成员管理—Peer”的三角形关系.主要业务功能全部集中于Peer节点,但由于Peer节点承担了太多的功能,所以带来扩展性、可维护性、安全性、业务隔离等方面的诸多问题.
目前,Fabric1.0 alpha版本已发布,其特点是分拆Peer的功能,将区块链的数据维护和共识服务进行分离,共识服务从Peer节点中完全分离出来,独立为Orderer节点,提供共识服务;基于新的架构,实现多通道的结构,实现了更为灵活的业务适应性,支持更强的配置功能和策略管理功能.
1.4 Ripple
Ripple是基于区块连的点到点全球支付网络.Ripple有2个重要概念:其一是推出瑞波币,它作为Ripple网络的基础货币,就像比特币一样可以在整个网络中流通,主要是燃料Gas的作用,每产生一笔交易就会消耗一些XRP;其二是引入网关系统,它类似于货币兑换机构,允许人们把法定货币注入、抽离Ripple网络,并可充当借、贷双方的桥梁.
Ripple引入了一个共识机制RPCA,通过特殊节点的投票,在很短的时间内就能够对交易进行验证和确认.Ripple客户端不需要下载区块链,它在普通节点上舍弃掉已经验证过的总账本链,只保留最近的已验证总账本和一个指向历史总账本的链接,因而同步和下载总账本的工作量很小.
2 区块链技术安全性分析
本节从区块数据结构、密码学应用、共识机制、智能合约等区块链技术组成方面进行分析.
2.1 区块数据结构
在区块数据结构中,每个数据区块一般包含区块头和区块体2个主要部分,区块头封装了当前版本号、前一区块地址、当前区块的目标哈希值、默克尔根以及时间戳等信息.典型区块数据结构如下:
比特币区块结构包括区块大小、区块头、交易计数器、交易.其中,区块头主要包括版本、父区块头哈希值、默克尔根、时间戳、难度目标、nonce等[3];
以太坊区块结构包括区块哈希(blockHash)、区块号(blockNumber)、父哈希(parentHash)、时间戳(timestamp)、难度(nonce)、交易哈希、使用容量(gasUsed)、总容量(gasLimit)等;
Fabric区块结构包括版本、前一区块哈希(previousBlockHash)、区块交易的默克尔根哈希(transactionsHash)、时间戳(timestamp)、世界状态的默克尔根哈希(stateHash)等;
Ripple区块结构包括区块索引、区块哈希(ledge_hash)、父哈希(Parent_hash)、账户哈希(account_hash)、时间戳(close_time)、总币数(total_coins)、交易哈希等.
区块使用哈希值作为区块的唯一标识,每个区块记录了前一区块或父区块的哈希值,这样就通过每个区块链接到其父区块的哈希值,形成了一条所有区块的链状数据结构.
2.2 密码学
区块链技术中使用了哈希函数和非对称加密算法.
哈希函数:区块链通常并不直接保存原始数据或交易记录,而是保存其哈希函数值,即将原始数据编码为特定长度的由数字和字母组成的字符串后记入区块链.哈希函数(也称散列函数) 具有诸多优良特点,因而特别适合用于存储区块链数据.
非对称加密:非对称加密是为满足安全性需求和所有权验证需求而集成到区块链中的加密技术,常见算法包括RSA,Elgamal,Rabin,D-H,ECC(即椭圆曲线加密算法)等.非对称加密通常在加密和解密过程中使用2个非对称的密码,分别称为公钥和私钥.非对称密钥对具有2个特点:首先是用其中一个密钥(公钥或私钥)加密信息后,只有另一个对应的密钥才能解开;其次是公钥可向其他人公开,私钥则保密,其他人无法通过该公钥推算出相应的私钥.非对称加密技术在区块链的应用场景主要包括信息加密、数字签名和登录认证等.
比特币、以太坊、Fabric、Ripple均使用美国国家标准技术研究所发布的安全哈希算法SHA,输出256b,同时我们比较MD5,SHA1,SHA256算法与国密SM3哈希算法[4],其结果如表1所示:
表1 典型哈希算法比较
比特币、以太坊、Ripple使用的是椭圆曲线数字签名算法(ECDSA),其中,Fabric支持使用Fabric CA进行数字签名,Fabric CA是Hyperledger Fabric的证书颁发机构,它提供的功能包括:1)身份的注册,或连接到LDAP作为用户注册表;2)发放注册证书(ECerts);3)发布交易证书(TCerts),在Hyperledger Fabric blockchain上进行交易时提供匿名性和不可链接性;4)证书更新和撤销.
目前区块链采用的哈希算法和数字签名算法是相对安全的,区块链的密码学机制随着数学、密码学和计算技术的发展变得越来越脆弱,同时区块链技术中私钥是用户生成并保管的,没有第三方参与,私钥的使用和保存状况是一个重要的安全问题,而私钥安全才能保证区块链应用安全.
2.3 共识机制
共识机制是区块链技术框架的核心,数据分散在各个参与验证的节点中,共识算法的作用是使数据保持一致性,否则系统将无法正常工作.
比特币和以太坊1.0版采用了PoW机制来保证账本数据的一致性.PoW通过经济激励的方式来鼓励节点参与区块的构造过程,节点在构造区块时需要穷举一个随机数以使得区块符合规定的难度要求,为了维护区块链,则需要全网具备较大算力支撑来保证网络的安全性,否则账本数据就有可能被篡改.此外,即使维持较大算力来保护网络,PoW也无法从根本上保证交易的最终性,比如比特币就经常产生孤立区块,而包含在孤立区块中的交易就有可能被撤销.因此比特币通常要求用户等待6个区块的确认,即1 h左右的时间.而为了维护算力而支出的电力成本也相当可观.
目前以太坊1.5版采用了类PoS的Casper算法.PoS主要思想是节点记账权的获得难度与节点持有的权益成反比,相对于PoW,一定程度减少了数学运算带来的资源消耗,性能也得到了相应的提升,但依然是基于哈希运算竞争获取记账权的方式,可监管性弱.该共识机制容错性和PoW相同.总结来说,PoS是PoW的一种升级共识机制,根据每个节点所占代币的比例和时间,等比例地降低挖矿难度,从而加快查找随机数的速度.
Ripple引入了一个“RPCA”机制,通过特殊节点的投票,在很短时间内就能够对交易进行验证和确认.Ripple的交易确认过程可在几秒钟之内完成,当确认交易的节点百分比低于某一阈值时,交易未能通过一轮共识.每一轮都是一个迭代过程.在首轮投票开始时,至少50%的节点必须同意.达成共识的最后一个阈值是80%的节点同意.这些特定的值会发生变化.
Hyperledger则是采用类似Ripple共识机制,达成共识则是通过拜占庭容错算法[5]机制.节点被分为普通节点和记账节点(validating peer),只有记账节点才会参与到区块的构造过程,这种角色的分离使得算法的设计者有机会将运行共识算法的节点数量限定在一个可控的规模内.
相比较而言,工作量证明、权益证明机制提供了极高的灵活性和可用性,因为每个节点都独立构造区块而几乎不需要其他节点的参与,节点可以随时加入或者退出网络,即使全网只剩下1个节点,网络还是可以继续工作,但是挖矿造成大量的资源浪费,共识达成的周期较长,不适合商业应用;而拜占庭容错的机制则与之相反,牺牲了一定的灵活性和可用性,记账节点必须在线提供服务而不能退出网络,一旦出现13的记账节点停机,那么网络将变得不可用.
2.4 智能合约
区块链技术的智能合约是一组情景——应对型的程序化规则和逻辑,是部署在区块链上的去中心化、可信息共享的程序代码.签署合约的各参与方就合约内容达成一致,以智能合约的形式部署在区块链上,即可不依赖任何中心机构自动化地代表各签署方执行合约[6].智能合约具有自治、去中心化等特点,一旦启动就会自动运行,不需要任何合约签署方的干预.
智能合约可视作一段部署在区块链上可自动运行的程序,是由事件驱动的、具有状态的、获得多方承认的、运行在一个可信共享的区块链账本上的、能根据预设条件自动处理账本上资产的程序.其运行机理为:当一个预先编好的条件被触发时,智能合约执行相应的合同条款.其涵盖的范围包括编程语言、编译器、虚拟机、事件、状态机、容错机制等.智能合约只是以计算机代码程序这种方式与真实世界的资产进行交互,其致力于将已有的合约法律法规以及相关的商业实践转移到互联网上,使得陌生人通过互联网就可以实现以前在线下开展的商业活动,其优势是利用程序算法替代人仲裁和执行合同,能够高效地实时更新,同时合约能够得到准确执行,并且存在较低的人为干预风险.
从目前来看,虽然智能合约借助区块链技术达到了前所未有的应用程度,但其仍旧存在安全隐患,在合约代码实现中,存在非法操作、合约代码未检验等安全性问题,导致合约无法终止.在作者对区块链产品测试中,发现大部分产品实现的智能合约未进行合约代码检验,导致合约代码出现边界值、死循环、内存溢出等安全问题,导致合约无法正常执行.
一般情况下,针对上述问题,对于合约存在空值调用返回情况,应在合约规则中进行约束处理,避免此种情况造成合约调用不生效;为避免合约出现不可终止情况,智能合约可采取GAS消耗方法,即合约代码中每执行一步或每段代码可消耗一定的数目代币,以太坊、Ripple目前采用此种方法;同时可以控制合约运行时间以及限制合约可运行步骤数等3种方式来确保合约正常安全运行.
2.5 其他方面
区块链技术在账户、身份认证以及存储方面也作了比较,结果如下:
关于账户方面,比特币里没有账户概念,所有余额均通过UTXO计算而得.而以太坊和Fabric里均有账户概念.以太坊的账户分为普通账户和合约账户,每个账户对应有永久存储空间,存储该账户的以太币余额等.Fabric中账户即为chaincodeID,每个被部署的chaincode(Fabric中对智能合约的叫法)就是一个账户,每个账户也对应有永久存储空间,存储自定义的键值对.这样,数据隐私就成为了一个问题,使用地址进行交易,具有匿名性,但交易记录完全公开,一旦地址与真实身份联系起来,数据隐私将会暴露出来.
关于身份认证,比特币和以太坊基本没有身份认证的设计,原因很简单,因为这两者的设计思想都是强调隐私和匿名,反对监管和中心化,而身份认证就势必要引入一些中心或者弱化的中心机构,Fabric使用数字证书进行身份认证,Ripple主要面向金融结算,是一个半去中心化的区块链,通过RippleTrade进行身份认证.
关于存储,由于区块链要记录完整的数据信息,不能删除或修改区块记录,所以区块会不断增加,存储空间将受到威胁,比特币提出了使用默克尔树来存放交易哈希的方式,当需要回收硬盘空间时,只需将老旧的交易从默克尔树中剔除即可.一个不含交易信息的区块头大小仅有80 B.按照比特币区块生成的速率为每10 min 1个,那么每1年产生的数据约为4.2 MB,即使将全部的区块头存储于内存之中都不是问题.
3 小 结
本文从区块数据结构、密码学应用、共识机制、智能合约等方面对区块链技术进行了分析,并列举了典型区块链架构实现的技术方式.从目前来看,区块链技术在安全性方面仍存在诸多问题.
区块链实现的智能合约在合约代码安全性检测方面仍面临巨大风险,合约代码未经任何安全性检测,可能存在边界值未校验、死循环、内存溢出等问题,导致合约无法正常执行.
基于PoW共识算法的区块链仍面临51%攻击问题,即如果攻击者掌握全网超过51%算力,就有可能成功篡改和伪造区块数据,从而实现双重支付[7],基于PoS共识算法的区块链在一定程度上解决了51%攻击问题[5],同时也引入了区块分叉时的N@S攻击问题[8],因此更为安全可靠的共识机制仍有待深入研究.
区块链的非对称加密机制也将随着数学、密码学和计算技术的发展而变得越来越脆弱,而且随着量子计算等新科技的发展,未来非对称加密算法有可能存在被破解的风险.
区块链在私钥使用和保存方面仍存在很大问题[9],长字节私钥一般通过转换,形成短字符长度形式的私钥,但仍然不方便记忆,而有些区块链是去中心化的,是没有第三方参与的,那么如何安全可靠地保存私钥仍是重要问题.