可搜索加密1
本文是對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:KF×{0,1}??>KF新引入的f和方案1中提到的偽隨機函數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>基于索引的方案
如前文所述,基于索引的方案在查詢效率上是一般方案的數倍,但是在更新上卻有很大的提升空間。 - 后記
這篇文章是可搜索加密的第一篇文章,對于后來的工作有很大的幫助.這里只是個人的一些看法的總結,如有錯誤歡迎大家指正!
總結
- 上一篇: 引入的噪声程度:曝光时间,模拟增益,数字
- 下一篇: 2022 最新 Memcached 面试