Cryptdb原理概述(1)

Cryptdb[1]是MIT的CSAIL 在11年sosp上提出的, 其在數(shù)據(jù)庫上實現(xiàn)了同態(tài)加密技術(shù). 本文基于一些相關(guān)文獻, 以及對代碼的調(diào)研, 對該系統(tǒng)的實現(xiàn)原理以及相關(guān)的技術(shù)做介紹.

同態(tài)加密

加密是一種保證數(shù)據(jù)安全的方法, 但是數(shù)據(jù)加密以后, 對于數(shù)據(jù)進行操作就變的復(fù)雜了. 舉例來說, 我對兩個數(shù)字A和B進行了加密存儲, 分別變成了A'和B', 現(xiàn)在我們有一個計算兩個數(shù)的和的需求, 也就是需要計算A+B.那么一般來說, 我們需要拿到密鑰以及密文A'和B', 然后解密出原始的數(shù)據(jù)A和B, 進行加法計算, 獲得A+B=C, 然后對C進行加密變成C', 最后對加密結(jié)果進行存儲.

假設(shè)我們的數(shù)據(jù)存在服務(wù)器上, 客戶端給服務(wù)器發(fā)送請求來獲取數(shù)據(jù). 那么上述的過程就存在問題. 如果我們的數(shù)據(jù)在服務(wù)器端解密并且返回給客戶端, 那么服務(wù)器段就獲取了密鑰, 從而存在服務(wù)器上的加密數(shù)據(jù)的安全性不能的到保證. 如果我們把密文拉到客戶端, 然后由客戶端進行加法計算, 那么就無法利用服務(wù)端的計算能力, 服務(wù)器只承擔(dān)存儲的功能, 這在計算量比較大的時候, 是無法實現(xiàn)的.

同態(tài)加密[3]的出現(xiàn), 解決了上述問題. 同態(tài)加密算法允許對密文直接進行計算, 獲得加密的結(jié)果. 這樣, 對于上述的例子, 我們可以直接從A',B'獲得加密的計算結(jié)果C', 然后把C'返回給用戶. 這樣, 我們不會把密鑰暴露給服務(wù)器, 又可以利用服務(wù)器的計算能力, 客戶端只要負(fù)責(zé)對數(shù)據(jù)進行解密就可以了.

09年的時候, Gentry[2]提出了全同態(tài)加密算法, 也就是可以對密文進行任意的操作. 這篇文章證明了全同態(tài)加密是理論上可行的, 但是全同態(tài)加密復(fù)雜度很高, 不能在實際系統(tǒng)中使用.

但是, 如果我們只是要求部分的加密操作, 而不是想對加密數(shù)據(jù)進行任意的操作, 是不是有復(fù)雜度低的算法, 可以滿足實際系統(tǒng)的需求呢? Cryptdb就是基于這種思想提出的, 對于數(shù)據(jù)庫來說, 常見的操作不多, 如果只是支持一部分的加密操作, 復(fù)雜度是可以接受的.

Cryptdb

Cryptdb 希望在數(shù)據(jù)庫系統(tǒng)上實現(xiàn)加密運算, 達到的效果是: 存在數(shù)據(jù)庫中的數(shù)據(jù)全部是加密的, 但數(shù)據(jù)庫依然可以對加密的數(shù)據(jù)執(zhí)行用戶的SQL語句, 返回加密的數(shù)據(jù)給用戶, 然后用戶可以對返回的結(jié)果進行解密, 獲得明文的數(shù)據(jù). 其基于的思想是, 全同態(tài)加密難以實用, 但對于數(shù)據(jù)庫來說, 只要求幾種常見的運算, 不需要任意的運算. 舉例來說, 對于普通的select 語句中的where條件, 需要比較相等的運算. 對于order by, 需要比較大小的運算, 對于一些函數(shù)如SUM, 需要加法運算. 如果只是支持這些常見的操作, 就可以在吞吐量下降20%的開銷的情況下, 滿足大部分的SQL查詢.

系統(tǒng)組成模型

Cryptdb系統(tǒng)可以分為三個部分: Client, MySQL-Proxy, 以及MySQL-SERVER. 其主要邏輯實現(xiàn)在MySQL-Proxy, 對于MySQL-SERVER則是通過UDF來完成一些輔助的功能.

MySQL-Proxy能夠獲取用戶發(fā)送的SQL請求, 并進行中間的處理, 然后將處理以后的請求發(fā)送給MySQL-SERVER. 請求在服務(wù)器上執(zhí)行完成以后, 結(jié)果也會經(jīng)過MySQL-Proxy的處理, 然后返回給客戶端.

所以, Cryptdb的基本想法是, 在MySQL-Proxy處對用戶的SQL的關(guān)鍵字段請求進行加密,并且依然保證SQL語句的語法要求, 然后發(fā)送給MySQL-SERVER, 處理完成以后, MySQL-SERVER返回加密的數(shù)據(jù)給MySQL-PROXY, 在Proxy處解密, 然后返回給客戶端.

加密查詢的支持

有了上面的系統(tǒng)模型, 我們已經(jīng)可以對插入的數(shù)據(jù)進行加密, 下面通過例子說明如何在這種條件下實現(xiàn)加密數(shù)據(jù)的查詢.

假設(shè)我們有如下的數(shù)據(jù)表:

Name Age GPA
Tom 12 85
Jerry 13 87
Alice 14 88
Jack 13 85

通過加密, 我們獲得了同等條件的如下表格.

Name Age GPA
x?!*~/^^ (┐「ε:) (:3 」∠) (? ??_??)? (?????)? ?? ヽ
( ?◇?)? ヽ(′Д`)? (`?ω?′) (′?ω?`) (′?`*) (^?^)
(╯‵□′)╯︵┻━┻ (ノ`Д′)ノ  ̄工 ̄lll) (﹁"﹁)
(′Д`) o(*≧▽≦)ツ []( ̄▽ ̄)*

對于這樣一張加密以后的數(shù)據(jù)表, 即使別人獲取了數(shù)據(jù)庫內(nèi)容, 在沒有密鑰的情況下也不能知道里面的數(shù)據(jù)是什么. 那么, 對于通過認(rèn)證的用戶, 如何正確處理用戶的請求? 比如用戶現(xiàn)在需要所有GPA大于87的學(xué)生的信息, 如何在上面的表格中完成查找, 且不對MySQL-SERVER 進行代碼上的修改?

我們有如下的原始語句:

SELECT * from student where GPA > 87;

這個語句由客戶端發(fā)出, 首先到達MySQL-Proxy, 由于數(shù)據(jù)已經(jīng)被加密了,所以如果這個語句直接發(fā)到數(shù)據(jù)庫上執(zhí)行, 是不能返回正確的結(jié)果的, 在MySQL-Proxy處, 首先要進行處理. 觀察上面的表格, 我們發(fā)現(xiàn)87加密以后的結(jié)果是: (′?`*) (^?^) 所以, 在MySQL-Proxy處, 對SQL語句進行處理, 將87進行加密, 加密以后的SQL語句就變成了:

 SELECT * from student where GPA  >(′?`*) (^?^)

這樣, MySQL-SERVER會執(zhí)行修改以后的SQL語句, 并且返回加密后的結(jié)果, MySQL-Proxy獲得加密以后的結(jié)果, 解密, 然后返回給客戶端.

上面的過程涉及一個問題, 就是GPA >(′?`*) (^?^), 如何能夠保證返回GPA大于87的所有數(shù)據(jù). 這就需要用到OPE(order preserving encryption). 這種算法本身能夠保證, 加密前后, 數(shù)據(jù)的相對順序保持一致. 也就是說, 加密前有A<B, 那么加密后也保證A'<B'. 上面例子中的算法顯然不滿足OPE的性質(zhì), 所以實際的處理不能基于上面的算法.

能夠處理 >的請求以后, 自然也可以處理 = 的請求了. 事實上, OPE的算法雖然沒有暴露明文, 但是數(shù)據(jù)的相對順序暴露給了攻擊者, 所以安全性較低. 如果僅僅需要處理Where GPA = 87的情況, 可以對數(shù)據(jù)列采用DET方法加密, 這種算法保證相同的明文加密可以的到相同的密文, 但是并不保證相對順序不變, 這樣安全性更高.

如果需要支持加法或者乘法操作, 則需要使用HOM也即同態(tài)加密. 數(shù)據(jù)列通過這類算法加密以后, 就可以在加密的情況下進行加法和乘法的操作, 并且返回結(jié)果給MySQL-Proxy, 然后MySQL-Proxy可以將數(shù)據(jù)解密返回給客戶端.

洋蔥存儲模型

上面的例子中, OPE算法可以支持大小比較, DET算法可以支持兩個數(shù)是否想等的比較, HOM可以支持加法. 但是沒有一種算法可以同時支持多種操作, 所以依然是上面的表格, 如果我們需要同時支持加法和大小比較的操作, 就必須另外想辦法處理. 在論文中提出的方法是多洋蔥模型, 簡單來說, 就是對于GPA這列數(shù)據(jù), 用不同的算法存儲多次, 需要哪種操作, 就選擇哪種算法加密的列進行處理.

下面給出論文中的例子:

如圖所示, 原始的Employees表有兩列, 上面的四個層次化的洋蔥模型, 分別可以支持不同的加密操作. 其中Onion Eq支持相等比較的操作, Onion Ord支持大小比較, Onion Add支持加法, 而Onion Search 支持LIKE的搜索. 所以為了支持不同的操作, 原始的列ID被存儲成了四列, 一個洋蔥存一列. 這樣, 要對ID進行加法操作, 就轉(zhuǎn)換成對加密表的C1-Add列進行操作, 要對ID列進行排序操作, 則轉(zhuǎn)換成對C1-Ord列進行操作, 這個轉(zhuǎn)化就是通過MySQL-Proxy來完成. 由于ID是整數(shù), 不需要支持search 操作, 所以也就沒有進行存儲.

還有一個問題, 就是為什么要多層次的加密? 這主要是為了保證數(shù)據(jù)的安全性, 同時保證能夠支持加密操作,是一種折中的設(shè)計. 一開始所有的洋蔥都是處于RND層次, 也就是加密等級最高的層次. 在這個層次, 沒有DET和OPE的性質(zhì), 不能支持相應(yīng)的操作. 如果某一次用戶需要OPE或者DET的行為, 就對這一列數(shù)據(jù)進行解密, 解密到DET或者OPE的層次, 然后再進行處理. 這個剝洋蔥的過程, 可以由MySQL-SERVER來完成, 因為這種解密不會暴露明文給服務(wù)器.

所以, 對于上述的表格, 如果我們執(zhí)行如下的插入語句:

INSERT INTO Employees values(1,"zhangfei");

則會根據(jù)洋蔥模型擴展成:

INSERT INTO Employees values(C1-IV,C1-EQ,C1-ORD,C1-ADD,C2-IV,C2-EQ,C2-ORD,C2-SEARCH);

每個字段都是經(jīng)過層次化的加密的. 需要注意的是, 在Cryptdb的最新實現(xiàn)中, SEARCH并沒有被實現(xiàn).

總結(jié)

Cryptdb是一種數(shù)據(jù)庫加密代理, 其截獲用戶的SQL語句, 進行加密操作, 然后給數(shù)據(jù)庫發(fā)送加密以后的SQL語句, 這樣數(shù)據(jù)庫服務(wù)器不能獲得明文數(shù)據(jù). 其通過特殊的加密算法, 使得數(shù)據(jù)庫服務(wù)器能夠?qū)用軘?shù)據(jù)進行處理, 返回加密的結(jié)果. 在數(shù)據(jù)存儲上, 做了一定的優(yōu)化, 采用了洋蔥加密模型, 一開始處于最強的加密層次, 在需要支持某類操作的時候, 才進行部分解密, 到達能夠支持特定操作的層次.

本文是Cryptdb的設(shè)計與實現(xiàn)的第一篇,后續(xù)內(nèi)容會不斷在我的博客 https://yiwenshao.github.io/ 更新, 也可以關(guān)注我的簡書或CSDN博客, 內(nèi)容會做同步.

相關(guān)文獻

[1]. Popa, Raluca Ada, et al. "CryptDB: protecting confidentiality with encrypted query processing." Proceedings of the Twenty-Third ACM Symposium on Operating Systems Principles. ACM, 2011.
[2]. Gentry, Craig. "Fully homomorphic encryption using ideal lattices." STOC. Vol. 9. No. 2009. 2009.
[3]. wiki 同態(tài)加密


原始鏈接:yiwenshao.github.io/2017/05/01/Cryptdb原理概述/
文章作者:Yiwen Shao
許可協(xié)議:** Attribution-NonCommercial 4.0
轉(zhuǎn)載請保留以上信息, 謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轧房,一起剝皮案震驚了整個濱河市拌阴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奶镶,老刑警劉巖迟赃,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異厂镇,居然都是意外死亡纤壁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門捺信,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酌媒,“玉大人,你說我怎么就攤上這事∶胱桑” “怎么了喇辽?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雨席。 經(jīng)常有香客問我菩咨,道長,這世上最難降的妖魔是什么舅世? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任旦委,我火速辦了婚禮,結(jié)果婚禮上雏亚,老公的妹妹穿的比我還像新娘缨硝。我一直安慰自己,他們只是感情好罢低,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布查辩。 她就那樣靜靜地躺著,像睡著了一般网持。 火紅的嫁衣襯著肌膚如雪宜岛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天功舀,我揣著相機與錄音萍倡,去河邊找鬼。 笑死辟汰,一個胖子當(dāng)著我的面吹牛列敲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帖汞,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼戴而,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翩蘸?” 一聲冷哼從身側(cè)響起所意,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎催首,沒想到半個月后扶踊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡翅帜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年姻檀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涝滴。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡绣版,死狀恐怖胶台,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杂抽,我是刑警寧澤诈唬,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站缩麸,受9級特大地震影響铸磅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杭朱,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一阅仔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弧械,春花似錦八酒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至画饥,卻和暖如春衔瓮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抖甘。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工热鞍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衔彻。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓碍现,卻偏偏與公主長得像,于是被迫代替她去往敵國和親米奸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法爽篷,類相關(guān)的語法悴晰,內(nèi)部類的語法,繼承相關(guān)的語法逐工,異常的語法铡溪,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)泪喊,斷路器棕硫,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 1.面對threat 1 解決方案:通過把對數(shù)據(jù)庫進行的操作(選擇,連接袒啼,投影等操作)進行特殊處理哈扮,使得這些操作能...
    三口一個瓜閱讀 2,262評論 0 0
  • 需要原文的可以留下郵箱我給你發(fā)纬纪,這里的文章少了很多圖,懶得網(wǎng)上粘啦 1數(shù)據(jù)庫基礎(chǔ) 1.1數(shù)據(jù)庫定義 1)數(shù)據(jù)庫(D...
    極簡純粹_閱讀 7,401評論 0 46
  • 7月份的計劃被史老師拿去做了案例,在線上課和線下沙龍課都講了靶庙,哈哈哈哈哈哈哈哈问畅!不是什么好的案例,好尷尬六荒。 為啥會...
    我是葉翕閱讀 626評論 0 5