聂梦飞,庞晓琼,陈文俊,2,弓世明,杨 婷
1.中北大学 大数据学院,太原030051
2.中国人民银行 太原中心支行,太原030001
3.中北大学 软件学院,太原030051
随着互联网的快速发展,数据呈现出爆发式增长的趋势,云计算的出现提供了数据存储、处理和共享服务。越来越多的用户选择把自己的数据从本地上传到云服务器,以便随时随地查询自己的数据信息。然而,云计算在提供给用户便捷性的同时,也给用户带来了数据隐私泄露的问题。为了保护用户的数据隐私,一个有效的解决方法是用户对上传的文件进行加密后再上传到云服务器,这种方式虽然能够解决用户数据隐私泄露的问题,保护敏感数据的隐私性,但是同时带来了服务器如何高效地对密文文件进行检索的问题,为解决这种问题,可搜索加密方案应运而生。传统的对称可搜索加密方案只考虑到服务器是诚实且好奇的情况,即用户在请求检索任务前,先向服务器支付服务费,服务器诚实地执行搜索任务并返回给用户检索结果。实际上还存在另一种情况,即服务器是恶意的,用户在支付服务费后,服务器给用户返回错误的检索结果或者没有返回检索结果,此时用户需要通过第三方权威机构赎回已支付的服务费,这种方法耗时多且效率低。因此,这种情况对用户来说是不公平的。
从以上的分析可知,需要一种有效的方法来解决传统的对称可搜索加密方案中的公平性问题。随着比特币[1]的出现,区块链作为它的底层技术可以很好地解决这一问题。区块链是一种具有不可逆性和可追溯性的分布式超级账本,提供分散和透明的数据共享,并按照时间顺序将数据区块以链条的方式组装成特定的数据结构[2-4]。Buterin[5]提出的以太坊是一个具备图灵完备性的开源的区块链平台,解决了比特币扩展性不足的问题。以太坊的主要特点是为实现智能合约提供支持,智能合约支持在没有第三方的情况下进行可信的交易[6],并按所触发交易中的数据以规定的方式在网络每个节点上自动执行。
本文主要利用以太坊的去中心化、安全可靠和支持智能合约的特点,保证用户和服务器之间交易的公平性:第一,云服务器通过以太坊区块链发布一笔交易来创建智能合约,利用智能合约暂存价值,完成云服务器和用户之间的检索交易;第二,通过智能合约自动验证服务器返回的结果是否正确;第三,若服务器是恶意的,用户可以撤回已支付的服务费,维护自己的权益,从而保证检索的公平性。
2000年,Song等人[7]首次提出了可搜索加密的思想,并实现了第一个对称可搜索加密方案。云存储环境下的对称可搜索加密成为研究热点,文献[8-9]实现了单关键词检索的对称可搜索加密方案;考虑到用户往往输入多个关键词来更准确地获取自己感兴趣的内容,文献[10-11]提出了支持多关键词检索的可搜索加密方案;考虑到现实场景中词语间的语义关系,文献[12-13]提出了支持语义扩展的多关键词排序检索方案。
以上方案的前提是假设服务器会诚实地执行检索任务,不适用于恶意的服务器返回错误的检索结果或没有返回任何结果的应用场景。为解决此问题,Zhang等人[14]提出在云计算环境下基于区块链的外包服务公平支付框架BCPay,在BCPay中,他们采用比特币定时承诺方案保证外包服务的公平性。Wang等人[15]提出基于区块链的具有细粒度访问控制的分布式存储系统,通过去除云服务器,并利用智能合约实现密文环境下公平的关键词检索功能。Li等人[16]提出基于比特币系统的对称可搜索加密方案,在没有去除云服务器的情况下解决了对称可搜索加密方案的公平性问题,但是方案需要6笔交易获取检索结果,并通过比特币的脚本验证检索结果的正确性,交易周期长且效率低。为了简化交易过程,提高交易效率,提出以太坊区块链下保证公平的对称可搜索加密方案,用户和云服务器通过与智能合约交互完成交易,智能合约作为可信第三方进行资金的转移。同时,智能合约验证云服务器返回的检索结果是否正确,保证检索的公平性。
通过以上分析,方案想要实现以下三个目标:
(1)用户向智能合约支付押金,用于防止用户中途终止检索协议。
(2)服务器向智能合约支付费用,用于请求陷门信息,并返回检索结果。同时,智能合约可以验证结果的正确性。
(3)用户向智能合约支付服务费,用于请求检索结果。
传统的对称可搜索加密方案的系统模型由三类角色组成:数据拥有者、云服务器和用户。系统模型图如图1所示。
图1 系统模型图
数据拥有者:作为拥有明文文档集合的一方,根据提取的明文关键词集合建立索引,把加密后的密文文档和密文索引存储在云服务器上。
用户:数据拥有者和用户共享文档解密密钥和生成陷门信息的密钥。用户生成陷门信息后将其发送给云服务器。
云服务器:根据用户发送的陷门信息和数据拥有者上传的索引,检索对应的密文文档,并返回给用户。
以太坊是一个开源的有智能合约功能的公共区块链平台,支持图灵完备的编程语言,任何人都可以基于以太坊平台建立通过区块链技术运行的去中心化应用,并通过智能合约设置自己的所有权转移规则、交易方式和状态转换函数。智能合约是1997年由密码学家尼克萨博[17]首次提出来的,将其定义为:“一个智能合约是一套以数字形式定义的承诺,包括合约参与方可以在上面执行这些承诺的协议”。区块链系统中的每个用户可以通过发布一笔交易创建智能合约,智能合约可以存储、转发价值给其他的账户或合约,自动化运作不被干扰。以太坊系统有两种类型的账户:外部账户和合约账户。外部账户就是普通账户,即存放以太币的账户,由私人密钥控制,没有与之相关的代码。合约账户由合约代码控制,具有与其相关的代码。外部账户通过创建和签名一笔交易,向其他外部账户或合约账户发送消息,两个外部账户之间的消息只是一种价值转移,但外部账户向合约账户发送消息会激活合约内部的代码,从而执行各种操作。合约账户只能接收外部账户发来的交易,不能启动新的交易。
星际文件系统(InterPlanetary File System,IPFS)[18]是一种点对点的分布式文件系统,旨在连接所有的有相同文件系统的计算机设备。IPFS提供了高吞吐量的内容寻址块存储模型,具有内容寻址的超链接。它结合了分布式哈希表、带有激励机制的块交换和自我认证命名空间,不存在单点故障,节点间无需信任。IPFS类似于Web,但Web是中心化的,而IPFS是分布式的。将一个文件上传至IPFS,会获得一个唯一的字符串。通过这个字符串,同样可以检索到对应的文件。方案在智能合约的设计中引用IPFS获取文件的哈希值,从而对文件进行操作。
如图2所示,基于以太坊区块链的公平对称可搜索加密(Searchable Symmetric Encryption,SSE)方案包含4个角色:数据拥有者、服务器、用户和智能合约。
数据拥有者拥有n个文件,用D={D1,D2,…,Dn}表示文件集合。服务器负责管理这些文件并为用户执行检索任务。用户和数据拥有者可以是同一个人,若用户为其他人,则数据拥有者和用户共享密钥。智能合约可以读写存储的文件,给其他用户或智能合约发送消息,还可以在合约账户中存放押金或发送给其他用户。
图2 基于区块链的SSE系统模型图
第一阶段,数据拥有者通过密钥K对n个文件加密生成密文文件集合C={C1,C2,…,Cn},提取明文关键词集并建立索引I。然后把加密后的文件集合C连同索引I存储在云服务器上。方案假定数据拥有者和用户共享密钥K。
第二阶段,用户对包含关键词w的文件进行检索,为关键词生成陷门信息tw,把tw发送给智能合约。同时,为防止用户中途率先终止检索协议,用户向智能合约支付押金,表示为user DepositEth。
第三阶段,服务器执行检索操作,向智能合约请求陷门信息tw。由于服务器能根据tw推测用户数据的相关信息,因此服务器在请求tw时需支付费用。需要支付的费用由用户定义在智能合约中,服务器通过智能合约查询并支付,实际交付的费用表示为serverAskEth,暂存于智能合约。智能合约返回tw,服务器根据tw检索,将检索结果返回给智能合约。
第四阶段,用户与智能合约交互请求检索结果,将服务费user PayEth暂存于智能合约。智能合约验证服务器返回的检索结果是否正确,若正确,智能合约将serverAskEth+userPayEth转移至服务器的账户,将押金userDepositEth返回给用户的账户,并将检索结果返回给用户;若不正确,智能合约将user DepositEth+userPayEth+serverAskEth转移至用户的账户;若用户未执行这一步,智能合约将userDepositEth+server AskEth转移至服务器的账户。
方案中涉及到的符号含义由表1给出。
以太坊区块链技术下保证公平的对称可搜索加密方案SSE=(KenGen,GenIndex,GenQueryToken,userdeposit,serverAsk,serverReturnData,userPay,Dec),具体描述如下:
表1 符号表
(1)KenGen(1k)→K,由数据拥有者执行的密钥生成概率算法。算法以安全参数k为输入,输出一组密钥K=(K1,K2),通过安全信道将密钥K发送给已认证的授权用户。
(2)GenIndex(D,K)→I,由数据拥有者执行的算法。算法以密钥K和明文文档集合D为输入,输出可搜索索引I,将I外包存储到云服务器。同时,数据拥有者对D进行加密得到密文文档集合C,将C也外包存储到云服务器。
(3)GenQueryToken(K2,w)→tw,由已认证的检索用户执行的算法。算法以安全密钥K2、检索关键词w作为输入,输出陷门信息tw。
以下(4)~(7)是由服务器部署的智能合约的相关函数接口,用于保证用户和服务器之间交易的公平性:
(4)userDeposit(tw,lw,eth2,user DepositEth),用户递交押金的函数,只能由用户执行。为防止用户中途先终止检索协议,用户通过该函数向智能合约支付价值为userDepositEth的押金,同时把tw、lw和服务器获取陷门信息需支付的费用eth2作为参数传递给智能合约。
(5)serverAsk(serverAskEth)→tw,服务器请求陷门信息的函数,只能由服务器执行。服务器通过陷门信息执行检索操作,因此需要请求陷门信息tw。但服务器可以根据tw推测出用户的隐私数据,因此服务器请求tw时需支付费用。服务器通过该函数向智能合约支付价值为serverAskEth的费用,函数返回陷门信息tw。
(6)serverReturnData(Cw_ipfs,MACw),服务器返回检索结果的函数,只能由服务器执行。服务器收到tw后根据tw和索引I执行检索操作,并通过该函数把检索结果Cw_ipfs和MACw发送给智能合约。
(7)userPay(userPayEth,kw)→Ci_ipfs,用户支付服务费的函数,只能由用户执行。用户为得到检索结果需支付服务费,通过该函数向智能合约发送价值为user PayEth的服务费,并把根据关键词生成的kw发送给智能合约,供智能合约验证服务器返回的检索结果是否正确,将正确的检索结果返回给用户。
(8)Dec(Cw,K1)→Dw,由已认证的搜索用户执行的算法。算法以接收到的文件集合Cw和K1为输入,输出为对应的明文文件集合Dw。
方案的具体细节如下:
数据拥有者选择三个伪随机函数F1、F2、F3和一个密码学哈希函数H:{0,1}k→{0,1}m。
(1)密钥生成算法KenGen(1k)生成随机密钥K1,K2←{0,1}k。
(2)构建索引算法GenIndex(D,K)
首先,数据拥有者利用密钥K1将明文文件D={D1,D2,…,Dn}加密为密文文件C={C1,C2,…,Cn}:Ci=Enc(K1,Di)(1≤i≤n)。将密文文件上传至IPFS,记录返回的文件位置Ci_ipfs。
扫描文件集D并建立关键词集W={w},对每一个关键词wj∈W,建立D(wj)(1≤j≤m)。D(wj)是一个二进制数组,如果文件集中第i个文件包含关键词wj,则D(wj)[i]=1;否则,D(wj)[i]=0。对每一个关键词wj∈W(1≤j≤m),计算:
twj=F1(K2,wj),lwj=F2(K2,wj)
ewi=Enc(lwj,DB(wj)),kwj=F3(K2,wj)
MACwj=H(kwj||Ci_ipfs)
其中,Ci_ipfs是包含关键词wj的文件存储在IPFS上的位置信息。
为每个加密后的文档生成索引I=(twj,ewj,MACwj),将C和I上传到云服务器。
(3)陷门生成算法GenQueryToken(K2,w)
为了对存储在服务器上的包含关键词w的文件进行检索,用户向数据拥有者索取文件解密密钥K1和生成陷门信息的密钥K2。假设数据拥有者将K1和K2通过安全信道传输给已认证的用户。用户利用生成陷门信息的密钥生成陷门信息。
用户将tw和lw作为用户递交押金算法的参数上传给智能合约。
下文中(4)~(7)是由服务器部署的SSE智能合约的相关变量和函数接口。以太坊区块链中的智能合约由solidity语言[19]编写,合约提供了4个函数接口:用户递交押金、服务器请求tw、服务器返回检索结果、用户获取检索结果。用户和服务器通过与智能合约交互,解决对称可搜索加密的公平性问题。
SSE智能合约初始化:合约创建时,定义合约的相关变量。
eth1:防止用户中途率先终止检索协议,用户需交付的押金。
eth3:用户请求检索结果需支付的服务费。
(4)用户递交押金的合约函数userDeposit(tw,lw,eth2,userDepositEth)
为防止用户中途终止协议,用户在请求检索任务前,向智能合约交付押金,记作userDepositEth。同时,用户将tw、lw和服务器获取tw和lw需支付的费用eth2上传至智能合约。
Algorithm1 userDeposit
Input:tw,lw,eth2
Output:null
if msg.sender is not user or msg.value≤eth1 then
throw;
else
user DepositEth=msg.value;
end
(5)服务器请求检索的合约函数serverAsk(server-
AskEth)
服务器为了执行检索任务,需要获得陷门信息,因此服务器调用智能合约的请求检索算法,获取tw和lw。函数首先判断当前函数的外部调用者是否是服务器,若不是则抛出异常。方案考虑到服务器是恶意的情况,在得到tw和lw后,没有执行检索任务,却能推测出关于文件的信息,因此服务器向智能合约支付一笔费用,记作server AskEth。智能合约判断server AskEth≥eth2,返回服务器tw和lw,并把serverAskEth暂存于智能合约中。
Algorithm2 serverAsk
Input:null
Output:tw,lw
if msg.sender is not server or msg.value≤eth2 then
throw;else
server AskEth=msg.value;
end
return(tw,lw);
end
(6)服务器返回结果的合约函数serverReturnData(Ci_ipfs,MACw)
服务器根据智能合约返回的参数进行检索,通过tw和索引I获取到(ew,MACw),解密ew得到DB(w),DB(w)=Dec(lw,ew)。如果DB(w)[j]=1,则将文件Cj放入数组Cw中。
服务器将数组Cw中的元素上传至IPFS得到相应的文件位置,将文件位置存储在数组Cw_ipfs中,并把MACw和Cw_ipfs上传给智能合约,告知用户检索完毕。
Algorithm3 serverReturnData
Input:Cw_ipfs,MACw
Output:null
if msg.sender is not server then
throw;
else
store Cw_ipfs,MACwto smart contract;
end
end
(7)用户请求结果的合约函数userPay(user PayEth,kw)
用户向智能合约请求检索结果并支付服务费,记作userPayEth。函数首先判断当前函数的外部调用者是否是已认证用户,若不是则抛出异常。同时,用户把密钥kw上传给智能合约。智能合约通过kw验证服务器提供的检索结果是否正确,即计算服务器上传的字符串的消息认证码MACw',判断是否等于MACw:
其中,Ci_ipfs是Cw_ipfs中的元素。
若MACw,==MACw,则说明服务器返回的检索结果正确,智能合约将检索结果返回给用户,并将userPayEth+serverAskEth转移到服务器的账户,userDepositEth退回到用户的账户。若不相等,则服务器返回的检索结果错误,智能合约将user DepositEth+serverAskEth+userPayEth返回到用户的账户。若用户未执行这一步算法,智能合约将user DepositEth+serverAskEth转移到服务器的账户。
Algorithm4 userPay
Input:null
Output:Ci_ipfs
if msg.sender is not server or msg.value≤eth3 then
throw;
else
userPayEth=msg.value;
end
if MACw′==MACw
send user PayEth+server AskEth to server;send userDepositEth to user;
return Ci_ipfs;
else
send userDepositEth+userPayEth+serverAskEth to user;
end
end
(8)用户解密文件Dec(Cw,K1)
用户将智能合约返回的检索结果发送到IPFS,得到对应的密文文件Cw,使用文件所有者共享的加密文件的密钥K1解锁密文文件,得到包含关键词w的明文文件。
Dw=Dec(Cw,K1)
(1)文件的隐私性
数据拥有者将文件上传到云服务器之前,将文件通过AES对称加密算法进行加密,并通过安全信道把加密密钥K发送给已认证的检索用户,只有数据拥有者和已认证的用户能得到文件的明文信息。同时,云服务器对文件的检索是基于倒排索引和密文文件进行的,因此文件的隐私性得到了保证。
(2)索引和陷门的安全性
方案中,索引I和陷门tw都是加密的形式,在没有获得安全密钥的情况下,云服务器不能推测出索引信息和关键词信息,从而不能推测出相关的文件信息。同时,在已认证用户的请求下,为了对文件进行检索,云服务器需要请求陷门信息,并为此支付一定的费用,费用由用户定义,服务器通过智能合约查询并支付。
(3)检索的公平性
在传统的可搜索加密方案中,认为云服务器会诚实地执行检索任务并返回相应的结果。但是云服务器可能是恶意的,它在收到用户递交的服务费后没有返回检索结果或返回错误的检索结果,导致用户不能得到相应的服务。本方案中,用户首先把服务费暂存在智能合约上,服务器在执行检索任务后,向智能合约返回检索结果,智能合约自动验证结果是否正确,若正确,才会把服务费转移到服务器的账户;若不正确,服务器得不到服务费。因此,为获取服务费,服务器将会返回正确的检索结果。
同时,考虑了用户中途率先终止检索的情况,用户请求检索任务前需交付押金,由智能合约暂存。若用户诚实地完成检索任务,智能合约退回用户的押金,否则,这笔押金归服务器所有。智能合约可以根据预设的条件自动执行协议,方案保证了检索的公平性。
通过仿真实验对方案的性能进行分析。具体的实验环境为Intel Core i5-4210U处理器,4 GB内存,操作系统为Windows10 64位,编程语言是Solidity。方案对基于倒排索引的对称可搜索加密技术进行改进,服务器执行检索算法的时间复杂度是O(D(w)),D(w)是包含关键词w的文件的数量。
通过智能合约确保交易的公平性,SSE智能合约由服务器部署在以太坊测试网络Ropsten上。
服务器账户地址:
0xc8edc0148615d1fcbb7377023ed40282b59902d7
用户账户地址:
0x3b408d4d64b07688f67ff9a40a0f4e8bea44d10c
智能合约地址:
0xf4ab4cbe06f8e7376df3f4b984d490f599676e8b
通过使用以上地址,方案涉及的所有交易可以在以太坊提供的官方网站上被查看:https://ropsten.etherscan.io/,从而保证交易的透明度和可靠性。
智能合约每一个被执行的命令都有一个特定的消耗,用单位gas计数。通过仿真实验测试执行智能合约所消耗的成本,实验结果表明服务器首次将SSE智能合约部署到以太坊区块链上时消耗的成本较高。但智能合约部署完成后,用户调用智能合约提供的函数接口时,消耗的成本明显降低,且所有的操作消耗的gas成本在可接受范围内,同时方案能保证用户检索的公平性及双方交易的透明度,因此方案是可行的。在进行实验时,gasprice=3Gwei,1 Gwei=109wei=10-9ether,1 ether=270 USD,实验结果如表2所示。
表2 智能合约成本测试
本文提出了一个基于以太坊区块链和智能合约的对称可搜索加密方案,解决了传统可搜索加密方案的公平性问题,既考虑到了如果服务器是恶意的,那么它不仅得不到服务费,还会受到惩罚;同时考虑到了如果用户是不诚实的,它也会受到惩罚;如果服务器和用户都诚实地执行了检索协议,用户将得到正确的检索结果,且服务器将得到服务费,同时保证了在执行检索协议的过程中双方交易的可靠性和透明度。最后对方案的安全性和性能进行了分析,证明方案是可行的。