本篇文章参考中国电信Teledb及OpenGauss源码和相关资料对全密态数据库进行简介。
概念
全密态数据库是专门处理密文数据的数据库系统。数据以加密形态存储在数据库服务器中,数据库支持对密文数据的检索与计算,而与查询任务相关的词法解析、语法解析、执行计划生成、数据存储都继承原有数据库能力。
在全密态数据库机制下,一个用户的业务流程如下图所示。
存在一个表,属性id与a1,其中a1为敏感字段,数据需要加密。
id
|
a1
|
1
|
0x3uh4323f
|
2
|
0x9fls3922o
|
3
|
0x78sue623
|
用户发起查询任务指令。用户发起的查询任务无需进行特殊化改造,对于查询中涉及的与敏感数据a1相关联的参数,在客户端按照与数据相同的加密策略(加密算法,加密密钥等)完成加密。参数加密完成后整个查询任务被变更成一个加密的查询任务并发到数据库服务端。查询得到的结果仍然为密文,并最终返回客户端进行解密。
全密态数据库的核心思想是:用户自己持有数据加解密密钥且数据加解密过程仅在客户侧完成,数据以密文形态存在于数据库服务侧的整个生命周期过程中,并在数据库服务端完成查询运算。
总体框架
-
密钥管理:生成加密密钥,提供加密算法。
-
客户端:
-
前端解析器:解析SQL语句为解析树statement,用于SQL语句预处理,识别替换需要加密的数据。
-
SQL预处理:根据加密信息匹配出SQL语句中是否含有需加密的数据,并记录加密的字段后位置,用于后续统一重写SQL语句。
-
加密重写SQL:根据预处理的结果重写SQL为加密后的语句。
-
缓存:保存加密元数据信息。
-
-
后端:
-
创建密钥时需保存密钥相关的元数据信息。
-
创建加密表时需保存表中加密列的元数据信息。
-
libpq客户端加密驱动
libpq是应用程序员使用PostgreSQL的C接口。libpq是一个库函数的集合,它们允许客户端程序传递查询给PostgreSQL后端服务器并且接收这些查询的结果。
客户端加密驱动自动加解密和自动解析,能够自动识别哪个字段需要哪个密钥,再自动找到密钥、自动加密。
加密驱动
PQexec:给服务器提交一条命令并且等待结果。
当客户端给服务端发送一条命令前,通过run_pre_query对发送命令进行预处理。首先通过前端解析器将发送的SQL解析出对应的statement。前端解析器只支持一部分语法解析,无法解析或解析异常的语句将跳过后续全密态流程,直接发送至后端。根据statement类型采取不同的预处理方式,识别SQL语句中需要加密的列和数据,并通过密钥管理提供的加密算法得到加密后的数据。最后进行SQL重写,将原SQL中的数据替换为加密后的数据,重组为一句新SQL,并提交至后端。
客户端接收到服务端的执行结果后,通过run_post_query,完成全密态相关的后续工作。当有增删加密数据时,需更新客户端缓存,当创建/删除密钥时,需更新本地密钥文件等。