一、前言
多头贷问题是网络小额贷款平台放款时所要考虑的一个重要问题。假设银行A有一潜在贷款客户小张,银行A为了足够多的了解小张的信用情况,希望向其他多家银行查询小张贷款情况或信用记录。但因为害怕其他银行抢走该客户,所以银行A不希望泄露自己在查询小张这一事实。是否可以通过技术手段解决银行A的诉求?答案是肯定的,即图1漫画中的“隐私信息检索技术”——一种不泄露查询条件和查询结果的加密技术。
图1 隐私信息检索技术应用示例漫画
隐私信息检索(Private Information Retrieval – PIR,也叫匿踪查询)是安全多方计算中很实用的一项技术,用来保护用户的查询隐私。其目的是保证用户向服务器(数据源方)提交查询请求时,在用户查询信息不被泄漏的条件下完成查询[1]。即整个查询过程中服务器不知道用户具体查询信息及查询出的数据项。
二、为什么可搜索加密技术无法替代隐私信息检索技术?
通过前面对PIR技术的描述,可知PIR的目的是保护用户查询隐私。提到“保护用户查询隐私”,会有人想到可搜索加密技术,但可搜索加密技术并不能替代PIR技术。
先来简单了解可搜索加密技术。顾名思义,可搜索加密就是在加密的情况下实现搜索功能,常用于云计算当中。可搜索加密应用示例如图2所示,能够实现将用户的数据进行特殊的加密后上传到云服务器上, 并且可以实现根据关键字进行检索的功能。(更详细内容可阅读本公众号文章:防止云端数据与查询行为泄露—可搜索加密)
图2 可搜索加密应用示例
可搜索加密实现密文检索时,过程示例如图3所示。可简单描述为:检索用户提交密文关键字(keyword3),云服务器将密文关键字与密文数据库比对,比对成功后则将对应的密文数据(数据3)返回给检索用户,最终检索用户对拿到的密文数据进行解密。
图3 可搜索加密密文检索示例
整个过程中云服务器不知道检索关键字(keyword3)和检索结果(数据3)对应的原始明文是什么。但是,数据拥有者监听到检索结果的话,可以直接解密并得到对应的明文。即可搜索加密技术仅能阻止云服务器获得用户查询隐私,不能阻止数据拥有者获得用户查询隐私(这很正常,云计算环境下,云服务器中一段密文数据的拥有者和检索者,可能是同一用户)。
三、3类常见隐私信息检索方案
为了加强保护用户查询隐私,使得查询条件和查询结果仅查询用户可知,安全多方计算中的PIR技术应运而生。目前常见的PIR方案实现有3类,分别是基于不经意传输(Oblivious Transfer,OT)的PIR实现、基于同态加密的PIR实现和keyword PIR实现。其中基于不经意传输的PIR和基于同态加密的PIR需要检索用户提前知道被检索数据在服务端数据库中索引号。3类方案的实现过程介绍如下。
3.1基于不经意传输的PIR实现
基于不经意传输的PIR实现过程如图4所示(不经意传输协议此处不在赘述,更多内容可阅读本公众号文章:安全多方计算(1):不经意传输协议),主要利用的是n选1的OT协议。
图4 基于不经意传输的PIR实现过程
基于OT的PIR实现过程有5个重要步骤:
- 服务端有n条数据,则产生n个RSA公私钥对,并将n个私钥保留,n个公钥发送给用户端。
- 用户随机产生一个大整数key(key为第5步中的解密密钥),已知用户要检索第t条数据,则用户用收到的第t个RSA公钥加密大整数key,将加密结果s发送给服务端。
- 服务端用保留的n个RSA私钥,依次尝试解密s,获得n个解密结果,依次为{key1,key2,…,keyt,…,keyn}。
- 服务端利用对称加密算法(此处为AES算法),利用key1~keyn,加密对应的消息m1~mn,将产生的密文消息M1~Mn发送给用户。
- 用户利用第2步中的key,对第t条密文Mt进行对称解密,则得到想要检索的第t条原始明文消息mt
3.2 基于同态加密的PIR实现
基于同态加密的PIR实现过程如图5所示,此处采用paillier加法半同态加密算法[2],paillier同态加密算法计算过程参见文献2,此处不赘述,但强调3个paillier算法特点:(1)可以实现两个密文加法计算;(2)可以实现一个密文与一个明文相乘;(3)由于加密时用到随机数,所以相同的明文、相同的密钥,可以产生很多个不同的密文,这些不同的密文解密后都能得到相同的原始明文。
图5 基于同态加密的PIR实现过程
基于paillier同态加密的PIR实现过程有4个重要步骤:
- 用户端产生同态加密公钥pk和私钥sk。
- 已知服务端有n条数据,用户要检索第t条数据,则产生一个n维密文向量vector={v1,…,vn},其中第t项是公钥pk加密数字1后的密文,其他项是公钥pk加密数字0后的密文。将vector和公钥pk发送给服务端,paillier算法第3个特点保证了vector中的n条密文都不重复,保证服务端无法猜出哪一条是数字1的密文。
- 服务端将vector和n条明文数据集做向量内积运算,得到密文结果en_result,将en_result发送给用户端。同态加密的密文计算结果解密后与明文计算结果相等,相当于en_result=E(m1*0 + … + mt-1*0 + mt*1 + mt+1*0 + … + mn*0, pk) = E(mt, pk)。
- 用户端利用私钥sk对en_result进行解密,得到想要检索的第t条原始明文消息mt。
3.3 keyword PIR实现
实际上,在大多数的查询场景中,查询方往往不知道自己要查询的数据的索引号,而大多根据关键词进行查询,此类方案又称keyword PIR,可以利用paillier同态加密和拉格朗日插值多项式实现(拉格朗日插值多项式细节可阅读本公众号文章:秘密共享—隐私计算和区块链共识中的榫卯),具体实现过程如图6所示。
图6 keyword PIR实现过程
keyword PIR实现过程有5个重要步骤:
- 服务端有明文数据集{(x1,m1),…,(xn,mn)},对此明文数据集进行拉格朗日多项式插值,插值结果即为最高次幂为n-1的多项式g(x);对于图6中的多项式f(x),f(x) = (x-x1)*(x-x2)*…*(x-xn),展开后即为图6中的f(x)。数据集中任意一个点(xi,mi),满足f(xi)=0,g(xi)=mi。
- 用户生成paillier同态加密公钥pk和私钥sk。
- 对于待查关键字xt,用户利用pk分别加密xt的1次方到xt的n次方,组成密文向量vector,发送给服务端。
- 服务端利用密文向量vector,和f(x)、g(x)的系数,分别计算同态密文E(f(xt))、E(g(xt)),将计算结果发送给用户。
- 用户利用私钥sk对两条密文进行解密,如果f(xt)=0,则g(xt)即为检索结果;否则检索结果为空。
四、方案验证及总结分析
前文对3类PIR方案实现方法做了描述,此处对3类方法做一个全面的比对分析,方便读者对3类方案有一个更直观的理解。
4.1 本文所提PIR方案理论分析
表1所示的表格,分别从依赖技术、通信开销、计算开销等方面对3类PIR方案特点做了总结。
表1 3类PIR方案特点总结
依赖技术 | 通信量与数据集(n条)关系 | 需要提前知道被检索数据索引号 | 计算开销与数据集(n条)关系 | |
基于OT的PIR | 公钥密码,对称密码 | n个RSA公钥 n条AES密文 | 是 | n次公钥解密 n次对称加密 |
基于同态加密PIR | 同态加密 | n+1条同态密文 | 是 | 3n次同态加密 |
Keyword-PIR | 多项式插值; 同态加密 | n+2条同态密文 | 否 | 5n次同态加密 2次多项式构造 |
在计算开销上,由于同态加密计算开销大于RSA计算开销,所以基于OT的PIR方案计算开销有优势;通信开销上,如果服务端每条明文数据都较长,如数千字节,则基于同态加密PIR通信开销较小。
4.2 代码实例验证
本环节,我们用python代码分别实现了基于OT的PIR和基于同态加密的PIR,让读者对PIR性能有更清晰的了解。我们模拟服务端有一个漏洞库,共有2245条数据(数据为绿盟真实漏洞库数据,原始数据数十万条,此处仅选取一部分用于实验),用户输入“软件名称+具体版本号”可查询对应的漏洞信息,查询过程中不会泄漏检索条件和检索结果。此部分仅展示用户获知检索项在服务端中的索引号后(索引号如何获取非本文重点,此处略过),分别模拟利用基于OT的PIR和基于同态加密的PIR实现漏洞信息检索。
图7 基于OT的PIR代码实验结果
图7为基于OT的PIR代码实现,网络为内部局域网,服务端为低配Ubuntu虚拟机,模拟结果总耗时3.3秒,通信开销RSA公钥传输消耗约0.68MB,全量AES密文传输消耗约5.6MB。
图8 基于paillier同态加密的代码实验结果
图8为基于paillier同态加密的PIR代码实现,相同配置下,计算开销耗时117秒,通信开销密文查询向量消耗约1.3MB网络开销,检索结果传输消耗约0.14MB。可以明显比对出前两类PIR方案在计算开销和网络开销上的差异。
五、总结
本文介绍了安全多方计算中很实用的一类方案——隐私信息检索方案,此类方案可在保护用户隐私的前提下,实现多方数据安全查询。另外,分别介绍了3种不同的实现方法原理,并对其进行理论对比分析,且对其中的两类方法做了代码实现。通过理论分析和实验对比,能够让读者对隐私信息检索有一个更直观的认识。
参考文献
[1] https://blog.csdn.net/hellompc/article/details/103784360
[2] Paillier P . Public-key cryptosystems based on composite degree residuosity classes[J]. Advances in Cryptology Leurocrypt, 2004.
往期回顾
安全多方计算之前世今生(https://mp.weixin.qq.com/s/L56ixeedbt1Bo8047pWcuw)
安全多方计算(1):不经意传输协议 (https://mp.weixin.qq.com/s/699vL7JJSF1nAdrgvJA7ng防止云端数据与查询行为泄露—可搜索加密 (https://mp.weixin.qq.com/s/xO9aC8z2-CpXITQJ1o5kiA)
秘密共享—隐私计算和区块链共识中的榫卯 (https://mp.weixin.qq.com/s/S1ukqBgr7SIHxuEqARvnQg)