1.面對threat 1
解決方案:通過把對數(shù)據(jù)庫進(jìn)行的操作(選擇,連接,投影等操作)進(jìn)行特殊處理,使得這些操作能夠執(zhí)行在已加密的數(shù)據(jù)上
這種解決方案存在的一大問題就是胆剧,目前還沒有研究出一種加密方式,使得任何執(zhí)行在數(shù)據(jù)庫上的操作醉冤,都能正確運行在加密過的數(shù)據(jù)上秩霍。因此就意味著需要在數(shù)據(jù)庫服務(wù)端存放多種經(jīng)過不同方式加密的數(shù)據(jù)。當(dāng)用戶執(zhí)行特定操作時蚁阳,Mysql-proxy就會截獲操作請求并使用使用特定的加密方式對該操作進(jìn)行加密铃绒,使得該操作能夠正確運行在Server端。
以下是proxy采用的幾種加密算法
(1)Random (RND).RND是最安全的一種加密方法,即使是兩個相同的明文,也可以映射到不同的密文上面省有。這種方法可以用來抵抗自適應(yīng)選擇明文攻擊轧邪,但是缺點就是很難在密文上進(jìn)行操作界弧。實現(xiàn)方法有AES等,這里不詳說。
(2)Deterministic (DET).DET的安全性會相對弱一點,相同的明文映射到相同的密文中灾票,所以可以很方便地對密文進(jìn)行操作,例如相同值查詢等茫虽,但是對于不同的表刊苍,相同的列,使用的key不一定相同濒析。
(3)Order-preserving encryption
(OPE). OPE允許數(shù)據(jù)的順序查找正什,它保證當(dāng)x
(4)Homomorphic encryption (HOM).HOM類型的加密可以使得一些計算可以直接在加密后的數(shù)據(jù)上面,例如HOMK(x)·HOMK(y) = HOMK(x + y)号杏,這類算法可以保證一些數(shù)學(xué)運算例如SUM等操作婴氮。
(5)Join (JOIN and OPE-JOIN).這種加密可以支持join運算,包括范圍join以及等值join(自然連接)盾致。因為在DET中莹妒,相同的列,在不同的表中可以用不同的key來加密绰上,所以相同的值在不同的表加密后的值不一樣。所以此類算法就是為了使加密后的列表能正確地進(jìn)行連接渠驼。
JOIN-ADJ是一種【對輸入確定性的函數(shù)】(就是相同的明文對應(yīng)的一定是相同的JOIN-ADJ值)蜈块,同時也是【可調(diào)整的利用秘鑰加密之后的hash值】(意思是這個hash值由對應(yīng)的加密算法生成,而且?guī)в锌烧{(diào)整的附加屬性的)。
JOIN-ADJ怎么使用百揭?
首先JOIN-ADJ是不可置反的爽哎。
因此利用了JOIN-ADJ的JOIN加密方案由如下所示:
JOIN(v) =
JOIN-ADJ(v) || DET(v)(這里的||符號起到連接字符串的作用)
在這個結(jié)構(gòu)之下,CryptDB通過比較JOIN-ADJ(v)來實現(xiàn)比較屬性名是否相同器一,通過解密DET(v)來獲取被加密的屬性值课锌。
當(dāng)每次proxy悉知了有新的JOIN操作到來,它會向DBMS傳遞一個key使得DBMS可以調(diào)整兩個列之間的JOIN-ADJ值祈秕,使得他們的值趨于一致(就是變成一樣的)(當(dāng)然必須明文要是相同的才行)渺贤。一旦他們經(jīng)過了調(diào)整,之后對于這兩個列的JOIN操作就無需再次調(diào)整他們的JOIN-ADJ值了请毛,因為他們會將這個值保留志鞍,直到需要作出改變?yōu)橹埂?/p>
顯然,這里提到的JOIN操作是具有可傳遞性的方仿,AB固棚、AC可以實現(xiàn)JOIN,那么BC同樣可以仙蚜。這樣ABC形成了一個所謂的“可傳遞組”的概念此洲。
作者對于可以實現(xiàn)JOIN操作的列對的管理是這樣實現(xiàn)的:(表名+列名),使得所有在“可傳遞組”中的列能共享同樣的join-base委粉。
CryptDB通過選擇兩列中字母表順序第一的列來作為基準(zhǔn)呜师,是為了防止發(fā)散,通過多次join之后艳丛,最后可以達(dá)到一個穩(wěn)定的匣掸,有共同join-base的狀態(tài),這樣就形成一個transition組氮双,比較像算法中的迭代法碰酝。
(6)Word search (SEARCH).這類加密方法允許對密文進(jìn)行像sql語句中的like語句之類的操作。但是cryptdb只支持一些完整的詞匯匹配戴差,不支持任意的相似匹配送爸。Server可以知道是否有信息可以匹配到一個token,但是它無法得知這個token的內(nèi)容以及匹配到的信息的明文暖释。
通過上述幾種加密算法袭厂,明文數(shù)據(jù)在服務(wù)器端被加密保存成對應(yīng)密文數(shù)據(jù)。當(dāng)接收到proxy加密后的操作請求球匕,就會針對對應(yīng)操作處理并返回密文數(shù)據(jù)纹磺。
但是這種通過將幾種加密方式加密后的密文全部保存在客戶端的做法存在的一大問題是,使用多種加密方式在一定程度暴露其關(guān)鍵信息亮曹,使得安全性降低橄杨。而為了解決這個問題秘症,CryptDB采用了adjustable-query-based encryption的可調(diào)整的基于查詢的方式,當(dāng)需要對某一列相同值進(jìn)行查詢時式矫,就對這一列進(jìn)行DET加密乡摹。而當(dāng)需要執(zhí)行某種操作時,就會在proxy端使用相應(yīng)類型的加密算法后發(fā)送給服務(wù)端采转。
以上的實現(xiàn)需要在提前知道用戶所需要執(zhí)行的所有操作的情況下才能被完全滿足聪廉。
但是實際上是很難提前知道你所要做的所有操作。
這時候就需要洋蔥模型故慈,把數(shù)據(jù)包成一個洋蔥板熊,如下圖,越外層的加密越安全惯悠,而越靠近明文的層提供的功能就越多邻邮。所以在一開始,先通過最外層的加密類型克婶,把明文加密成密文保存在客戶端筒严,當(dāng)要用到相應(yīng)操作的時候,如果當(dāng)前的所擁有的密文無法滿足其操作情萤,就通過一系列算法把洋蔥剝開鸭蛙,提供相應(yīng)的密文進(jìn)行操作,當(dāng)下一次要進(jìn)行同樣操作的時候筋岛,這時候不需要剝洋蔥娶视,只需要用上次的密文進(jìn)行操作即可。
對于每一個洋蔥睁宰,同一列的明文數(shù)據(jù)通過同一個key進(jìn)行加密肪获,但是對于不同表、不同列使用不同的key進(jìn)行加密柒傻。
(如圖孝赫,ID列和Name列各自分成了4個洋蔥)
CryptDB使用自定義函數(shù)進(jìn)行層的解密,如果要只想相同值查找的時候红符,可以使用名為DECRYPT_RND的自定義函數(shù)進(jìn)行解密:
解開一層之后青柄,以后對這一列進(jìn)行相同值查找的時候,就可以直接使用這個密文進(jìn)行操作预侯。
2.面對threat 2
解決威脅二
當(dāng)proxy和application端也會受到攻擊的時候致开,需要保證泄露的數(shù)據(jù)盡可能少。
CryptDB提供了以下機(jī)制來解決威脅二:
首先是要向共享數(shù)據(jù)提供訪問控制策略萎馅。CryptDB通過ENC_FOR以及SPEAK_FOR語句提供注釋的功能双戳,實現(xiàn)了對共享數(shù)據(jù)的訪問權(quán)限進(jìn)行限制。這一過程形成的keychain保證了當(dāng)系統(tǒng)受到攻擊的時候糜芳,只有登陸中的用戶的數(shù)據(jù)會被泄露飒货,未登陸的用戶的數(shù)據(jù)不會被泄露千诬。
具體實現(xiàn)方式
CryptDB首先需要對主體(principal)的類型進(jìn)行定義,例如用戶膏斤,用戶組等等。有兩種主體邪驮,一種是external principal莫辨,另一種是internal principal。
對于external
principal毅访,需要提供密碼給proxy沮榜,才能得到相應(yīng)principal的權(quán)限。而internal principal獲得權(quán)限需要在系統(tǒng)中對其進(jìn)行授權(quán)喻粹。
CryptDB使用的是自己定義的principal而不是現(xiàn)成的DBMS的principles蟆融。因為現(xiàn)成的principle提供的定義細(xì)粒度不夠,不足以滿足開發(fā)的需求守呜。其二CryptDB在principle之間需要實現(xiàn)顯式的特權(quán)授予(SPECK_FOR)型酥,這也是現(xiàn)有的DBMS principle不能夠提供的!
系統(tǒng)為每個principal都隨機(jī)生成一個key查乒,并且把key用相應(yīng)用戶的密碼加密后弥喉,放在external_keys表里面,這樣當(dāng)用戶之類的改變密碼的時候玛迄,私密數(shù)據(jù)的key可以不用改變由境,只需要在external_keys表中對相應(yīng)的principal的key用用戶的新密碼進(jìn)行重新加密。
當(dāng)external主體登陸進(jìn)系統(tǒng)之后蓖议,系統(tǒng)會把該用戶名以及密碼放在一個表cryptdb_active中虏杰,密碼用于解密相應(yīng)主體的key以讀取相關(guān)數(shù)據(jù)。Proxy會把這個表讀進(jìn)內(nèi)存里面勒虾,server端不會得到這個表纺阔,并且proxy攔截一切對該表的訪問。如果用戶沒有登陸从撼,就不會出現(xiàn)在此表中州弟,意味著即使proxy受到攻擊,表里面的內(nèi)容泄露了低零,未登錄用戶的數(shù)據(jù)大部分(可能會出現(xiàn)處于同一個principal的人登陸之后泄露數(shù)據(jù)的情況)不會被泄露婆翔,因為密碼不在表上面,這樣保證了未登錄用戶的數(shù)據(jù)掏婶。
但是有一些特例啃奴,例如管理員之類的可訪問數(shù)據(jù)比較大(權(quán)限很高),很容易會造成大量數(shù)據(jù)的泄露雄妥,所以管理員賬號不能隨便記錄在cryptdb_active表里面最蕾,如果管理員要以普通身份登陸的時候依溯,就需要另外分離出一個有相應(yīng)權(quán)限限制的賬號,寫入cryptdb_active表中瘟则,這樣可以在大部分時間里防止大量數(shù)據(jù)的泄露黎炉。
CryptDB使用兩種語句對敏感數(shù)據(jù)進(jìn)行注釋:
(1)在表格中對表項用ENC_FOR語句對數(shù)據(jù)進(jìn)行注釋實現(xiàn)對數(shù)據(jù)的訪問控制。A ENC_FOR B(A是數(shù)據(jù)醋拧,B是主體)慷嗜,意味著只有主體B可以訪問數(shù)據(jù)A,ENC_FOR的實現(xiàn)原理是用主體B的key對數(shù)據(jù)A進(jìn)行加密丹壕。
(2)利用SPEAK_FOR語句對表格進(jìn)行注釋庆械,給一個主體授予另一個主體的權(quán)限。這種做法的格式為(a x) SEPAK_FOR (b y),其中x和y為主體類型菌赖,a和b是主體缭乘。意思是x類型的主體a有y類型的主體b的權(quán)限,b能訪問的內(nèi)容琉用,a也有權(quán)限訪問堕绩。
SPEAK_FOR的實現(xiàn)原理是用主體a的key對主體b的key進(jìn)行加密,當(dāng)需要訪問相應(yīng)數(shù)據(jù)的時候辕羽,可以通過主體a的key對主體b的key進(jìn)行解密逛尚,然后通過主體b的key對相應(yīng)數(shù)據(jù)進(jìn)行訪問。當(dāng)主體A通過SPEAK_FOR語句與主體B相連的時候刁愿,主體B的key會用主體A的key加密绰寞,然后放在一個特殊的表access_key表上面。但是數(shù)據(jù)的加密在共享數(shù)據(jù)雙方都在線的情況下采用對稱密鑰(加密和解密的密鑰相同)進(jìn)行加密铣口,而當(dāng)某一個主體沒有登陸進(jìn)系統(tǒng)的時候滤钱,無法得到該主體的symmetric key,所以這個時候會采用公鑰加密數(shù)據(jù)并保存脑题,當(dāng)主體再次登錄的時候使用自己的私鑰進(jìn)行解密件缸,獲得數(shù)據(jù)。多個SPEAK_FOR就形成一條key chain叔遂,要找某個數(shù)據(jù)的時候他炊,只需要順著key chain,從用戶密碼已艰,一直找到要找的數(shù)據(jù)為止痊末。
每當(dāng)敵方想要通過更改SPEAKS_FOR來窺探隱私信息的時候,CryptDB的機(jī)制告訴我們哩掺,需要對access_keys表格進(jìn)行相應(yīng)的更改凿叠,想要更改這個表格必須獲得被授權(quán)principle的key,這就意味著只有這個principle登錄的時候,敵方才能獲取相應(yīng)的key從而對這個principle的私密信息進(jìn)行窺探盒件。
1.極簡密碼學(xué),by曾兵
2.CryptDB.Popa, R. A., et al. (2011). CryptDB: protecting confidentiality withencrypted query processing. Proceedings of the Twenty-Third ACM Symposium onOperating Systems Principles. Cascais, Portugal, ACM: 85-100
3.Guidelines for Using the CryptDB SystemSecurely,https://eprint.iacr.org/2015/979
4.CryptDB項目主頁:http://css.csail.mit.edu/cryptdb/,
5.CryptDB發(fā)明人主頁:https://people.eecs.berkeley.edu/~raluca/