本文是对D.Song等人的Practical Techniques for Searches on Encrypted Data的整理总结,旨在在总体上对可搜索加密技术做一个直观上的描述。对于文章中提出的方案给出详细的描述和个人的见解,由于能力所限,对于安全性证明仅仅给出感性上的理解,具体的证明请参考原文。
- 传统搜索技术VS可搜索加密
传统的搜索技术是基于明文的搜素技术,即无论查询用户提交的关键字还是服务器数据库中的数据信息都是以明文形式给出的。这也就造成了很严重的信息泄露,因为任意的恶意服务器都可以获取查询用户的查询关键字、查询结果等信息,严重危害个人的安全和隐私。
可搜索加密技术为了解决这个难题提出了基于密文进行搜索查询的方案,在这种模式下,用密码学的基本技术来保证用户的隐私信息和人身安全。 - 可搜索加密
本文提出的方案旨在提出一种加密搜索模式,使得在对加密数据进行搜索的过程中,不会对恶意服务器泄露任何的信息。
本文的方案有如下几点优势:
安全性优势:
(1)可证明安全(provably secure):即不可信服务器仅仅通过密文不能获得有关明文的任何信息;
(2)控制搜索(controlled searching):即不可信服务器不能在没有合法用户的认证下进行搜索;
(3)隐藏查询(hidden queries):即用户向服务器发起有关一个关键字的询问然而却不必向服务器表明关键字是什么;
(4)查询独立(query isolation):即不可信服务器除了查询结果之外不能获得有关明文的任何信息;
实用性与效率:
本文介绍的算法十分简单和快速。准确来说,对于长度为n的文件,加密和搜索的涉及到的流加密和块加密的复杂度均为O(n)。除此之外,也不需要也不需要大量的空间和预先的交互。本文提出的方案具有很好的拓展性,能够方便的拓展为其他的更为细致的方案。
注意:本文的查询方案是基于概率查询设计的。 - 加密数据查询
在正式的引入可搜索加密技术之前,有必要首先介绍一下在加密数据上进行查询的流程。
首先,Alice拥有一系列的文件,并且要将文件存储到不可信任的服务器端——Bob,例如Bob是一个邮箱服务器,Alice将自己的邮件存储到Bob端。但是由于Bob不可信任,所以为了不让Bob窃取到自己的信息,Alice需要将自己的文件加密之后,将密文存储到Bob端。每一个文件被拆解为“字”(words),这里假设所有的字都是固定长度的(对于长的字可以进行拆分(split),对于短的字可以进行补齐(padding))。由于带宽等因素的限制,Alice只希望能够解析包含某个关键字W的文件。为了实现这个目标,我们需要设计一种能够在加密数据上进行计算的方案,这样一来,就能够在Bob不知道隐私信息的情况下概率性的决定一个文件是不是包含某个关键字W。
目前有两种方案:
(1)基于索引(index)的实现方案:对于每一个关键字W,建立一个索引,索引中包含所有含有该关键字的文件的指针。由于这种方案在更新数据的时候会对索引进行大量的修改,因此适合大量只读模式(mostly-read-only);
(2)没有索引的序列扫描(sequential scan):这种情况下没有索引,每次查询都是对文件进行一次扫描来寻找符合查询条件的文件。无疑,这种模式的查询效率会低很多,但是却更适合经常更新的存储系统。
我们接下来主要介绍第二种方案。 - 预备知识
接下来的方案介绍中会涉及到如下几个概念:
伪随机生成器(pseudorandom generator)
伪随机函数(pseudorandom function)
伪随机置换(pseudorandom permutation)
敌手的优势(advantage of adversary):
AdvA=|Pr[A(X)=1]−Pr[A(Y)=1]| - 方案
方案1:
基本思想:利用伪随机生成器G生成伪随机串S,将伪随机串与明文串异或,得到密文串,即 Ci=Si⊕Pi
具体算法:
(1)加密算法:
<1>Alice使用流密码算法(伪随机生成器)产生一系列伪随机值 S1,S2,...,Sl , Si 长度为n-m;
<2>对每一个 Si ,运用伪随机函数 F,计算 FKi(Si) ,结果的长度为m;
<3> Ti=<Si,FKi(Si)> ,密文 Ci=Wi⊕Ti ;
算法解析:
<1>只有Alice能够产生伪随机串 T1,T2,...,Tl ;
<2>对于 Ki ,Alice有两种选择的方案:
- a:选择与以前使用过的key,即 Ki=Kj(j<i) ;
- b:选择从未使用过的key,即所有key都是相互独立的;
<3>只要伪随机函数 F 和伪随机数生成器G 是安全的,那么方案1就是安全的。也就是说,在任意的位置 i ,只要密钥Ki 是未知的,那么对于算力有限的敌手来说, Ti 和真随机比特串是不可区分的。具体证明请参考原文。
(2)解密算法:
<1>Alice告诉Bob搜索的关键字 W 和Ki ,其中 Ki 与 W 可能出现的位置匹配;
<2>Bob对于每一个可能的位置i ,Bob做异或运算 Ci⊕Wi ,如果结果对于某个 s 而言,具备<s,FKi(s)> 的形式,那么 Ci 即为搜索结果;
<3>对于任意一个位置 i ,如果Bob不知道Ki ,那么Bob无法获得任何关于明文的信息;
<4>缺陷:如果Alice想要查询关键字 W ,那么Alice必须告诉Bob与之有关的所有的Ki ,或者Alice必须事先知道 W 所有可能出现的位置(这对于远程查询搜索来说是不现实的);
方案2:
为了解决控制访问的问题,这里我们引入一个新的伪随机函数:新引入的 f 和方案1中提到的伪随机函数f:KF×{0,1}∗−>KF F 密钥相互独立,没有相关性;
<1>引入 f 的作用在于可以根据Wi 选择 Ki ,即: Ki:=fk∗(Wi) ,其中 k∗ 是在密钥空间中随机选取、绝对保密的。
<2>之后,Alice将 Ki 和 W 提交给Bob;
<3>最后,Bob在服务器上进行查询,对于Wi≠W 的位置将不会泄露任何信息;
这样,就解决了控制访问的问题。
拓展开来,如果想要在某个章节查询某个关键字,可以将章节信息插入到 f 中,即:进一步,我们可以采用一种层次密钥管理模式,这样就可以区别对待在某个章节查询某个关键字和在全文查询某个关键字。ki:=fk∗(<C,W>)
然而,这种模式还是无法实现隐藏查询内容的功能。
方案3
进一步的,Alice不想让Bob知道她查询的内容,为了实现这个目标,我们采取如下的方案:
<1>Alice对于每一个关键字 W 加密,此时加密用的算法是确定性的算法,对于每一个关键字的加密都是相互独立的,加密算法记作Ek# 。 Ek#(x) 只与加密的内容 x 有关,与x 在文中出现的位置 i 无关。上述加密过程记作:Xi:=Ek#(Wi)
<2>同方案1中,对 Xi 进行加密:Ci:=Xi⊕Ti
<3>查询的时候,Alice将 <X,k> <script type="math/tex" id="MathJax-Element-14045"> </script>提交给Bob,其中 X:=Ek#(W),k:=fk∗(X) ;
如此一来,Bob就无法得知Alice提交的查询的内容了。
方案4
虽然方案3完成了对于隐藏查询和控制查询的实现,但是却有一个很大的问题--即便是合法的用户,也无法仅仅只从密文解密出原文,这违背了加密的目的。
这里,我们对加密方案进行改进:
<1>首先将 Xi 一分为二: Xi:=<Li,Ri> ;
<2>生成 ki ,即 ki:=fk∗(Li) ;
<3>之后,Alice用伪随机数生成器生成 Si ,接着Alice用前面提到的方法生成 Ti ;
<4>最后,实现对数据的加密:Ci:=Xi⊕Ti,其中Xi=<Li,Ri>,Ti=<Si,FKi(Si)解密:
<1> Ci⊕Si 得到 Li ;
<2>利用 Li 得到 ki ;
<3>得到 ki 之后很容易便可以进行解密;
- 讨论
本文给出的模式知识基本的一些方案,可搜索加密还有很大的可扩展空间:
<1>支持高级的查询:
本文涉及的查询都是简单的单个的关键字的查询,但是传统的数据库高级语言(SQL语言)却支持更为高级的布尔查询等查询模式,设计一种实现支持析取、合取范式的查询模式也很有必要;另外,模糊查询也可以和可搜索加密技术结合起来。
<2>支持变长关键字
这里略微提及两种支持变长关键字查询的方案:
i> 使用固定长度的、足够长的块,从而能够容纳所有的查询关键字;
ii>使用变长的关键字,但是在关键字中要包含关键字的字长信息;
<3>基于索引的方案
如前文所述,基于索引的方案在查询效率上是一般方案的数倍,但是在更新上却有很大的提升空间。 - 后记
这篇文章是可搜索加密的第一篇文章,对于后来的工作有很大的帮助.这里只是个人的一些看法的总结,如有错误欢迎大家指正!