**图 6** 密态等值查询总体方案

116 阅读2分钟

图 6 密态等值查询总体方案

从总体流程上来看,数据在客户端完成加密,以密文形式发送到openGauss数据库服务侧,即需要在客户端构建加解密模块。加解密模块依赖密钥管理模块,密钥管理模块生成根密钥(RK, Root Key)和客户端主密钥(CMK,Client Master Key)。有了CMK,可以通过SQL语法定义列加密密钥(CEK,Column Encryption Key),CMK由RK加密后保存在密钥存储文件(KSF,Key Store File)中,CMK和RK由KeyTool统一管理;CEK则由CMK加密后存储在服务端(加密算法使用对称加密算法AES256和国密算法SM2)。

客户端依据生成的CEK来对数据进行加密,数据加密算法主要使用对称加密算法AES算法(包括AES128和AES256)和国密算法SM4。加密后的数据会存放在数据库服务端,经过密文运算后服务端返回密文结果集,并在客户端完成最后的解密,获取最终结果。

用户根据业务需要对数据定义加密属性信息(被加密的列被称之为加密列),对于不需要加密的数据则按照原有明文格式发送至服务端。当查询任务发起后,客户端需要对当前的Query进行解析,如果查询语句中涉及加密列,则对对应的列参数(加密列关联参数)也要进行加密(这里说的加密均需要为确定性加密,否则无法支持对应的查询);如果查询语句中不涉及加密列,则直接发送至服务端,无需额外的操作。

在数据库服务侧,加密列的数据始终以密文形态存在,整个查询也在密文形态下实现。对于第一阶段密态等值查询解决方案,需要采用确定性加密,使得相同的明文数据获得相同的密文,从而支持等值计算。