2018年11月17日上午,“2018比原链全球开发者大会”正式在杭州国际博览中心(G20会馆)开幕,这是杭州第一次由开源组织举办的技术型峰会,也是杭州被誉为区块链之城以来规模最大的一场区块链开发者大赛,100+开发团队历经4个月激烈厮杀,16支团队将在本次大会上展开最终角逐。
当天下午,上海交通大学密码与计算机安全实验室(LoCCS)区块链技术研发团队负责人博士生导师刘志强发表主题为《隐私保护与数字钱包安全》的演讲。
刘志强对当前区块链系统中的主流隐私保护技术及特性做了介绍并指出其中面临的隐私不足问题,如基于混币的隐私保护技术如果基于第三方会有隐私泄露,如果基于相对去中介的,可能在混币层面内部有隐私泄露。基于环签名的隐私保护存在交易匿名性存在风险,基于零知识证明的隐私保护技术中的ZK-SNARK由于整个系统需要可信启动,与区块链的最初设计理念有些不符。
数字钱包私钥安全存在着黑盒模型、灰盒模型和白盒模型,三者存在的安全风险依次增加。对于安全威胁程度最高的白盒模型,刘志强所在的上海交大LoCCS实验室提出了SM2签名算法的解决方案,保证在白盒攻击模型下签名不可伪造性以及在白盒攻击模型下原始签名私钥不可计算性。当然,实现了白盒方案的数字钱包还可能面临的安全威胁:Code lifting,这时候就要采取代码混淆技术。
以下是刘志强演讲内容,整理:
首先非常感谢主办方能够邀请我来和大家探讨和分享区块链隐私保护与安全问题。区块链希望在一个相对较弱的信任环境下构建一个非常强的信任机制,安全和隐私问题一定是区块链里非常重要,非常关键的问题,也是大家非常关心的问题。
区块链安全问题涉及到非常多的层面,我们知道一个系统的安全涉及到非常多的层面。比如说从共识机制的安全性,智能合约安全性,数字钱包、私钥的管理。如果涉及到区块链的监管,在监管和隐私保护之间怎么样达成一个平衡等等。因为我们在区块链里应用了一些密码技术,密码算法本身理论上是安全的,但如果非密码专业的人去实现密码算法的时候,可能会存在相应的漏洞,后面会有一些例子给大家介绍一下。
我们现在也有一些扩展机制是通过链下的方式,怎么样保证离链交易安全性等等。今天我们不会就所有问题展开,我们会比较关注于某些方面探讨隐私保护特性,以及对数字账户安全性做一个非常初步的探讨。
区块链系统里的隐私保护对象是什么,我们假设以Blockchain为例,需要对双方身份隐私进行保护,对交易金额希望进行一定的保护,并且对交易不可追踪性。如果交易路线图能够被追踪出来,事实上隐私泄露也是非常严重的。
区块链系统中的隐私保护—技术
区块链系统中的隐私保护主流技术有混币、环签名、零知识证明、MPC、同态加密。
基于混币的隐私保护技术有些代表性工作,这里面一开始都会基于可信中介,混币有一个中心系统的。后面发展到怎么样把可信的中介去掉,因为引入可信中介与区块链本身设计思想是会有些相背的,那它就会考虑怎么样把中介可信性去掉,就引入了去可信中介的机制TumbleBit。还有去中介的混币,目前比较有代表性的CoinShuffle,这种技术在混币里还是非常有效的。当然它的特性就是把交易的输入输出进行混合,打乱输入输出之间的关联性,所以它是比较直观,但不隐藏金额,而且混币技术一般来说要求固定切分的金额。
基于环签名的隐私保护,这里比较有代表性的就是门罗币。它的技术特性会使用一次性地址,每次A用户向B用户发送一笔交易时,会根据B用户公开的信息,公钥,产生一次性地址,会通过承诺以及环签名,把发送者和接收者地址、交易金额都能保护得非常好,都能把它的隐私进行一定保护。
基于零知识证明的隐私保护技术,比较有代表性的Zerocoin,它是基于零知识证明技术,可以完全隐藏输入输出地址和交易金额。这是目前相对比较强大的,当然它的性能效率目前可以接受,但还是在这一块上有更进一步的研究。
区块链系统中的隐私保护—现状分析
这些隐私保护技术还有哪些问题呢?基于混币的隐私保护技术如果基于第三方会有隐私泄露。如果基于相对去中介的,可能在混币层面内部有隐私泄露,同时它的通信复杂度相对偏高,所以只支持少量成员的混币技术。
基于环签名的隐私保护,如果大家对门罗币进行可追踪分析的话,会发现对目前门罗币交易数据,我们事实上已经有它的匿名性分析结果。
基于零知识证明的隐私保护技术,因为ZK-SNARK本身有一个缺陷,系统需要可信启动,启动过程中产生PK、VK参数时,需要一个可信的实体,相对来说你要相信它,这与区块链最初设计理念有些不符。
今年也出现了关于Zerocash隐私泄露分析,是由于用户习惯导致的隐私泄露。后来又提出ZK-STARK,改进了它的可信启动缺陷,并且可以支持抗量子计算。当然它也有它的问题,大家如果关注隐私这一块,应该会比较关注,结合环签名技术里进一步改进它的范围证明,用于保护交易金额隐私高效技术。
门罗币的隐私保护特性分析
我们再看一下门罗币隐私保护特性分析,不可链接性、不可追踪性、交易金额隐藏。实践中我们看一下,它的不可追踪性受到一定挑战。这里定义了有效的匿名集大小,通过链式反应,我们在做门罗币隐私保护时,交易时对每笔交易输入需要引入一些混合信息构成一个集合。在这个集合里,你无法判断输入到底来自于集合链哪一笔。我们通过对它的数据分析,可以构建输入与输入之间链式反应,使得它的匿名集变小,可追踪性会受很大的影响。
还有在门罗币里一个非常有意思的攻击——时间攻击,用来混合输入的集合,一般来说最新的输入就是真实的输入。有人对门罗币交易数据进行了分析,发现这样的概率是非常大的。那就意味着你在一个集合匿名集里引入10个输入,虽然别人不知道是10个输入里哪个,实际上我只要进行简单的时间分析,哪笔交易输入是相对比较近期的,那它就有非常大的概率是真实的输入,所以它的可追踪性就受到很大挑战。
ZCash的隐私保护特性分析
ZCash的零知识证明技术理论上是非常强的,但是我们会通过ZCash本身交易数据,交易种类的分类发现,它会存在一些隐私泄露情况。通过这张图可以看到,如果把交易分成4类,比如透明交易,事实上没有进行任何保护,没有真正做隐私交易,t-to-t。还有t-to-z,z-to-z。这里可以看一下各类交易情况,透明的交易完全没有用到隐私保护的,竟然占了73.5%,transaction,生产交易也是没有隐私保护的,这里占了11.5%。
通过这个分析我们发现,还有一些用了这个技术的,比如挖矿出来之后有一个激励,酬金会先放到隐私库里,进去一次马上出来。这样子的话,事实上对隐私泄露是非常有影响的。
虽然ZCash本身隐私保护机制是非常强的,但因为使用不当,里面隐私泄露的情况是比较严重的。
密码算法的实现安全
我们再看看密码算法的实现安全,区块链里面涉及到的密码算法,包括密钥生成算法、Hash算法、数字签名算法、加密算法、承诺算法、零知识证明算法等。算法安全性是理论上可证明安全性,还有在软硬件实现中的安全性。
密码算法实现中的安全问题包括:
随机数重用问题,很多时候在实现时尾随数生成,这里做得不够规范,没有遵循设计规范,使得随机数有问题,这会使得私钥泄露。
算法误用问题,现实的安全目标与理论的安全模型是不是一致,算法的填充是不是符合规范。比如常用的数字签名ECDSA,若(r,s)是对消息m的有效签名,则(r,-s)也是对同一消息m的有效签名,这个问题曾经导致某个交易所的重大问题。
侧信道攻击问题,问题的关键在于信息泄露途径的多样性。CCS 2017上提出了对当时基于格的最快速的数字签名BLISS的侧信道攻击。
数字钱包私钥安全
数字钱包的账户安全,面临三种攻击模型:
黑盒模型,敌手能力非常有限,获取资源非常有限,所以它是把整个密码算法实现当成黑盒,只能去窃听通信信道。通过理论的分析,获得信息非常有效。
灰盒模型,攻击者资源得到一定扩大,系统在运行过程中,它的运行时间、功耗、电磁辐射,甚至可以通过注入错误来获取一些旁路信息,这些旁路信息对于匿名信息分析和提取非常有帮助。
白盒模型,这时候攻击者能力得到非常大提升,可以完全访问密码算法执行,可以观测密码算法动态信息,并且对内存进行读取分析,甚至可以插入一些错误改变程序运营结果。
三种攻击模型下安全强度,白盒攻击威胁程度非常大。为什么我们要考虑白盒环境下安全机制呢,因为在很多不信任终端环境下,特别是软件环境下,这时候敌手是可以具有很强大的攻击能力。举个例子,AES,这是一个非常经典的,应该说也是应用非常广泛的密码算法。在黑盒环境下,目前从97年提出来到现在20多年了,从理论上分析仍然是安全的。
现在对于(8/10)的AES,攻击的轮数只能到第8轮,它的安全复杂度只能降到2的100次方而已,黑盒环境下比较安全的。灰盒环境下是不加防护,完全不安全。如果是在白盒环境下,它的安全性没有任何安全性了。
数字钱包SM2的算法,国密算法。国家对网络空间安全非常重视,密码技术又是网络空间安全里支撑技术,所以现在国家《密码法》草案已经出来了。以后随着《密码法》推行,国密算法一定会受到越来越多的重视。以后我们肯定会考虑区块链里签名算法切换,这是非常有可能的过程。如果是SM2签名算法的话,我们怎么样保护这个签名算法本身在白盒攻击下安全性,如下图所示。
我们希望达到的安全性是在白盒攻击模型下签名不可伪造。哪怕敌手有非常强的能力,仍然不能去伪造签名,或者是仍然不能把原始私钥恢复出来。实际上是通过无密钥的方式,把密钥藏在表格中,然后基于困难问题可以证明安全性。
随机数可能是很多人会忽略的,认为只要保护好私钥。事实上在这个签名过程中,如果随机数泄露,那么就可以通过计算过程把私钥推出来。
实现了白盒方案之后的数字钱包仍然还存在可能的威胁,那就是会被Code lifting,即软件代码可能会被整体复制,在其他设备和环境下运行,进行Code lifting攻击。这时候就会使用到代码混淆技术,包括表层混淆、控制流混淆、深度混淆。