接下来介绍CryptDB是如何在加密数据上执行SQL查询的。
在密态数据库中存在一个威胁,DBMS和管理员不可信,但应用程序和代理服务器是可信的。CryptDB令DBMS服务器在密文上执行SQL查询如在明文中一样。现有的应用程序不需要改变。除了包含运算符(如选择、投影、连接、总计和排序)的查询,DBMS的加密查询通常与原始查询相同,并在某些情况下使用修改后的操作符。
CryptDB的代理服务器存储一个主密钥MK、数据库图表及所有列的当前加密层。DBMS服务器能看到匿名图表(其中的表和列名称被含糊的标识符替换),加密的用户数据和CryptDB使用的一些辅助表。CryptDB还配备了有CryptDB特定用户定义函数的服务器,允许服务器在密文上做一些操作。
CryptDB查询处理包括四个步骤:
- 应用程序发出查询,并由代理服务器拦截并重写:使表名和列名匿名,并用最适合的加密方案加密(用密钥MK)查询中的常量。
- 代理服务器检查DBMS服务器是否应该在执行查询之前给密钥调整加密层,如果调整,在DBMS服务器上执行一个UPDATE,就要调用UDF来调整相应的列的加密层。
- 代理服务器将加密的查询转发到DBMS服务器,使用标准SQL(因为聚集或关键字搜索,偶尔调用UDF)。
- DBMS服务器返回查询结果(加密的),代理服务器解密并返回给应用程序。
CryptDB针对不同类型的字段会有不同的加密方案,CryptDB中称之为SQL感知加密。
- 随机性加密(RND):RND在CryptDB中提供最大安全性:自适应选择明文攻击的不可区分性(IND-CPA);该方案是概率性的,这意味着两个相等的值以压倒性的概率映射到不同的密文。另一方面,RND不允许在密文上执行有效计算。一个高效的RND架构,结合了CBC模式下的分组密码(如AES)与随机初始化向量(IV)。该方案中采用AES密码系统。
- 确定性加密(DET):DET的保密性较弱,然而,它依然提供了强大的安全性:仅当加密的值对应相同的数据值时,它产生泄漏,以确定相同明文产生相同密文。此加密层允许服务器执行相等性检查,也就是说它用字段相等性、连接相等性、GROUP BY、COUNT、DISTINCT等执行选择。在加密方案中,DET是一个伪随机置换,采用AES加密方案中的CMC模式,也就是两轮CBC,可以看作是一轮正向一轮反向,对于较小的值会被填充到64bit,对于较大的值会被填充到128bit。
-
保序加密(OPE):OPE允许根据它们的加密值建立数据元素之间的顺序关系,并不会泄漏数据本身。对于任意密钥K,如果 ,则 。因此,如果一个列用OPE加密,给定加密常量 和 (与范围 相对应),服务器可以执行范围查询。服务器也可以执行ORDER BY,MIN,MAX,SORT等。OPE加密方案相对于DET,保密性变弱了,因为OPE泄露了顺序。
-
同态加密(HOM):HOM是一种安全的概率加密方案(IND-CPA安全),允许服务器在加密数据上执行计算,最终结果由代理服务器解密。全同态加密很慢,而同态加密在一些操作上效率很高。为支持求和,实现了Paillier加密系统。将两个加密的值相乘,结果是加密值的总和,即 ,而执行的乘法是模上一些公钥值。为执行SUM,代理服务器将SUM替换为调用UDF执行同态加密的列的Paillier乘法。同态加密也可用于通过DBMS返回的合计和个数来计算平均值的过程。
-
关键字搜索(SEARCH):SEARCH用于在加密文本上执行搜索操作,如MySQL中的LIKE操作。实现了Song等人的加密协议;还将这个协议用在不同的方向上,这导致了更好的安全性保证。对于需要SEARCH的列,用标准分隔符将文本分割成关键字(或使用由模式开发指定的特殊关键字提取函数)。之后,删除重复的关键字,随机排列关键字位置,然后用Song等人的方案加密每个关键字,将每个关键字都填充到相同长度。SEARCH的安全性与RND接近:不论某个关键字在多个行中是否有重复,加密方案都不会泄漏给DBMS服务器,但是它泄漏了用SE加密的关键字的数量,攻击者可以估计不同或重复的关键字数量(例如,通过比较相同数据的SEARCH和RND的密文)。
CryptDB中很重要一个设计是可调的给予查询的加密,其可动态调整DBMS服务器上的加密层。CryptDB针对不同类型数据采用不同的加密策略,例如对于数值类型的数据,CryptDB不会将其通过SEARCH洋葱加密,字符串类型的数据不会通过ADD洋葱进行加密,因为字符串类型的字段不会做SUM或者AVG这样的操作。
对于每个洋葱的每个层,代理服务器使用相同密钥对相同列上的值加密,不同的密钥穿过表、列、洋葱及洋葱的层。在列中的所有值使用相同密钥,允许代理服务器在列上执行操作,而不必用单独的密钥计算每一行。跨列使用不同密钥可以防止服务器学习其他的关系。所有这些密钥都是由主密钥MK生成的。举个例子,对于表t,列c,洋葱o及加密层l,代理服务器使用密钥
CryptDB使用运行于DBMS服务器上的UDF,实现洋葱层的解密。
假设一个场景,用户向查询名字为Alice的用户的信息,从客户端发送了一条SQL请求:
SELECT * FROM Student WHERE sname='Alice';
当DBMS中的洋葱层位于执行查询所必需的层时,代理服务器就将查询转换为对这些洋葱进行的操作。特别是,代理服务器在一个查询中用相关的洋葱名替换列名,基于那个列上计算类的执行。例如,上述的SQL请求,用于做等值比较的sname列,将被替换为C2-Eq列。
代理服务器也要基于所使用的计算,用相应的洋葱加密后的常量,替换查询中的所有常量。例如,如果查询包含 ,那么代理服务器就依次应用所有与洋葱Eq(这时它还没有被从C2-Eq删除)相关的加密层加密 。
最后服务器用基于UDF的算子替换一些运算符。例如,SUM和+必须被替换为密文中执行HOM加的UDF的一个调用。等于和排序运算符(如=和<)不需要这些替换,并且可以在密文上直接被DET和OPE应用。
代理服务器转换完查询后,就将查询发送给DBMS服务器,接收查询的结果(包括加密的数据),应用相关的洋葱密钥解密结果,并将解密后的结果发送给应用程序。